1

我有这个 ADO.NET 命令对象,我可以设置一些参数并成功执行它。

_mergecommand.Parameters.Add(new SqlParameter("values", SqlDbType.Structured)); _mergecommand.Parameters["values"].TypeName = "strlist"; _mergecommand.Parameters["values"].Direction = ParameterDirection.Input;

_mergecommand.Parameters["values"].Value = valuelist; _mergecommand.ExecuteNonQuery();

这工作正常。但是我想在执行它之前准备好这个命令,因为我需要运行这个数百万次。我正在使用 SQL Server 2008。如果我尝试准备它,我会收到此错误

SqlCommand.Prepare 方法要求所有可变长度参数具有显式设置的非零大小。

知道怎么做吗?

4

2 回答 2

2

这是旧的,但似乎有一个正确的答案是使用 -1 作为大小,例如:

_mergecommand.Parameters.Add(new SqlParameter("values", SqlDbType.Structured, -1));
于 2017-01-05T19:29:09.827 回答
0

如果您必须使用这样的命令执行数百万次,则可能不是一个好策略。

您可以将数据序列化为 XML 字符串并将其作为单个参数传递吗?这将大大减少您的网络和 SQL Server 上的负载......尽管它可能会对您的客户端造成更大的影响。

如果你死心塌地这样做,也许你正在寻找的是 SqlCommand.Parameters.Add 方法的重载:

_mergecommand.Parameters.Add("@values", System.Data.SqlDbType.NVarChar, 100).Value = foo; 

这更像你想要的吗?

于 2011-07-18T00:51:29.783 回答