2017-01-16 27 views
0

Dictionary<string, string>を受け取りました。その値をSqlParameterのDBに転送します。それも可能ですか?これが私のやり方です。カラム名がテーブル定義と一致しないというエラーが発生しています。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/このテーブルはSQLインジェクションを受けやすいのですか? –

答えて

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

注:最初のオプションについては
は、あなたがあなたのクエリを構築する方法を変更しなければならないコードは、テストされていなかった、多少の誤差があるかもしれません。

2番目のオプションでは、ストアドプロシージャを使用する必要があります。テーブル値のパラメータをインラインクエリに渡すことは一度もありませんでしたが、それは可能ではないと思います。
This post(Alex Kのコメントでリンクされています)では、その方法を説明しています。

+0

これはSQLインジェクションの対象ですか? – Norgul

+0

'tableName'の値がユーザー入力からのものである場合のみです。 –

+0

ハードコーディングなしでその部分をパッチする方法はありますか? – Norgul

0

t-SQLの "値"部分の各値はかっこで囲む必要があります。

ので、ちょうどこの行を変更:

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

良いアイデアだが、うまくいかない。私は '@値'の近くに誤った構文を取得しています。 '...最初に括弧で囲まれた値を期待しているからです。 – Norgul

+0

あなたはあなたのinsertStringをストアドプロシージャを使用していない場合のパラメータ):string insertString = $ "{tableName}に値を挿入する{sb.ToString()。TrimEnd( '、')}"; – wnutt

+0

このようにすれば、悪用される可能性があります。私はパラメータの解決策が必要:) – Norgul

0

私は最高の(インターネットに例百万)MSSQLにsplit関数を作成していると思うし、保存されました。ストアされたWho関数に関数を呼び出すために、文字列のコンマ(たとえば)を区切ります。申し訳ありませんが、私はスマートフォンでいらっしゃいます

関連する問題