2012-01-31 78 views
1

我有以下代码:LINQ到SQL ExecuteCommand用“IN”声明

long[] conIds = GetIDs(); 
dc.ExecuteCommand("UPDATE Deliveries SET Invoiced = NULL WHERE ID IN {0}",conIds); 

我期望工作,但executecommand语句抛出一个异常,说明

查询参数不能是int64 []类型。

这是为什么?

回答

1

您正在向需要字符串的占位符传递一个long数组。您需要使用逗号分隔符将数组转换为连接字符串。然后,将它传递给命令文本。

根据你在哪里使用GetIDs方法,你可以通过让该方法返回一个字符串数组来简化你的代码。然后,您可以在这里轻松使用String.Join将该数组转换为您想要的连接文本。

0

你不能这样做。 SQL参数必须是单个值。

您可以通过将您的数组转换为逗号分隔值列表来完成此工作。

查看here的例子。

command.CommandText = command.CommandText.Replace(
    "@conIDs", 
    string.Join(conIDs.Select(b => b.ToString()), ",") 
); 

一般来说,最好是序列化你的SQL,并使用表值参数来处理这类事情。有关说明,请参阅this question

0

我遇到了麻烦,我发现Linq非常关注参数。我不得不将SQL语句构建为字符串,并将该字符串传递给.ExecuteCommand()以使其工作。没有错误,只是没有结果。混乱。

这就是说有没有人看过Linq传递给Sql Server的好方法?

我已经使用了SQL分析器,但它有点含糊。

+0

DataContext.Log属性让您指定一个TextWriter来记录查询。例如。您可以使用'DataContext.Log = Console.Out'将其输出到控制台 – 2017-09-07 01:07:43