c# - SqlCommand 参数与 String.Format

标签 c# sql parameters command

<分区>

我一直在互联网上搜索,但我似乎找不到任何可以解释我的问题的东西(可能是我没有使用正确的搜索字符串),所以我在这里发帖希望有人可以帮我解决这个问题。 (我的程序是用C#写的,使用Visual Studio 2010)

我注意到在 C# 中,有多种构造 SQL 命令的方法。

SqlConnection connection = GetAndOpenConnection(); //function containing connection string and open connection
SqlCommand command = connection.CreateCommand();

到目前为止,我没有问题。我遇到的问题是 CommandText .我在我的代码中使用了几个不同的命令( SELECT/INSERT/UPDATE/DELETE ),但让我们使用 SELECT例如。

//Example 1:
command.CommandText = String.Format("SELECT * FROM myTable WHERE name = '{0}'", "bob");

//Example 2:
command.CommandText = "SELECT * FROM myTable WHERE name = @myName";
command.Parameters.Add(new SqlParameter("myName", "bob"));

以上两个例子有什么区别? (性能明智/结构明智/等)

我问的原因是因为在同一个 .cs 文件中,当我使用示例 2 中的方法时,有时代码可以正常工作,有时却不能,然后我最终会像示例 1 中那样制作所有内容,每次都有效。

使用这两种方法是否有显着的 yield /损失?哪种方法更适合完成这样的任务?

附加问题

好的,所以我认为方法 2 是更合适的方法。

但是,如果我使用方法2,就会出现问题。

我有一个循环遍历 List<string> names .在循环中,当我使用方法 2 并添加名称作为参数时,出现错误提示该参数已存在且无法添加。

我该如何解决这个问题?

List<string> names = new List<string> {"adam", "bob", "john"};
foreach(string name in names)
{
    command.CommandText = "SELECT * FROM myTable WHERE name = @myName";
    command.Parameters.Add(new SqlParameter("myName", name));
    reader = command.ExecuteReader();

    while(reader.Read())
    {
        //loop through each cell and print on the Console
    }
}

此外,我知道有人提到在参数中它应该是 "@myName"而不是 "myName" .我记得遇到过这个问题,因为我对使用哪种方式感到困惑,不得不对其进行测试。 "@myName"不适合我,但 "myName"是的,这就是我现在仍在使用方法 2 的部分代码中的情况。我使用的是 .Net 4.0,不知道这是否会产生影响。

最佳答案

存在防止 SQL 注入(inject)的参数。例如,考虑一下 string.Format 如果不是 bob 而是包含 1' 的 TextBox1.Text 会发生什么;删除表 myTable;'.

如果您可以完全控制参数,那么 SQL 注入(inject)是不可能的,就像您使用字符串文字作为参数的情况一样。但是,您永远不知道您的代码将来会发生怎样的变化,因此根据经验,您应该始终坚持使用更安全的参数方法。

如果您在使用第二种方法时遇到一些特殊问题 - 搜索并张贴在这里,很可能已经有解决方案了。例如,在您的代码片段中,实际参数名称是带有 @ 符号的 @myName,这就是应该提供给 SqlParameter 构造函数的内容。

更新。在您的附加问题中,问题恰好在于参数命名 - 它应该是 @myName:

command.Parameters.Add(new SqlParameter("@myName", name));

此外,您还应该在每次迭代时清除参数集合:

command.Parameters.Clear();

虽然最好在每次迭代时创建新命令以避免困惑 - 检查 this thread了解详情。

关于c# - SqlCommand 参数与 String.Format,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22153217/

相关文章:

c# - 在 System::Collections::Generic::List<T> 类型的列表中列出是可能的吗?

c# - 需要删除对象 : implement Dispose or create objects in a function?

mysql - 无法弄清楚为什么我的 SQL 查询没有返回结果

MySQL如何从多行中分组并选择某些状态?

java - JUnit parameterized Tests 获取测试后的参数

c# - 如何从 window.external.Notify ("someText")的事件处理程序(即 WebBrowser.ScriptNotify 事件)获取结果返回给 JS?

c# - 动态 crm 中的 AppDomain.CurrentDomain.AssemblyResolve

mysql - 如何在我的数据库 ER 模型中链接员工、主管和主管

javascript - 在 GET 请求中使用激活的路由参数变量返回 null

Jenkins 构建管道插件 - 空白白色模式窗口 - 第一个作业没有参数提示问题