2009-10-27 26 views
20

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

  • ¿Cómo debo hacerlo?

supongo que el método que se sigue normalmente se

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

Ahora toma los valores de los cuadros de texto (o utilizar DataBinding) para añadir una nueva fila en el conjunto de datos y llamar a

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. como este:

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

He utilizado DataBinding para unir 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.

Respuesta

32

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.

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

Ese "DONDE 0 = 1" era un salvavidas. (Cargando una tabla de medios de 2GB en la memoria ... suspiro ...) – pkExec

+4

Estaba interesado en la línea 'new SqlCommandBuilder (dataAdapter);' - eso hace que ocurra algo de magia, así que no tengo que escribir todo el INSERT declaraciones. ¡Gracias! –

+0

dataSet.Tables ["Clientes"]. Agregar (newRow); no compila "System.Data.DataTable no contiene una definición para 'Agregar'". ¿Te refieres a dataSet.Tables [tableName] .Rows.Add (newRow) ;? –

7

puedes llenar el dataSet con un conjunto vacío ej .:

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

A continuación, añadir sus filas y llamar al día.

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

+0

Lo pensé. Pero tengo un formulario que contiene más de 200 Text Columns. Entonces, opté por esto. – claws

+0

@Manu esto no funcionará si el Id usa valores negativos; es posible que obtenga 1 fila devuelta. Las respuestas de Nathans aseguran 0 filas devueltas. Sin embargo, todavía hace un viaje 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 tengo que hacer por primera vez. Puedes probarlo . Funciona bien.

Cuestiones relacionadas