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

如何正确有效地重用C#.NET(SQL Server)中的准备好的语句?

云宾鸿
2023-03-14
问题内容

我看了很多问题,但显然我的 SO-fu 无法 胜任
这项任务,所以我来了。我试图有效地使用准备好的语句,而不仅仅是指对单个语句进行参数化,而是要对它进行多次编译以供重用。我的问题在于参数和重用以及如何正确实现。

通常,我遵循此过程(人为的示例):

SqlConnection db = new SqlConnection(...);
SqlCommand s = new SqlCommand("select * from foo where a=@a", db);
s.Parameters.Add("@a", SqlDbType.VarChar, 8);
s.Prepare();
...
s.Parameters["@a"] = "bozo";
s.Execute();

超级好用
但是,我不想每次运行此查询时都执行所有这些步骤(或后四个步骤)。这似乎正在抵消准备好的语句的整个思想。在我看来,我只需要更改参数并重新执行,但是问题是如何做到这一点?

我试过了s.Parameters.Clear(),但这实际上删除了参数本身,而不仅是值,因此我基本上需要重新Add输入参数,然后重新输入Prepare,这似乎也破坏了整个观点。不用了,谢谢。

在这一点上,我要遍历s.Parameters并将它们全部设置为null或其他一些值。 这样对吗?
不幸的是,在我当前的项目中,我有约15个参数的查询,每次运行都需要执行约10,000次。我可以将这种迭代分解为一种方法,但是想知道是否有更好的方法(没有存储的proc)。

我当前的解决方法是扩展方法,SqlParameterCollection.Nullify该方法将所有参数设置为null,这对于我的情况而言是很好的。我只是在执行后运行它。


问题答案:

当重新使用准备好的SqlCommand时,肯定需要做的就是将参数值设置为新的?使用后,您无需清除它们。

就我自己而言,我从未见过在过去十年中生产的DBMS可从准备语句中获得任何显着的好处(我想如果DB
Server可能处于其CPU极限的情况下,也许会,但这不是典型的)。您确定需要准备吗?

除非从外部源上载,否则运行同一命令“每次运行约10,000次”对我来说有点难闻。在这种情况下,批量加载可能会有所帮助?每次跑步都在做什么?

干杯-



 类似资料:
  • 问题内容: 这行不通 警告:mysqli_stmt :: bind_param():第1行上/home/rgero/public_html/php/searchadmins.php中已准备好的语句中的变量数量与参数数量不匹配 这个也不行 致命错误:错误的SQL:SELECT * FROM WHERE用户名类似%{?}%错误:第1行的/home/rgero/public_html/php/searc

  • 问题内容: 我正在自定义由hibernate生成的插入SQL,并遇到了问题。当Hibernate自己生成查询时,它将数据插入表的前两列,但这会导致数据库错误,因为表的所有四列都是不可为空的。为了正确执行插入,它必须将相同的数据插入到新记录的两列中。这意味着我需要Hibernate将相同的数据绑定到我正在编写的查询(准备好的语句)中的两个不同的参数上。 是否有一些SQL语法可让我以与绑定到绑定语句不

  • 问题内容: 我正在努力学习在PHP中使用mysqli编写预备语句,通常,如果我对查询有疑问,我只需将其回显到屏幕上,就可以看到第一步。 我如何用准备好的陈述来做到这一点? 替换变量后,我想查看SQL语句。 问题答案: 使用准备好的语句: 准备该语句时,它会发送到MySQL服务器 当您绑定变量+执行语句时,只有变量被发送到MySQL服务器 并且语句+绑定变量在MySQL服务器上执行-无需在每次执行语

  • 我有以下准备的一个准备好的声明失败了... 我在我的第一份准备好的声明中几乎有同样的准备,而且它进行得很好。我不确定是否我有两个准备好的声明,如果这是造成一个问题,或情况可能是什么? 现在我有个错误... 更新-可能的内部连接,像这样?

  • 其思想是创建一个准备好的语句将信息插入到用户表中,然后从生成的内容中获取insert_id以在另一个insert语句中使用 这是我的注册脚本的一个版本 第一条准备好的语句正确运行并向表中插入信息,之后成功回显$RETURNID变量。脚本中的下一个是我准备好的第二条语句,当它试图运行im时,得到的错误是: 致命错误:对第17行d:\filepath\register.php中的非对象调用成员函数bi