2017-01-16 60 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分裂功能和存儲(例如,在互聯網萬元)。將字符串逗號(例如)分隔到存儲的誰調用該函數。對不起,但我與我的智能手機