2017-04-01 4 views
-2

J'essaie d'insérer des données générées dynamiquement textbox de gridview dans la base de données. cependant, je reçois l'exception de la propriété CommandText n'a pas été initialisé cmd.executeNonQuery();ExecuteNonQuery: la propriété CommandText n'a pas été initialisée dans 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

ce qui est sb.ToString() retour? – Baahubali

+1

1) Vous n'ajoutez pas le sqlStatement au StringBuilder 2) À moins qu'il n'y ait un, dans l'élément, vous ne l'insérerez pas dans la base de données. 3) Veuillez utiliser des requêtes paramétrées. C'est plus sûr. Votre méthode actuelle est largement ouverte à l'injection SQL. – john

+0

Ce que j'essaie de faire est de créer un événement onClick dynamique de la zone de texte, puis d'enregistrer des données dans la base de données. alors comment utiliser une requête paramétrée pour cela? J'utilise cet exemple http://www.c-sharpcorner.com/uploadfile/8c19e8/dynamically-adding-and-deleting-rows-in-gridview-and-saving/ –

Répondre

-1

Vous n'êtes pas charger la première partie de votre requête dans le StringBuilder. Essayez ceci:

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 - J'ai construit une base de données de test et j'ai débogué le code suivant. Cela fonctionne pour les données de test que je lui ai transmises.

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

Je l'ai testé comme suit:

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

InsertRecords(collection); 

exécution de la requête de base de données pour les données est la suivante:

SELECT [Ingredients1] 
    FROM [Ingredients_List] 

Résultats:

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

Maintenant, il dit que la syntaxe est proche des valeurs –

+0

Videz le contenu de 'StringBuilder' avant d'exécuter la requête pour voir exactement ce que la requête va être exécutée. Je ne sais pas ce que vous passez dans cette fonction, et je fais de mon mieux pour vous aider, mais je suis heureux de supprimer ma réponse si vous le souhaitez. – STLDeveloper

+1

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

2

Votre problème est causé par le fait que vous ne vérifiez pas Si, après la boucle, vous avez inséré quelque chose dans StringBuilder. Dans le cas d'aucune chaîne avec des virgules, la condition interne dans l'instruction foreach, laisse le stringbuilder vide et la commande n'aura jamais un texte de commande correct.

La solution doit être simple comme l'ajout d'un test pour voir s'il y a un texte à l'intérieur du StringBuilder mais je préfère vous proposer une approche différente à l'aide d'un 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(); 
    } 
}