2009-10-27 6 views
20

Je souhaite insérer une ligne dans la base de données à l'aide de SqlDataAdapter. J'ai 2 tables (Custormers & Commandes) dans la base de données CustomerOrders et a plus de milliers d'enregistrements. Je veux créer une interface graphique (TextBoxes) pour ajouter de nouvelles commandes client & dans la base de données à leurs tables respectives.Utilisation de SqlDataAdapter pour insérer une ligne

  • Comment dois-je faire?

Je suppose que la méthode qui est habituellement suivi est

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

Maintenant, prenez les valeurs de textboxes (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. Pour ce faire, je crée le schéma de la base de données dans le DataSet. comme ceci:

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 pas donné de dataAdapter.SelectCommand afin que dataAdapter.Update() ne fonctionne pas, je suppose. Veuillez suggérer une approche correcte

Répondre

32

Définissez la commande de sélection avec un filtre "0 = 1" et utilisez un SqlCommandBuilder pour que la commande d'insertion soit générée automatiquement 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); 
+0

Que "OERE 0 = 1" était une bouée de sauvetage. (Chargement d'une table de médias de 2 Go en mémoire ... soupir ..) – pkExec

+4

Je m'intéressais à la ligne 'new SqlCommandBuilder (dataAdapter);' - cela rend un peu de magie, donc je n'ai pas besoin de script l'ensemble de l'INSERT déclarations. Merci! –

+0

dataSet.Tables ["Customers"]. Add (newRow); ne compile pas. "System.Data.DataTable ne contient pas de définition pour 'Ajouter'". Voulez-vous dire dataSet.Tables [tableName] .Rows.Add (newRow) ;? –

7

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 appellent la mise à jour. Pour ce scénario, il serait probablement préférable de ne pas utiliser SqlDataAdapter. Au lieu de cela, utilisez l'objet SqlCommand directement pour l'insertion. (Encore mieux, utilisez LINQ to SQL ou tout autre ORM)

+0

Je pensais à ça. Mais j'ai un formulaire contenant plus de 200 colonnes de texte. Donc, j'ai opté pour cela. – claws

+0

@Manu cela ne fonctionnera pas si l'Id utilise des valeurs négatives - vous pourriez obtenir 1 ligne retournée. Les réponses de Nathan assure 0 lignes retournées. Cependant, il fait encore un voyage db. – Ken

-3
SqlConnection con = new SqlConnection("Data Source=(local);Initial Catalog=test;Integrated Security=True"); 
SqlDataAdapter da=new SqlDataAdapter("Insert Into Employee values("+textBox1.Text+",'"+textBox2.Text+"','"+textBox3.Text+"',"+textBox4.Text+")",con); 
DataSet ds = new DataSet(); 
da.Fill(ds); 

que je dois faire première fois. Tu peux l'essayer . Ça marche bien.

Questions connexes