当前位置: 首页 > 面试题库 >

SqlCommand参数与String.Format

周玺
2023-03-14
问题内容

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

我注意到在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中那样进行所有操作,每个示例都可以工作时间。

使用任何一种方法都会产生重大损益吗?哪种方法更适合完成这样的任务?

其他问题

好的,所以我认为方法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注入的参数。例如,考虑在以下情况下会发生什么string.Format,如果不是bobTextBox1.Text含有1';DROP TABLE myTable;'

如果您可以完全控制参数,则无法进行SQL注入,例如在使用字符串文字作为参数的情况下。但是,您永远都不知道代码将来会如何变化,因此,根据经验,您应该始终坚持使用带有参数的更安全的方法。

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

更新。 在您的其他问题中,问题恰恰在于参数命名-应该是@myName

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

另外,您应该在每次迭代中清除参数集合

command.Parameters.Clear();


 类似资料:
  • 问题内容: 我使用以下代码从SQL Server表中进行选择: 它运行完美,但是我想防止SQL注入,所以我尝试使用: 当我尝试执行此操作时,SQL Server没有任何结果。 知道为什么吗? 问题答案: “为什么?” 这是因为很少有电影的名称中带有“ @Search”一词-即“ Indiana Jones and the Last @Search”。也许是《星际迷航3:@搜索Spock》。通过将其

  • 问题内容: 显然,以下代码不会按预期方式打印出任何内容。.我确信这与我尝试将项目列表放入中的事实有关。显然,这不仅仅是文本替换。 我怎么解决这个问题?谢谢 问题答案: 不幸的是,SQL参数不能以这种方式 解析 ,换句话说,后端不只是构建一个安全字符串来替换每个参数的值。相反,您必须动态构建参数列表: 然后添加每个参数: 如果在运行时之前还不知道这些参数,那么您当然可以在循环中添加这些参数: 如果您

  • 问题内容: 今天,我以前曾被教过如何在此答案中(。单击)在.NET中的SQL查询中设置参数。 使用带有值的参数很好,但是当我尝试将数据库中的字段设置为null时,我将失败。该方法认为我未设置有效参数或未指定参数。 例如 有什么我想念的吗?我做错了吗? 问题答案: 您需要DBNull .Value。 在共享的DAL代码中,我使用的辅助方法只是执行以下操作:

  • 问题内容: 我只是在阅读有关如何在.NET中向SqlCommand添加参数的问题,这对我提出了一个问题。在我的所有程序中,这就是我向命令中添加参数的方式: 我知道您也可以通过以下方式添加参数: 以下哪种添加参数的方法更好?有关系吗?我知道使用Sql名称空间对SQL Server查询更有效,所以我的第一个响应就是使用SqlParameter会更高效。但是,由于它已经是SqlCommand,所以我对此

  • 问题内容: 我正在创建类似小型收银员应用程序的应用程序,该应用程序会为客户,员工,服务,销售和约会保留记录。我正在使用Windows窗体,并且在该DataGrids中。我已经创建了将用于该应用程序的数据库。我想知道是否应该使用SqlCommand- SqlDataReader或SqlDataAdapter-DataSet。哪种方法更好? 问题答案: 这在很大程度上取决于您想要的操作类型。 以下是我

  • 我们用过的一些内置函数携带参数,即你提供给函数让它工作的一些值。比如,如果你想计算一个数的正弦值,你需要指定这个数是多少。因此sin函数使用一个double值作为参数。 一些函数携带一个以上的参数,如pow携带两个double参数,分别作为底数和幂。 注意,在所有这些例子中,我们不仅要指定参数的个数,还要指定参数的类型。所以当你写一个类定义时,发现参数列表指定了每个参数的类型,这应该没什么奇怪的。