在使用linq将空值传递给ExecuteCommand()方法时,我遇到了一个问题。我的代码类似于下面的代码:
public void InsertCostumer(string name, int age, string address)
{
List<object> myList = new List<object>();
myList.Add(name);
myList.Add(age);
myList.Add(address);
StringBuilder queryInsert = new StringBuilder();
queryInsert.Append("insert into Customers(name, address) values ({0}, {1}, {2})");
this.myDataContext.ExecuteCommand(queryInsert.ToString(), myList.ToArray());
}
但是,当参数为空(例如,地址)时,我会得到以下错误:“查询参数不能是‘System.Object’类型。”
如果没有参数为空,则不会发生错误。我知道我的例子中的设计有点差,我只是创建了一个简单的例子来关注这个问题。有什么建议吗?
发布于 2009-05-13 19:55:56
你有没有试过给那些为空的值赋值?含义(伪):
如果address为空,则address = "“,或者如果age <0,则age =0
然后将其添加到myList
或者,您可以始终使用三元运算符:
name = name.Length < 1 ? "" : name;
age = age < 1 ? Int32.MinValue : age;
然后将其添加到myList
发布于 2011-05-17 00:35:54
我也有同样的问题。太愚蠢了,微软居然不解决这个问题。这是我的解决方案,虽然我并不支持所有的参数类型,但是你已经明白了。我把它放在DataContext类中,这样看起来就像是内置在Linq :)中。
public int ExecuteCommandEx(string sCommand, params object[] parameters)
{
object[] newParams = new object[parameters.Length];
for (int i = 0; i < parameters.Length; i++)
{
if (parameters[i] == null)
newParams[i] = "NULL";
else if (parameters[i] is System.Guid || parameters[i] is System.String || parameters[i] is System.DateTime)
newParams[i] = string.Format("'{0}'", parameters[i]);
else if (parameters[i] is System.Int32 || parameters[i] is System.Int16)
newParams[i] = string.Format("{0}", parameters[i]);
else
{
string sNotSupportedMsg = string.Format("Type of param {0} not currently supported.", parameters[i].GetType());
System.Diagnostics.Debug.Assert(false, sNotSupportedMsg);
}
}
return ExecuteCommand(string.Format(sCommand, newParams));
}
发布于 2013-03-05 14:36:57
我使用这样的东西(注意我使用的是SO "IDE“,所以我不能保证这将被正确编译或工作,但是你会明白的)
public void InsertCostumer(string name, int age, string address)
{
List<object> myList = new List<object>();
myList.Add(name);
myList.Add(age);
myList.Add(address);
StringBuilder queryInsert = new StringBuilder();
queryInsert.Append("insert into Customers(name, age, address) values (");
int i = 0;
foreach (var param in myList.ToArray())
{
if (param == null)
{
queryInsert.Append("null, ");
myList.RemoveAt(i);
}
else
{
queryInsert.Append("{" + i + "}, ");
i++;
}
}
queryInsert.Remove(queryInsert.Length - 2, 2);
queryInsert.Append(")");
this.myDataContext.ExecuteCommand(queryInsert.ToString(), myList.ToArray());
}
https://stackoverflow.com/questions/859985
复制相似问题