2014-02-19 2 views
2

내 MS SQL 테이블을 업데이트하기 위해 일부 VB.NET 코드를 가져 오는 데 문제가 있습니다.SqlDataAdapter.Update가 SQL 테이블을 업데이트하지 않습니다.

Imports System.Data.SqlClient 

Module Module1 

    Sub Main() 
     Dim myConn As New SqlConnection("<myconnstring>") 

     Dim myDA As New SqlDataAdapter("SELECT * FROM TestTable WHERE 1=2", myConn) 

     Dim myTable As New DataTable 
     myDA.Fill(myTable) 

     Dim myRow As DataRow 

     myRow = myTable.NewRow 
     myRow("IntField") = 4 
     myRow("TextField") = "loik" 
     myTable.Rows.Add(myRow) 
     myRow.AcceptChanges() 
     myRow.SetAdded() 

     myRow = myTable.NewRow 
     myRow("IntField") = 3 
     myRow("TextField") = "poiuy" 
     myTable.Rows.Add(myRow) 
     myRow.AcceptChanges() 
     myRow.SetModified() 

     Dim myCB As New SqlCommandBuilder(myDA) 
     ' My changes should overwrite whatever is already in the database 
     myCB.ConflictOption = ConflictOption.OverwriteChanges 

     Debug.Print(myCB.GetInsertCommand.CommandText) 
     Debug.Print(myCB.GetUpdateCommand.CommandText) 
     Debug.Print(myDA.Update(myTable)) 

    End Sub 

End Module 

이 처음 TestTable가 IntField가있다 (다음과 같습니다 : 실제 프로그램에서

DataTable의가 XML 직렬화 DataTable을 같은 파일에서 읽습니다,하지만 난 다음에 아래 문제의 코드를 감소

테이블에 기본 키) : 나는이 프로그램을 실행 한 후

IntField TextField 
--------------------- 
1   qwert 
2   asdfg 
3   zxcvb 

는 TestTable은 다음과 같습니다

IntField TextField 
--------------------- 
1   qwert 
2   asdfg 
3   zxcvb 
4   loik 

새 레코드 (IntField = 4)가 올바르게 추가되지만 업데이트 된 레코드 (IntField = 3)에는 TextField에 새 값이 포함되지 않습니다.

프로그램 (3 개 디버그 라인)의 출력은 다음과 같습니다

: 나는 또한 (프로파일 사용) SQL Server에서 추적을 만들었습니다,이 유일한 문이 실행
INSERT INTO [TestTable] ([IntField], [TextField]) VALUES (@p1, @p2) 
UPDATE [TestTable] SET [IntField] = @p1, [TextField] = @p2 WHERE (([IntField] = @p3)) 
2 

SELECT * FROM TestTable WHERE 1=2 
SET FMTONLY OFF; SET NO_BROWSETABLE ON; SET FMTONLY ON;SELECT * FROM TestTable WHERE 1=2 SET FMTONLY OFF; SET NO_BROWSETABLE OFF; 
exec sp_executesql N'INSERT INTO [TestTable] ([IntField], [TextField]) VALUES (@p1, @p2)',N'@p1 int,@p2 nvarchar(4)',@p1=4,@p2=N'loik' 

그래서 어떤 이유로 든 코드가 SQL 테이블의 업데이트 된 레코드를 업데이트하지 않기로 결정한 것 같습니다. 오류가 발생하지 않고 이것이 많은 혼란을 겪습니다.

답변

0

행을 업데이트하려면 해당 행을 검색 한 다음 업데이트해야한다고 생각합니다. "intField"가 고유하다고 가정하면이 작업을 수행 할 수 있습니다. 이것은 C#이지만 아이디어가 있어야합니다.

//find intField row  
DataRow[] Rows = MydataTable.Select("IntField=3"); 

Rows[0]["TextField"] = "poiuy"; 
MydataTable.AcceptChanges(); 
+0

실제 프로그램에서 내 DataTable은 XML 파일 (직렬화 된 DataTable)에서 읽고 DataAdapter는 SQL 데이터베이스의 테이블 (동일한 스키마 사용)에 바인딩됩니다. 그리고이 테이블은 많은 수의 필드와 많은 레코드를 포함 할 수 있습니다. 그것이 특정 레코드를 변경하기 위해 SQL 테이블을 메모리에로드하지 않는 것을 선호하는 이유 중 하나입니다. 저를 혼란스럽게하는 것은 UpdateCommand 문이 올바로 보이고 InsertStatement가 그대로 작동해야하며 DataAdapter.Update를 호출 한 후에 DataTable의 모든 행에 대한 RowState는 변경되지 않습니다. –

+0

DataAdapter.Update 호출에서 실패하는 것처럼 보입니다. –

+0

본 적이 있습니까? http://stackoverflow.com/questions/7126356/sqldataadapter-not-updating –

관련 문제