首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Linq ExecuteCommand不理解空值

Linq ExecuteCommand不理解空值
EN

Stack Overflow用户
提问于 2009-05-13 19:37:54
回答 9查看 11.2K关注 0票数 22

在使用linq将空值传递给ExecuteCommand()方法时,我遇到了一个问题。我的代码类似于下面的代码:

代码语言:javascript
运行
复制
    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’类型。”

如果没有参数为空,则不会发生错误。我知道我的例子中的设计有点差,我只是创建了一个简单的例子来关注这个问题。有什么建议吗?

EN

回答 9

Stack Overflow用户

发布于 2009-05-13 19:55:56

你有没有试过给那些为空的值赋值?含义(伪):

如果address为空,则address = "“,或者如果age <0,则age =0

然后将其添加到myList

或者,您可以始终使用三元运算符:

代码语言:javascript
运行
复制
name = name.Length < 1 ? "" : name;
age = age < 1 ? Int32.MinValue : age;

然后将其添加到myList

票数 0
EN

Stack Overflow用户

发布于 2011-05-17 00:35:54

我也有同样的问题。太愚蠢了,微软居然不解决这个问题。这是我的解决方案,虽然我并不支持所有的参数类型,但是你已经明白了。我把它放在DataContext类中,这样看起来就像是内置在Linq :)中。

代码语言:javascript
运行
复制
    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));
    }
票数 0
EN

Stack Overflow用户

发布于 2013-03-05 14:36:57

我使用这样的东西(注意我使用的是SO "IDE“,所以我不能保证这将被正确编译或工作,但是你会明白的)

代码语言:javascript
运行
复制
    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());
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/859985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档