SqlCommand.Prepare方法要求所有参数都具有显式设置类型
我在我的WCF Web服务中有以下代码片段,它根据提供的字典值的格式构建一组where条件。
public static Dictionary[] VehicleSearch(Dictionary searchParams, int maxResults) { string condition = ""; foreach (string key in searchParams.Keys) { //Split out the conditional in case multiple options have been set (ie SUB;OLDS;TOY) string[] parameters = searchParams[key].Split(';'); if (parameters.Length == 1) { //If a single condition (no choice list) check for wildcards and use a LIKE if necessary string predicate = parameters[0].Contains('%') ? " AND {0} LIKE @{0}" : " AND {0} = @{0}"; condition += String.Format(predicate, key); } else { //If a choice list, split out query into an IN condition condition += string.Format(" AND {0} IN({1})", key, string.Join(", ", parameters)); } } SqlCommand cmd = new SqlCommand(String.Format(VEHICLE_QUERY, maxResults, condition)); foreach (string key in searchParams.Keys) cmd.Parameters.AddWithValue("@" + key, searchParams[key]); cmd.Prepare();
请注意,字典中的值显式设置为字符串,并且它们是发送到AddWithValue
语句的唯一项。 这会产生如下SQL:
SELECT TOP 200 MVINumber AS MVINumber , LicensePlateNumber , VIN , VehicleYear , MakeG , ModelG , Color , Color2 FROM [Vehicle_Description_v] WHERE 1=1 AND VIN LIKE @VIN
而错误说出来
System.InvalidOperationException:SqlCommand.Prepare方法要求所有参数都具有显式设置类型。
我所做的所有搜索都说我需要告诉AddWithValue
我正在准备的值的类型,但是我准备的所有值都是字符串,我看到的所有示例在处理时都没有执行任何额外的操作字符串。 我错过了什么?
而不是这个:
cmd.Parameters.AddWithValue("@" + key, searchParams[key]);
你需要使用这样的东西:
cmd.Parameters.Add("@" + key, SqlDbType.******).Value = searchParams[key];
您需要能够以某种方式确定您的参数必须是什么数据类型 。
这可能是这样的:
使用AddWithValue
很方便 – 但是根据传入的值,它可以让ADO.NET根据传入的值来猜测数据类型。大多数情况下,这些猜测非常好 – 但有时它们可能会关闭。
我建议你总是明确说出你想要的数据类型。
如果您阅读文档 ,您将看到当您使用SQLCommand.Prepare时,您需要使用Parameters.Add并为每个参数分配数据类型。 该链接中有一个很好的代码示例,它将向您展示如何执行此操作。
上述就是C#学习教程:SqlCommand.Prepare方法要求所有参数都具有显式设置类型分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1014683.html