我必须使用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
谢谢!
答案 0 :(得分:2)
为了传递IN
的数组/列表,您必须为列表中的每个值创建一个参数。
try
{
SqlCommand _myCommand_4 = _con.CreateCommand();
List<string> sqlParams = new List<string>();
int i = 0;
foreach(var value in _Node_Neighbor){
var name = "@p" + i++;
_myCommand_4.Parameters.Add(name,value);
sqlParams.Add(name);
}
string paramNames = string.Join(",", sqlParams);
_myCommand_4.CommandText = "SELECT COUNT(*) FROM GraphEdges"
" WHERE Source_Node IN (" + paramNames + ") "
" AND Target_Node IN (" + paramNames + ")";
_Mutual_Links = Convert.ToInt32(_myCommand_4.ExecuteScalar());
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
答案 1 :(得分:1)
在sql server
中使用用户定义的表格,在ADO.NET
代码中使用数据表。
答案 2 :(得分:-1)
如果数组不大,则在c#中构建动态查询
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
{
var query = @"SELECT COUNT(*) FROM GraphEdges
WHERE Source_Node IN
(##Source_Node)
AND Target_Node IN
(##Target_Node)";
var sourceNode = "";
foreach (var item in _Node_Neighbor)
{
sourceNode += item + ",";
}
sourceNode = sourceNode.TrimEnd(',');
var targetNode = "";
foreach (var item in _Node_Neighbor)
{
targetNode += item + ",";
}
targetNode = targetNode.TrimEnd(',');
query = query.Replace("##Source_Node", sourceNode).Replace("##Target_Node", targetNode);
SqlCommand _myCommand_4 = _con.CreateCommand();
_myCommand_4.CommandText = @"SELECT COUNT(*) FROM GraphEdges
WHERE Source_Node IN @Source_Node
AND Target_Node IN @Target_Node";
_Mutual_Links = Convert.ToInt32(_myCommand_4.ExecuteScalar());
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}