2009-10-27 5 views
20

SqlDataAdapter를 사용하여 데이터베이스에 행을 삽입하려고합니다. CustomerOrders 데이터베이스에 2 개의 테이블 (Custormers & Orders)이 있으며 1,000 개가 넘는 레코드가 있습니다. 새로운 고객 & 주문을 데이터베이스에 추가하기위한 GUI (TextBoxes)를 각각의 테이블에 만들고 싶습니다.SqlDataAdapter를 사용하여 행 삽입

  • 어떻게해야합니까?

나는 보통 다음에 방법을

dataAdapter = new SqlDataAdapter (sqlQuery, conn); 
dataSet = new DataSet(); 
da.Fill(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"필터로 select 명령을 설정하고 SqlCommandBuilder을 사용하면 insert 명령이 자동으로 생성됩니다.

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

+4

'new SqlCommandBuilder (dataAdapter);'라는 라인에 흥미가있어 - 어떤 마술이 일어나서 INSERT 전체를 스크립트 할 필요가 없다. 진술. 감사! –

+0

dataSet.Tables [ "Customers"]. (newRow)를 추가하십시오. 컴파일되지 않습니다. "System.Data.DataTable에 'Add'에 대한 정의가 없습니다. dataSet.Tables [tableName] .Rows.Add (newRow);를 의미합니까? –

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 개가 넘는 Text Columns를 가지고있는 형식을 가지고있다. 그래서 나는 이것을 선택했다. – claws

+0

@Manu ID가 음수 값을 사용하면이 기능이 작동하지 않습니다. 1 행이 반환 될 수 있습니다. Nathans 응답은 반환 된 0 행을 보장합니다. 그러나 그것은 여전히 ​​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); 

나는 처음해야한다. 너도해볼 수있어. 잘 작동한다.