Usando SqlDataAdapter para insertar una fila

Quiero insertar una fila en la base de datos usando SqlDataAdapter. Tengo 2 tablas (Custormers & Orders) en la base de datos CustomerOrders y tengo más de mil registros. Quiero crear una GUI (TextBoxes) para agregar nuevos clientes y pedidos en la Base de datos a sus respectivas tablas.

  • ¿Cómo debería hacerlo?

Supongo que el método que generalmente se sigue es

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

Ahora tome los valores de las cajas de texto (o use DataBinding) para agregar una nueva fila en el dataSet y llame

  da.Update(dataSet); 

Pero la pregunta es ¿Por qué debería buscar todos los demás registros en dataSet usando da.Fill (dataSet) en primer lugar? Solo quiero agregar un nuevo registro.

Para este propósito, lo que estoy haciendo es crear el esquema de la base de datos en el conjunto de datos. Me gusta esto:

  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"]); 

Utilicé DataBinding para vincular estas columnas a los cuadros de texto respectivos. ¡Ahora estoy confundido! ¿Qué debería hacer después? ¿Cómo usar el comando Insertar? Porque no di ningún dataAdapter.SelectCommand para que dataAdapter.Update () no funcione, supongo. Por favor sugiere un enfoque correcto.

Establezca el comando de selección con un filtro “0 = 1” y use un SqlCommandBuilder para que el comando de inserción se genere automáticamente para usted.

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

Puede completar el conjunto de dataSet con un conjunto vacío, por ejemplo:

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

Luego agrega sus filas y llama a la actualización.

Para este escenario, aunque probablemente sería mejor no usar SqlDataAdapter . En su lugar, utilice el objeto SqlCommand directamente para la inserción. (Mejor aún, use LINQ to SQL o cualquier otro ORM)

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

Tengo que hacerlo la primera vez. Puedes probarlo . Funciona bien.