我收到了Dictionary<string, string>
,并希望将其值转发给SqlParameter
内的数据库。这甚至可能吗?这就是我这样做的方式,我收到一个错误,即列名与表定义不匹配。
SqlParameter param = new SqlParameter();
param.ParameterName = "@Values";
var sb = new StringBuilder();
foreach (var item in data)
{
sb.Append("'" + item.Value + "', ");
}
param.Value = sb.ToString().TrimEnd(',');
string insertString = $"insert into {tableName} values (@Values)";
SqlCommand command = new SqlCommand(insertString, connection);
command.Parameters.Add(param);
command.ExecuteNonQuery();
答案 0 :(得分:2)
Sql server无法将您传递的单个变量解释为多个值 您可以使用多个变量生成查询,也可以使用表值参数 对于第一个选项,您必须更改构建查询的方式:
var command = new SqlCommand();
var insertString = $"insert into {tableName} values (";
var sb = new StringBuilder(insertString);
int i = 0;
foreach (var item in data)
{
sb.Append("@P").Append(i).Append(",");
command.Parameters.Add("@P" + i, SqlDbType.VarChar).Value = item.Value;
i++;
}
command.Connection = connection;
command.CommandText = sb.ToString().TrimEnd(",") + ");";
command.ExecuteNonQuery();
注意:代码未经过测试,可能存在一些错误。
对于第二个选项,您必须使用存储过程。我从未尝试将表值参数传递给内联查询,我认为这是不可能的 This post(也在Alex K的评论中链接)解释了如何做到这一点。
答案 1 :(得分:0)
你t-SQL的“Values”部分中的每个值都必须用括号括起来。
所以,只需改变这一行:
public MainWindow()
{
InitializeComponent();
ListBox.ItemsSource = Load();
}
public List<Person> Load()
{
XmlDocument xDoc = new XmlDocument();
xDoc.Load("UsersList");
XmlElement xRoot = xDoc.DocumentElement;
List<Person> users = new List<Person>();
foreach (XmlNode xnode in xRoot)
{
Person user = new Person();
if (xnode.Attributes.Count > 0)
{
XmlNode attr = xnode.Attributes.GetNamedItem("name");
if (attr != null)
user.Name = attr.Value;
}
foreach (XmlNode childnode in xnode.ChildNodes)
{
if (childnode.Name == "images")
{
user.Images = childnode.InnerText;
}
if (childnode.Name == "age")
{
user.Age = childnode.InnerText;
}
}
users.Add(user);
}
return users;
}
为:
sb.Append("'" + item.Value + "', ");
你的tSQL看起来像这样:
sb.Append("('" + item.Value + "'),"); // note: no space after the ,
它需要看起来像这样(假设你的表中只有1列):
insert into myTable values ('A', 'B', 'C',)
如果您的表包含多个列:
insert into myTable values ('A'), ('B'), ('C')
答案 2 :(得分:0)
我认为最好的是在mssql中创建一个split函数(在互联网上有百万个例子)和一个存储。传递一个字符串逗号(例如)分隔给存储的Who调用该函数。很抱歉没有例子,但我的智能手机