2009-10-27 34 views
20

Tôi muốn chèn một hàng vào Cơ sở dữ liệu bằng SqlDataAdapter. Tôi đã có 2 bảng (Custormers & Orders) trong cơ sở dữ liệu CustomerOrders và có hơn nghìn bản ghi. Tôi muốn tạo một GUI (TextBoxes) để thêm khách hàng mới & các đơn đặt hàng vào Cơ sở dữ liệu cho các bảng tương ứng của họ.Sử dụng SqlDataAdapter để chèn một hàng

  • Tôi nên làm như thế nào?

Tôi đoán phương pháp thường được theo sau là

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

Bây giờ lấy các giá trị từ textbox (hoặc sử dụng DataBinding) để thêm một hàng mới vào DataSet và gọi

da.Update(dataSet); 

Nhưng câu hỏi là tại sao tôi nên lấy tất cả các bản ghi khác vào dataSet bằng cách sử dụng da.Fill (dataSet) ở nơi đầu tiên? Tôi chỉ muốn thêm một bản ghi mới.

Với mục đích này, những gì tôi đang làm là, Tạo giản đồ của Cơ sở dữ liệu trong Tập dữ liệu. như thế này:

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

Tôi đã sử dụng DataBinding để liên kết các cột này với các hộp văn bản tương ứng. Bây giờ tôi đang bối rối! Tôi nên làm gì tiếp theo? Làm thế nào để sử dụng lệnh Chèn? Bởi vì tôi đã không cung cấp cho bất kỳ dataAdapter.SelectCommand do đó dataAdapter.Update() wont làm việc tôi đoán. Vui lòng đề xuất phương pháp tiếp cận chính xác.

Trả lời

32

Đặt lệnh chọn với bộ lọc "0 = 1" và sử dụng SqlCommandBuilder để lệnh chèn được tạo tự động cho bạn.

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

Đó là "WHERE 0 = 1" là một phao cứu sinh. (Đang tải một bảng phương tiện 2GB vào bộ nhớ ... tiếng thở dài ..) – pkExec

+4

Tôi đã quan tâm đến dòng lệnh mới 'SqlCommandBuilder (dataAdapter);' - điều đó làm cho một số phép thuật xảy ra vì vậy tôi không phải viết toàn bộ lệnh INSERT các câu lệnh. Cảm ơn! –

+0

dataSet.Tables ["Customers"] Thêm (newRow); không biên dịch. "System.Data.DataTable không chứa định nghĩa cho 'Thêm'". Bạn có nghĩa là dataSet.Tables [tableName] .Rows.Add (newRow) ;? –

7

Bạn có thể điền vào dataSet với một tập rỗng ví dụ .:

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

Sau đó, bạn thêm hàng của bạn và gọi cập nhật.

Đối với kịch bản này, mặc dù có thể tốt hơn là không sử dụng SqlDataAdapter. Thay vào đó hãy sử dụng trực tiếp đối tượng SqlCommand để chèn. (Thậm chí tốt hơn, sử dụng LINQ to SQL hoặc bất kỳ ORM nào khác)

+0

Tôi đã nghĩ về điều đó. Nhưng tôi đã có một hình thức kết hợp hơn 200 cột văn bản. Vì vậy, tôi đã chọn điều này. – claws

+0

@Manu điều này sẽ không hoạt động nếu Id sử dụng giá trị âm - bạn có thể nhận được 1 hàng trả về. Các câu trả lời của Nathans đảm bảo 0 hàng được trả về. Tuy nhiên nó vẫn làm cho một chuyến đi 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); 

tôi phải làm lần đầu tiên. Bạn có thể thử nó. Nó hoạt động tốt.

Các vấn đề liên quan