2017-03-28 5 views
3

Si je veux insérer plusieurs objets dans une base de données SQL Server, il semble que je dois faire:Y a-t-il un moyen moins tortueux de S'INSCRIRE?

 using (var command = new SqlCommand(@"INSERT INTO Table1 (
      Param_1, 
      Param_2, 
      Param_3, 
      ... 
      ) 
      VALUES (
      @param1, 
      @param2, 
      @param3, 
      ... 
      )",conn)) 
      { 
       command.Params.Add("@param1",...); 
       command.Params.Add("@param2",...); 
       command.Params.Add("@param3",...); 
       ... 
       foreach(var o in objects) 
       { 
       command.Params["@param1"].Value = o.Param1; 
       command.Params["@param2"].Value = o.Param2; 
       command.Params["@param3"].Value = o.Param3; 
       ... 
       command.ExecuteNonQuery(); 
       } 
      } 

mettre juste cela ensemble m'a tirant mes cheveux, et j'ai une table avec 28 champs. Je dois écrire cette longue liste 4 fois séparées, avec seulement les différences les plus triviales (les noms de champs DB peuvent utiliser une convention de nommage différente). Cela semble fou. Y a-t-il un moyen plus court?

Entity Framework n'est pas une option pour moi ici qui aurait été mon premier choix, je dois rouler le code.

+3

Pourriez-vous utiliser [Dapper] (https://github.com/StackExchange/Dapper)? – juharr

+0

Je n'en avais jamais entendu parler auparavant; Je ne suis pas trop enthousiaste à l'idée d'ajouter des dépendances supplémentaires. –

+0

Je suis habitué à utiliser xml pour transmettre un objet ou un objet liste ayant de nombreuses propriétés. Vous pouvez sérialiser l'objet en C# pour le ficeler et le désérialiser en sql – TriV

Répondre

3

Si vous êtes totalement contre l'utilisation de bibliothèques externes, qu'en pensez-vous?

void Insert (Dictionary <string, SqlType> cols, Object [] objects) 
{ 
    string colNames = string.Join (",", cols.Keys); 
    string paramNames = string.Join (",", cols.Keys.Select (c=>"@"+c)); 

    using (var command = new SqlCommand(@"INSERT INTO Table1 (" + colNames + 
      ") VALUES (" + paramNames + ")",conn)) 
    { 
      foreach (var col in cols) 
      { 
      command.Params.Add("@" + col.Key, col.Value); 
      } 

      foreach(var o in objects) 
      { 
      // Here you would have to list them all unless 
      // your object o is a Dictionary<string, object> or a DataRow. 
      command.Params["@param1"].Value = o.Param1; 
      command.Params["@param2"].Value = o.Param2; 
      command.Params["@param3"].Value = o.Param3; 
      ... 
      command.ExecuteNonQuery(); 
      } 
    } 
} 
+0

Si vous voulez créer un tel dictionnaire, pourquoi ne pas créer un DataTable et utiliser SqlBulkCopy ou un TVP? Cela évitera de boucler, de spécifier les paramètres et d'améliorer les performances –