2017-04-01 87 views
-2

textbox의 데이터를 gridview에 동적으로 생성하려고합니다. 그러나, 나는 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 - 저는 다음과 같은 코드를 디버깅하고 테스트 데이터베이스를 작성했습니다. 그것은 통과 한 테스트 데이터에 대해 작동합니다.

SELECT [Ingredients1] 
    FROM [Ingredients_List] 

결과 :

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

이제는 값 근처에서 잘못된 구문을 말합니다. –

+0

쿼리를 실행하기 전에'StringBuilder'의 내용을 덤프하여 정확히 어떤 쿼리가 실행되는지 확인하십시오. 나는이 함수에 무엇이 전달되는지 모르며, 당신을 도우려고 최선을 다하고 있지만, 원한다면 내 대답을 삭제해도 행복하다. – STLDeveloper

+1

var collection = new StringCollection { "a", "b", "c"}; – Steve

2

문제를 다음과 같이 데이터를 볼 수있는 데이터베이스 쿼리의

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

InsertRecords(collection); 

실행은 다음과 같이

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

나는 그것을 테스트 귀하가 확인하지 않은 사실로 인해 발생합니다. 루프 뒤에서 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(); 
    } 
}