2016-12-07 4 views
0

解決方法を知らない問題があります。 同じ操作で同じクエリを実行できるようにするには、そのクエリで追加する必要がある値を保持する辞書を作成しました。私は私がDBに格納するすべてのデータが含まれている辞書を持って言ったようにC# - 辞書からクエリするパラメータを追加する

INSERT INTO [dbo].[TestDB] ([ID], [Name], [Age]) VALUES (@{0}, @{1}, @{2}); 

クエリは、このようなものです。文字列ビルダーを使用して、私は辞書にキーとして値を持つクエリを作成します。例:

INSERT INTO [dbo].[TestDB] ([ID], [Name], [Age]) VALUES (@1, @2, @3); 
INSERT INTO [dbo].[TestDB] ([ID], [Name], [Age]) VALUES (@4, @5, @6); 
INSERT INTO [dbo].[TestDB] ([ID], [Name], [Age]) VALUES (@7, @8, @9); 

ここで、値を使用してキーを変更する場合、クエリは変更されません。 これは私がそれを行うために使用していますものです:

LPARAMETERSは辞書です
lCommand.Parameters.AddRange(lParameters.Select(x => new SqlParameter(string.Format("@"+x.Key.ToString()), x.Value)).ToArray()); 

いいですか?


編集: [OK]を、私は文字列ビルダ、クエリを実行しているコードを作成するコードを追加します。 ここでは、すべての挿入クエリを含む文字列ビルダを作成します。

int lCurrentIndex = 0; 

     foreach (var litem in inCollection) 
     { 
      inSqlBuilder.AppendLine(string.Format(SQL.Insert, lPageCurrentIndex + 1, lPageCurrentIndex + 2, lPageCurrentIndex + 3)); 

      Guid TemplateIdentifier = new Guid(); 
      inDictionary.Add(lPageCurrentIndex + 1, ID); 
      inDictionary.Add(lPageCurrentIndex + 2, Name); 
      inDictionary.Add(lPageCurrentIndex + 3, Age); 

      lPageCurrentIndex += 3; 
     } 

クエリが作成された後、私はこれを行うには方法に来ています:

using (var lCommand = lConnection.CreateCommand()) 
        { 
         lCommand.Transaction = lTransaction; 
         lCommand.CommandTimeout = 300; 
         lCommand.CommandText = SqlBuilder.ToString(); 

          lCommand.Parameters.AddRange(lParameters.Select(x => new SqlParameter($"@x.Key", x.Value)).ToArray()); 
         if(SqlBuilder.Length>0) 
         await lCommand.ExecuteNonQueryAsync(); 
        } 
+0

であれば、単一引用符を置くことを忘れないでくださいあなたの辞書を教えてください。 – grmbl

+0

@grmbl辞書は次のように定義されています:var lParameters = new Dictionary ()、必要な情報がすべて含まれています:生成されるキーは1,2,3,4,5 ...です。 :ID、名前、年齢、ID、名前、年齢。例えば。 {1,1}、{2、 "Peter"}、{3、22}など –

+0

あなたのテーブルは実際に** TestDB **という名前ですか、これは誤字ですか?また、現在のC#でstring.formatを使用する必要はありません。代わりに '$" @ {x.Key} "'を実行することができます – Innat3

答えて

0

私はちょうどあなたのコードをテストし、それが正常に動作し、ここで私はそれをやった方法は次のとおりです。

//Sample data 
Dictionary<int, object> lParameters = new Dictionary<int, object>(); 
lParameters.Add(1, 1); 
lParameters.Add(2, "Peter"); 
lParameters.Add(3, 22); 
lParameters.Add(4, 2); 
lParameters.Add(5, "John"); 
lParameters.Add(6, 24); 
lParameters.Add(7, 3); 
lParameters.Add(8, "Glenn"); 
lParameters.Add(9, 33); 


using (SqlConnection conn = new SqlConnection(@"Your connection string")) 
{ 
    conn.Open(); 
    using (SqlCommand lCommand = new SqlCommand("query", conn)) 
    { 
     lCommand.Parameters.AddRange(
      lParameters.Select(x => new SqlParameter($"@{x.Key}", x.Value)).ToArray()); 

     for (int i = 1; i <= lParameters.Count; i+=3) 
     { 
      lCommand.CommandText = $"INSERT INTO[dbo].[TestDB]([ID], [Name], [Age]) 
            VALUES(@{i}, @{i + 1}, @{i + 2});";  
      lCommand.ExecuteNonQuery(); 
     } 
    } 
} 

したがって、パラメータを使用せずに各インデックスの辞書値を取得することを意味しますか?

using (SqlCommand lCommand = new SqlCommand("query", conn)) 
{ 
    for (int i = 1; i <= lParameters.Count; i += 3) 
    { 
     lCommand.CommandText = $"INSERT INTO[dbo].[TestDB]([ID], [Name], [Age]) 
       VALUES({lParameters[i]}, '{lParameters[i + 1]}', {lParameters[i + 2]});"; 
     lCommand.ExecuteNonQuery(); 
    } 
} 

OR単一の文字列に複数のクエリをロードし、それを実行するためのStringBuilderを使用して:

using (SqlConnection conn = new SqlConnection(connstring)) 
{ 
    conn.Open(); 
    StringBuilder query = new StringBuilder(); 
    for (int i = 1; i <= lParameters.Count; i += 3) 
     query.Append($"INSERT INTO[dbo].[TestDB]([ID], [Name], [Age]) 
        VALUES({lParameters[i]}, '{lParameters[i + 1]}', {lParameters[i + 2]});"); 

    using (SqlCommand lCommand = new SqlCommand(query.ToString(), conn)) 
     lCommand.ExecuteNonQuery(); 
} 

ただ、フィールドが文字列

+0

私は理解しています。しかし、私はこのようなコマンドのテキストを作成しようとしています。 INSERT INTO [dbo]。[TestDB]([ID]、[Name]、[Age])VALUES(@ 1、@ 2、@ 3);INSERT INTO [dbo]。[TestDB]([ID]、[名前]、[年齢])VALUES(@ 4、@ 5、@ 6); INSERT INTO [dbo]。[TestDB]([ID]、[名前]、[年齢])VALUES(@ 7、@ 8、@ 9); @ 1、@ 2、@ 3は、指定されたキーからの辞書の値になります。たとえば、キー= 1の場合は辞書にあるID(例:1)を与え、キー= 2の場合は辞書の名前をPeterに与えます。例えば –

+0

ですが、ExecuteNonQueryのコマンドCommandTestが完了したら、そのテーブルのすべての挿入が完了します。 –

+0

@AlexandruFlorinはい、これは私が最後のコードサンプルで行ったことです。それであなたの問題が何であるか把握しましたか? – Innat3

関連する問題