2017-04-01 131 views
-2

我試圖從動態生成的textboxgridview數據庫中插入數據。但是,我越來越CommandText財產除外尚未初始化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

什麼sb.tostring()建議你採用不同的方法? – Baahubali

+1

1)你不是將sqlStatement追加到StringBuilder中 2)除非項目中有一個,否則不會將其插入到數據庫中。 3)請使用參數化查詢。這更安全。您當前的方法對SQL注入敞開大門。 – john

+0

我想要做的是創建動態文本框onClick事件,然後將數據保存到數據庫。那麼如何使用參數化查詢呢?我正在使用這個例子http://www.c-sharpcorner.com/uploadfile/8c19e8/dynamically-adding-and-deleting-rows-in-gridview-and-saving/ –

回答

-1

你不加載您的查詢的第一部分爲StringBuilder。試試這個:

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

編輯 - 我已經構建了一個測試數據庫並調試了下面的代碼。它適用於我通過它的測試數據。

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 collection = new StringCollection {「a」,「b」,「c」}; – Steve

2

你的問題是由於你沒有檢查的事實造成的如果在循環之後,你已經在StringBuilder中插入了任何東西。如果沒有帶逗號的字符串,那麼將內部條件放入foreach語句中,將stringbuilder保留爲空,並且命令永遠不會有正確的命令文本。

的解決方法應該是簡單的像添加一個測試,看看是否有StringBuilder的裏面的一些文字,但我更喜歡使用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(); 
    } 
} 
返回
相關問題