2017-04-01 57 views
-2

textboxgridviewを動的に生成したデータをデータベースに挿入しようとしています。しかし、私はCommandTextプロパティの例外はあなたがStringBuilderにあなたのクエリの最初の部分をロードしていないcmd.executeNonQuery();ExecuteNonQuery:CommandTextプロパティがCで初期化されていません。

private void InsertRecords(StringCollection sc) 
{ 
    StringBuilder sb = new StringBuilder(string.Empty); 
    string[] splitItems = null; 
    const string sqlStatement = "INSERT INTO Ingredients_List (Ingredients1) VALUES"; 
    foreach (string item in sc) 
    { 
     if (item.Contains(",")) 
     { 
      splitItems = item.Split(",".ToCharArray()); 
      sb.AppendFormat("{0}('{1}'); ", sqlStatement, splitItems[0]); 
     } 

    } 
    // conn.Open(); 
    using (SqlConnection connn = new SqlConnection(GetConnectionString())) 

    { 
     using (SqlCommand cmd = new SqlCommand(sb.ToString(), connn)) 
     { 
      connn.Open(); 
      //  cmd.CommandType = CommandType.Text; 
      cmd.ExecuteNonQuery(); 
      connn.Close(); 
     } 
     // Page.ClientScript.RegisterClientScriptBlock(typeof(Page), "Script", "alert('Records Successfuly Saved!');", true); 
    } 
} 
+0

を()を使用して、あなたに異なるアプローチを提案することを好みますか? – Baahubali

+1

1)StringBuilderにsqlStatementを追加していません 2)項目に項目がない場合は、データベースに挿入しません。 3)パラメータ化されたクエリを使用してください。それはより安全です。あなたの現在の方法は、SQLインジェクションに対して広く開いています。 – john

+0

私は何をしようとしているのは、動的なテキストボックスのonClickイベントを作成し、データベースにデータを保存することです。どのようにパラメータ化されたクエリを使用するのですか?私はこの例を使用しています。http://www.c-sharpcorner.com/uploadfile/8c19e8/dynamically-adding-and-deleting-rows-in-gridview-and-saving/ –

答えて

-1

を初期化されていません取得しています。試してみてください:

private void InsertRecords(StringCollection sc) 
{ 
    const string sqlStatement = "INSERT INTO Ingredients_List (Ingredients1) VALUES"; 
    StringBuilder sb = new StringBuilder(sqlStatement); 
    string[] splitItems = null; 
    foreach (string item in sc) 
    { 
     if (item.Contains(",")) 
     { 
      splitItems = item.Split(",".ToCharArray()); 
      sb.AppendFormat("{0}('{1}'); ", sqlStatement, splitItems[0]); 
     } 
    } 
    // conn.Open(); 
    using (SqlConnection connn = new SqlConnection(GetConnectionString())) 
    { 
     using (SqlCommand cmd = new SqlCommand(sb.ToString(), connn)) 
     { 
      connn.Open(); 
      //  cmd.CommandType = CommandType.Text; 
      cmd.ExecuteNonQuery(); 
      connn.Close(); 
     } 
     // Page.ClientScript.RegisterClientScriptBlock(typeof(Page), "Script", "alert('Records Successfuly Saved!');", true); 
    } 
} 

EDIT - 私はテストデータベースを構築し、次のコードをデバッグしました。それは私が渡したテストデータのために働く。

private void InsertRecords(StringCollection sc) 
    { 
     const string sqlStatement = "INSERT INTO Ingredients_List (Ingredients1) VALUES"; 
     StringBuilder sb = new StringBuilder(); 

     foreach (string item in sc) 
     { 
      if (item.Contains(",")) 
      { 
       var splitItems = item.Split(",".ToCharArray()); 
       sb.AppendFormat("{0}('{1}'); ", sqlStatement, splitItems[0]); 
      } 

     } 
     Console.WriteLine(sb.ToString()); 
     // conn.Open(); 
     using (SqlConnection connn = new SqlConnection(ConfigurationManager.ConnectionStrings["whatever"].ConnectionString)) 

     { 
      using (SqlCommand cmd = new SqlCommand(sb.ToString(), connn)) 
      { 
       connn.Open(); 
       cmd.ExecuteNonQuery(); 
       connn.Close(); 
      } 
      // Page.ClientScript.RegisterClientScriptBlock(typeof(Page), "Script", "alert('Records Successfuly Saved!');", true); 
     } 
    } 

次のように私はそれをテスト:次のようにデータベースクエリの

... 
var collection = new StringCollection{"a,x", "b,y", "c,z"}; 

InsertRecords(collection); 

実行されるデータを参照するには、次のとおりです。

SELECT [Ingredients1] 
    FROM [Ingredients_List] 

結果:

Ingredients1 
------------ 
a 
b 
c 
+0

今度は値の近くに不正な構文があります –

+0

クエリを実行する前に 'StringBuilder'の内容をダンプして、クエリが実行されることを正確に確認します。私はあなたがこの機能に何を渡しているのか分かりませんし、あなたを助けるために最善を尽くしていますが、私はあなたが好きなら私の答えを削除してうれしいです。 – STLDeveloper

+1

varコレクション= new StringCollection {"a"、 "b"、 "c"}; – Steve

2

あなたの問題あなたがチェックしていないという事実が原因ですループの後で、StringBuilderに何かを挿入した場合。コンマで文字列がない場合、foreach文の内部条件は、stringbuilderを空のままにして、コマンドは決して適切なコマンドテキストを持ちません。

この問題を回避するには、StringBuilderの内部のいくつかのテキストがあるかどうかを確認するためのテストを追加するような単純でなければなりませんが、私は戻って何がsb.tostringさList<SqlParameter>

StringBuilder sb = new StringBuilder(string.Empty); 
List<SqlParameter> prms = new List<SqlParameter>(); 
string[] splitItems = null; 

// Base string for creating parameter placeholders dynamically 
string sqlStatement = "INSERT INTO Ingredients_List (Ingredients1) VALUES (@p{0});"; 

int count = 1; 
foreach (string item in sc) 
{ 
    if (item.Contains(",")) 
    { 
     splitItems = item.Split(','); 

     // Parameter name created dynamically 
     prms.Add(new SqlParameter($"@p{count}", SqlDbType.NVarChar) {Value=splitItems[0]}); 

     // Create the placeholder for the nth parameter 
     sb.AppendFormat(sqlStatement, count); 
    } 
} 

// Don't execute anything if there are no parameters (or stringbuilder empty) 
if(prms.Count > 0) 
{ 
    using (SqlConnection connn = new SqlConnection(GetConnectionString())) 
    using (SqlCommand cmd = new SqlCommand(sb.ToString(), connn)) 
    { 
     connn.Open(); 

     // Add all parameters together 
     cmd.Parameters.AddRange(prms); 
     cmd.ExecuteNonQuery(); 
    } 
} 
関連する問題