【发布时间】:2016-02-25 05:46:10
【问题描述】:
我必须使用 C# 将列表传递给 SQL Server 查询。我的代码在这里:
using (SqlDataReader _myReader_2 = _myCommand_3.ExecuteReader())
{
_Node_Neighbor.Clear();
while (_myReader_2.Read())
{
_Node_Neighbor.Add(Convert.ToInt32(_myReader_2["Target_Node"]));
}
_myReader_2.Close();
//Here I have to pass this _Node_Neighbor i.e. of type List<int> to another
//SQL Server query as:
try
{
SqlCommand _myCommand_4 = _con.CreateCommand();
_myCommand_4.CommandText = @"SELECT COUNT(*) FROM GraphEdges
WHERE Source_Node IN @Source_Node
AND Target_Node IN @Target_Node";
_myCommand_4.Parameters.AddWithValue("@Source_Node", _Node_Neighbor);
_myCommand_4.Parameters.AddWithValue("@Target_Node", _Node_Neighbor);
_Mutual_Links = Convert.ToInt32(_myCommand_4.ExecuteScalar());
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}
然而,要将列表作为参数传递,我认为可能还有其他方式,这就是我收到此错误的原因:
No mapping exists from object type Systems.Collections.Generic.List
谢谢!
【问题讨论】:
-
您需要使用 IN() 语法。但恐怕这不适用于参数。
-
你试过
_Node_Neighbor.ToArray()吗?我很确定参数支持数组。 -
为什么不直接格式化查询而不是使用参数?
string.Format("...WHERE Source_Node IN ('{0}')...", string.Join("','", _Node_Neighbor)) -
在查询中,您将@_Node_Neighbor 作为参数,但在添加值时,您将@Source_Node 作为参数名称传递
-
您可以使用 TVP 而不是使用 IN 子句传递。检查这个问题stackoverflow.com/questions/20143012/… 和这个答案stackoverflow.com/a/20143173/311255
标签: c# sql-server list parameter-passing