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

为什么使用SqlParameter []而不嵌入参数?

卫弘图
2023-03-14
问题内容

我有一个sqlhelper类,其中包含一个重载的ExecuteNonQuery:一个仅包含一个参数(commandText),另一个仅包含两个参数(commandText,SqlParameter
[])。

假设我有一个没有用户交互的独立控制台应用程序,并且我将调用一个存储过程,该存储过程将仅使用3个参数更新一个表,如果我可以轻松地构建字符串并使用SqlParameter[],有什么好处?只是将其作为commandText发送?

换句话说,为什么要使用以下内容:

SqlParameter[] parameters =
    {    
        new SqlParameter("parm1" SqlDbType.VarChar, 3),
        new SqlParameter("parm2", SqlDbType.VarChar, 8),
        new SqlParameter("parm3", SqlDbType.VarChar, 2),
        new SqlParameter("parm4", SqlDbType.VarChar, 4)
    };

parameters[0].Value = p1;
parameters[1].Value = p2;
parameters[2].Value = p3;
parameters[3].Value = p4;

当我可以使用这样的东西时:

strQueryToRun = string.Format("exec updateTable {0}, {1}, {2}, {3}", p1, p2, p3, p4);

这是一个独立的控制台应用程序,因此不可能进行sql注入。

谢谢。


问题答案:

第一个也是绝对最重要的原因是,您的查询可以执行您 期望的操作 ,而不是 恶意地使它
执行的操作。看一下有关SQL注入的Wikipedia文章。

除了减轻(有效消除)SQL注入的风险外,使用参数还允许SQL
Server利用缓存的查询计划。在您的特定实例(您只是在调用存储过程,几乎肯定已经编译并缓存了其计划)的特定实例中,这不是问题,但这是您需要参数化查询的更一般的原因。

另一个原因(如Ali在另一个答案中指出的那样)是,string.Format无论本机.NET类型的字符串表示形式如何,使用该方法都将为您提供参数。对于数字,这不是问题。对于字符串类型,您将必须用单引号引起来,并正确地转义任何嵌入的引号(以及可能的其他清除例程)。使用该参数可使SQL客户端库担心如何将数据传递到服务器。

就是说,我不会使用您上面编写的代码。我根本不会构造SqlParameters的数组。有多种方法可以将参数添加到SqlCommand(或DbCommand正在使用的任何内容)中,例如AddWithValue,提供了一种较简单的机制,足以满足大多数要添加的参数的需要。

即使忽略AddWithValue,我仍然会为每个参数创建单独的变量,并将其命名为有意义的名称。

var parm1 = new SqlParameter("parm1", SqlDbType.VarChar, 3);
var parm2 = new SqlParameter("parm2", SqlDbType.VarChar, 8);
var parm3 = new SqlParameter("parm3", SqlDbType.VarChar, 2);
var parm4 = new SqlParameter("parm4", SqlDbType.VarChar, 4);

parm1.Value = p1;
parm2.Value = p2;
parm3.Value = p3;
parm4.Value = p4;

(显然,类似parm1或的名称parm2没有意义,但我认为 实际的 参数名称比示例更有意义)



 类似资料:
  • 很多人问了此问题,说bzero已经被posix-2008废弃,为何还使用bzero。选择bzero而不是memset,有2个原因: bzero有2个参数,指针和长度,很明确就是将制定size的内存初始化为0。而memset有3个参数,需要记忆参数的位置,有不少人经常把长度和初始化值搞错。 bzero比memset的可读性要好。memset可以制定初始化的值,实际上绝大多数情况都是0。 一旦新版本g

  • 我使用的是JDK-8(x64)。对于<code>数组。sort</code>(原语)我在Java文档中找到了以下内容: 排序算法是弗拉基米尔·雅罗斯拉夫斯基、乔恩·本特利和约书亚·布洛赫的双轴快速排序。' 对于<code>集合。sort(对象)我找到了这个“Timsort”: 这个实现是一个稳定的、自适应的、迭代的合并…这个实现将指定的列表转储到一个数组中,对数组进行排序,并迭代列表,从数组中的相

  • 问题内容: public class StackOverFlow { public static void main(String[] args) { ArrayList al = new ArrayList (); al.add(“A”); al.add(“B”); markAsNull(al); System.out.println(“ArrayList elements are “+al);

  • 问题内容: 我不确定为什么列出项目时为什么需要使用ul-li而不是简单地使用div。我可以使两者看起来完全一样,因此与创建div相比,创建无序列表的功能优势在哪里? 问题答案: 为了语义正确。HTML具有表达事物列表的功能,它可以帮助Google机器人,屏幕阅读器以及所有不仅仅关心网站外观的用户更好地了解您的内容。

  • 问题内容: 的OpenJDK代码包括以下行: 为什么在这里使用,而不是?我很好奇。 问题答案: 要强调的是,数字是2的幂,而不是一个完全任意的选择。因此,它警告开发人员尝试不同的数字,他们应该在模式中使用其他数字(例如或,而不是),这样他们就不会破坏依赖于两个要求的幂的方法。有评论略高于: 任何一个的容量(表长度)始终是2的幂。之所以这样设计,是因为它允许使用快速的按位AND操作()将每个键的哈希

  • 我花了很多时间来解决这个问题。我是GRAILS和GROOVY中的begginer。我有一个名为“tms\u dev”的旧oracle数据库模式。此架构有一些表(例如checktypes表)。此外,我还有由GRAILS生成的域类Checktype和ChecktypesController类-controller。 此类具有列表方法: def列表(最大整数){ } 我还配置了Datasource。gr