2009-10-27 61 views
20

我想用SqlDataAdapter在數據庫中插入一行。我在CustomerOrders數據庫中有兩個表格(Custormers & Orders),並有超過一千條記錄。我想創建一個圖形用戶界面(文本框),用於將新客戶&訂單添加到數據庫到其各自的表中。使用SqlDataAdapter插入一行

  • 我應該怎麼做?

我想這通常是跟着方法

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

現在把這些值從文本框(或使用數據綁定)來添加一個新行到DataSet,並調用

da.Update(dataSet); 

但問題是爲什麼我應該首先使用da.Fill(dataSet)將所有其他記錄提取到dataSet中?我只想添加一個新的記錄。

爲此,我正在做的是在DataSet中創建數據庫的模式。像這樣:

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

我使用DataBinding將這些列綁定到相應的文本框。 現在我很困惑!接下來我應該做什麼?如何使用插入命令?因爲我沒有給任何dataAdapter.SelectCommand所以dataAdapter.Update()不會工作我猜。請建議一個正確的方法。

回答

32

用「0 = 1」過濾器設置選擇命令並使用SqlCommandBuilder,以便爲您自動生成插入命令。

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

「WHERE 0 = 1」是救生員。 (將2GB的媒體表加載到內存中......嘆息..) – pkExec 2013-01-14 09:50:45

+4

我對'new SqlCommandBuilder(dataAdapter)'這行感興趣 - '這讓一些奇蹟發生了,所以我不必編寫整個INSERT聲明。謝謝! – 2015-03-02 10:34:19

+0

dataSet.Tables [「Customers」] .Add(newRow);不編譯。 「System.Data.DataTable不包含'Add'的定義。你的意思是dataSet.Tables [tableName] .Rows.Add(newRow);? – 2015-08-14 04:56:00

7

你可以用一組空例如爲:

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

然後添加你行,並調用更新填補dataSet

對於這種情況,儘管最好不要使用SqlDataAdapter。請直接使用SqlCommand對象進行插入。 (更好的是,使用LINQ to SQL或任何其他ORM)

+0

我想到了。但是我有一個包含200多個文本列的表單。所以,我選擇了這個。 – claws 2009-10-27 19:40:44

+0

@Manu如果Id使用負值,這將不起作用 - 您可能會返回1行。 Nathans答案確保返回0行。不過,它仍然是一個數據庫之旅。 – Ken 2016-10-22 13:30:27

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

我必須做的第一次。你可以嘗試一下 。它運作良好。