2017-01-16 59 views
0

我收到Dictionary<string, string>并希望将其值转发给SqlParameter内的数据库。这甚至可能吗?这是我做到这一点的方式,并且我收到了一个列名称与表定义不匹配的错误。ADO.NET向SQL参数插入多个值

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(); 
+4

是的,你可以在服务器上使用*表值参数*和在C#中的*数据表*请参阅http://stackoverflow.com/questions/10409576/ pass-table-valued-parameter-using-ado-net –

回答

2

Sql服务器无法将您传递的单个变量解释为多个值。
您可以使用多个变量生成查询,也可以使用表值参数。
对于第一种选择,你必须改变你建立你的查询方式:

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的评论中)解释了如何做到这一点。

+0

这是否容易出现SQL注入? – Norgul

+0

只有当'tableName'的值来自用户输入时。 –

+0

有没有办法在没有硬编码的情况下修补该部分? – Norgul

0

t-SQL的“Values”部分中的每个值必须用圆括号括起来。

所以,只要改变这一行:

sb.Append("'" + item.Value + "', "); 

到:

sb.Append("('" + item.Value + "'),"); // note: no space after the , 

你TSQL会是这个样子:

insert into myTable values ('A', 'B', 'C',) 

它需要像这样(假设你在表中只有1列):

insert into myTable values ('A'), ('B'), ('C') 

如果你的表中包含多个列:

insert into myTable (myColumn) values ('A'), ('B'), ('C') 
+0

这是一个好主意,但它不起作用。我正在'@ Values'附近获得错误的语法。'...我想是因为它希望值首先被括在括号中 – Norgul

+0

猜测我应该明确指出,您需要将insertString更改为(不需要如果你没有使用存储过程的参数):string insertString = $“insert into {tableName} values {sb.ToString()。TrimEnd(',')}”; – wnutt

+0

如果这样做,它可以被利用。我需要参数解决方案:) – Norgul

0

我觉得最好的是创造MSSQL分裂功能和存储(例如,在互联网万元)。将字符串逗号(例如)分隔到存储的谁调用该函数。对不起,但我与我的智能手机