【发布时间】:2011-01-27 20:02:06
【问题描述】:
当我阅读书籍学习 C#(可能是一些旧的 Visual Studio 2005 书籍)时,我遇到过建议每次执行 SQL 调用时始终使用 SqlCommand.Prepare(无论是 SELECT/UPDATE 还是INSERT 在 SQL SERVER 2005/2008 上),我将参数传递给它。 但真的是这样吗?
应该每次都做吗?还是只是有时?
传递一个参数、五个或二十个参数是否重要?
如果有的话,它应该给予什么提升?会不会很明显(我一直在这里使用
SqlCommand.Prepare并在那里跳过它,从来没有任何问题或明显的差异)。
为了这个问题,这是我常用的代码,但这更像是一个一般性问题。
public static decimal pobierzBenchmarkKolejny(string varPortfelID, DateTime data, decimal varBenchmarkPoprzedni, decimal varStopaOdniesienia) {
const string preparedCommand = @"SELECT [dbo].[ufn_BenchmarkKolejny](@varPortfelID, @data, @varBenchmarkPoprzedni, @varStopaOdniesienia) AS 'Benchmark'";
using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetailsDZP)) //if (varConnection != null) {
using (var sqlQuery = new SqlCommand(preparedCommand, varConnection)) {
sqlQuery.Prepare();
sqlQuery.Parameters.AddWithValue("@varPortfelID", varPortfelID);
sqlQuery.Parameters.AddWithValue("@varStopaOdniesienia", varStopaOdniesienia);
sqlQuery.Parameters.AddWithValue("@data", data);
sqlQuery.Parameters.AddWithValue("@varBenchmarkPoprzedni", varBenchmarkPoprzedni);
using (var sqlQueryResult = sqlQuery.ExecuteReader())
if (sqlQueryResult != null) {
while (sqlQueryResult.Read()) {
}
}
}
}
补充说明:
如果我像下面的代码一样移动sqlQuery.Prepare(),则会抛出异常,必须明确声明大小,这基本上导致我认为首先将sqlQuery.Prepare() 设为无用?有人可以使用我的示例显示正确的用法吗?
public static decimal pobierzBenchmarkKolejny(string varPortfelID, DateTime data, decimal varBenchmarkPoprzedni, decimal varStopaOdniesienia) {
const string preparedCommand = @"SELECT [dbo].[ufn_BenchmarkKolejny](@varPortfelID, @data, @varBenchmarkPoprzedni, @varStopaOdniesienia) AS 'Benchmark'";
using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetailsDZP)) //if (varConnection != null) {
using (var sqlQuery = new SqlCommand(preparedCommand, varConnection)) {
sqlQuery.Parameters.AddWithValue("@varPortfelID", varPortfelID);
sqlQuery.Parameters.AddWithValue("@varStopaOdniesienia", varStopaOdniesienia);
sqlQuery.Parameters.AddWithValue("@data", data);
sqlQuery.Parameters.AddWithValue("@varBenchmarkPoprzedni", varBenchmarkPoprzedni);
sqlQuery.Prepare();
using (var sqlQueryResult = sqlQuery.ExecuteReader())
if (sqlQueryResult != null) {
while (sqlQueryResult.Read()) {
}
}
}
}
我该怎么做?通过在参数旁边添加 .size 并执行 varPortfel.Lenght 如果它是字符串等?
【问题讨论】:
标签: c# sql-server performance