web-dev-qa-db-fra.com

Utilisation de SqlDataAdapter pour insérer une ligne

Je veux insérer une ligne dans la base de données à l'aide de SqlDataAdapter. J'ai 2 tables (Custormers & Orders) dans la base de données CustomerOrders et a plus de mille enregistrements. Je veux créer une interface graphique (TextBoxes) pour ajouter de nouveaux clients et commandes dans la base de données à leurs tables respectives.

  • Comment dois-je procéder?

Je suppose que la méthode qui est généralement suivie est

dataAdapter = new SqlDataAdapter (sqlQuery, conn);
dataSet = new DataSet();
da.Fill(dataSet);

Maintenant, prenez les valeurs des zones de texte (ou utilisez DataBinding) pour ajouter une nouvelle ligne dans le dataSet et appelez

  da.Update(dataSet);

Mais la question est pourquoi devrais-je récupérer tous les autres enregistrements dans dataSet en utilisant da.Fill (dataSet) en premier lieu? Je veux juste ajouter un seul nouvel enregistrement.

Dans ce but, ce que je fais est de créer le schéma de la base de données dans le DataSet. comme ça:

  DataSet customerOrders = new DataSet("CustomerOrders");

  DataTable customers = customerOrders.Tables.Add("Customers");
  DataTable orders = customerOrders.Tables.Add("Orders");

  customers.Columns.Add("CustomerID", Type.GetType("System.Int32"));
  customers.Columns.Add("FirstName", Type.GetType("System.String"));
  customers.Columns.Add("LastName", Type.GetType("System.String"));
  customers.Columns.Add("Phone", Type.GetType("System.String"));
  customers.Columns.Add("Email", Type.GetType("System.String"));

  orders.Columns.Add("CustomerID", Type.GetType("System.Int32"));
  orders.Columns.Add("OrderID", Type.GetType("System.Int32"));
  orders.Columns.Add("OrderAmount", Type.GetType("System.Double"));
  orders.Columns.Add("OrderDate", Type.GetType("System.DateTime"));

  customerOrders.Relations.Add("Cust_Order_Rel", customerOrders.Tables["Customers"].Columns["CustomerID"], customerOrders.Tables["Orders"].Columns["CustomerID"]);   

J'ai utilisé DataBinding pour lier ces colonnes aux zones de texte respectives. Maintenant, je suis confus! Que devrais-je faire ensuite? Comment utiliser la commande Insérer? Parce que je n'ai donné aucun dataAdapter.SelectCommand donc dataAdapter.Update () ne fonctionnera pas, je suppose. Veuillez suggérer une approche correcte.

25
claws

Définissez la commande de sélection avec un filtre "0 = 1" et utilisez un SqlCommandBuilder pour que la commande d'insertion soit automatiquement générée pour vous.

var sqlQuery = "select * from Customers where 0 = 1";
dataAdapter = new SqlDataAdapter(sqlQuery, conn);
dataSet = new DataSet();
dataAdapter.Fill(dataSet);

var newRow = dataSet.Tables["Customers"].NewRow();
newRow["CustomerID"] = 55;
dataSet.Tables["Customers"].Rows.Add(newRow);

new SqlCommandBuilder(dataAdapter);
dataAdapter.Update(dataSet);
43
Nathan Baulch

Vous pouvez remplir le dataSet avec un ensemble vide, par exemple:

da = new SqlDataAdapter ("SELECT * FROM Customers WHERE id = -1", conn);
dataSet = new DataSet();
da.Fill(dataSet);

Ensuite, vous ajoutez vos lignes et appelez la mise à jour.

Pour ce scénario, il serait probablement préférable de ne pas utiliser SqlDataAdapter. Utilisez plutôt l'objet SqlCommand directement pour l'insertion. (Encore mieux, utilisez LINQ to SQL ou tout autre ORM)

7
Manu