【问题标题】:Format a SQL statement, introducing my numbered parameters格式化SQL语句,引入我的编号参数
【发布时间】:2018-10-10 17:10:16
【问题描述】:

我有以下查询字符串:

INSERT INTO cibi ([nome], [Zuccheri_100g], [tipo], [Nome_EN], [Nome_DE],[Nome_ES], [DefaultAmt])
VALUES ('{1}', {2}, {3}, '{4}', '{5}', '{6}', {7})

现在我有一个名为values 的字符串列表,我想将其替换为数字。我应该使用什么代码?我应该使用替换吗?

谢谢

【问题讨论】:

  • 你用什么语言写这个?
  • C# 视觉工作室 2018
  • 这更多地取决于您的 ORM 而不是您的 SQL 表达式。您使用哪个框架或库来执行此插入?
  • 您应该使用这种“手动构建”您的 SQL 语句的方法。您的系统将对 SQL 注入(网络上的 OWASP #1 漏洞)完全开放。您必须改用参数化查询并正确设置参数值
  • 你想在这里使用参数绑定。尝试使用replace() 滚动您自己的绑定将导致您走上一条黑暗而痛苦的道路。 Read here how to parameterize your query in C# with sql server and bind to those parameters。这很容易,并且可以让您免于 sql 注入。习惯性地使用此方法编写所有 sql(需要参数)。如果您不使用sql-server,那么您使用的任何 RDBMS 以及它在 C# 中的库都应该支持这种开箱即用的某种形式。

标签: c# sql replace


【解决方案1】:

按照 marc 和 JNevill 的建议,在编写查询字符串时使用 sql 参数。我假设您的 values 变量始终是一个 7 元素的字符串数组

using System.Data;
using System.Data.SqlClient;

DataTable myDataTable = new DataTable();

using (SqlConnection sqlConnection = new SqlConnection(.....)
{
    using (SqlCommand sqlCommand = new SqlCommand())
    {
        sqlCommand.Connection = sqlConnection;
        sqlCommand.CommandType = CommandType.Text;

        sqlCommand.Parameters.AddWithValue("@V0", values[0]);
        sqlCommand.Parameters.AddWithValue("@V1", values[1]);
        sqlCommand.Parameters.AddWithValue("@V2", values[2]);
        sqlCommand.Parameters.AddWithValue("@V3", values[3);
        sqlCommand.Parameters.AddWithValue("@V4", values[4]);
        sqlCommand.Parameters.AddWithValue("@V5", values[5]);
        sqlCommand.Parameters.AddWithValue("@V6", values[6]);

        string queryStr = "INSERT INTO cibi ([nome], [Zuccheri_100g], [tipo], [Nome_EN], [Nome_DE],[Nome_ES], [DefaultAmt]) VALUES (@V0, @V1, @V2, @V3, @V4, @V5, @V6)";

        sqlCommand.CommandText = queryStr;
        sqlConnection.Open();
        SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();
        myDataTable.Load(sqlDataReader);
        sqlConnection.Close();
    }
}

【讨论】:

  • 请注意,使用键盘将在代码完成后自动关闭您的连接。了解这个隐藏的功能很重要。
  • sqlConnection.Close() 语句关闭连接。 using 关键字处理 sqlConnectionsqlCommand 对象。 using 关键字有两个主要用途: #2:作为语句,当它定义一个对象将被释放的范围时using (C# Reference)
  • @Juan:我很抱歉 - 我收回了。我运行了 Visual Studio 2017 代码分析,它警告我 using 语句和 sqlConnection.Close() 语句的组合。警告说:Warning CA2202 Object 'sqlConnection' can be disposed more than once in method 'DataAccessLayer.GetDbTableList()'. To avoid generating a System.ObjectDisposedException you should not call Dispose more than one time on an object.。当我删除我的 sqlConnection.Close() 语句时,这个警告就会消失。那么,Close 语句似乎也可以处理该对象?
  • 嗨@Nova 我也试图获得有关此的可靠信息。事情是在sql连接中,当您在dispose代码中对此类对象调用dispose时,您可以找到close调用,我使用dotnetpeek查看了sqlconnection类,您可以在其中找到dispose和close的代码称呼。请在此处找到图片drive.google.com/open?id=15b8_stSOMEccHtZSVGsJQEMWLwu99agB 此对话很有帮助,因为可以帮助他人,谢谢。我也会看看代码分析。
  • 关于close方法是否调用dispose,这是正确的。在 close 方法中,另一个方法称为 CloseConnection,在此方法中调用 dispose。您可以使用 jetbrain donet peek 查看所有代码。打开 sql.data.sqlclient 库并转到 sqlconnection 然后转到 close 方法,您可以看到代码并可以使用 go to declaration 来导航调用。
猜你喜欢
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多