내 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 테이블의 업데이트 된 레코드를 업데이트하지 않기로 결정한 것 같습니다. 오류가 발생하지 않고 이것이 많은 혼란을 겪습니다.
실제 프로그램에서 내 DataTable은 XML 파일 (직렬화 된 DataTable)에서 읽고 DataAdapter는 SQL 데이터베이스의 테이블 (동일한 스키마 사용)에 바인딩됩니다. 그리고이 테이블은 많은 수의 필드와 많은 레코드를 포함 할 수 있습니다. 그것이 특정 레코드를 변경하기 위해 SQL 테이블을 메모리에로드하지 않는 것을 선호하는 이유 중 하나입니다. 저를 혼란스럽게하는 것은 UpdateCommand 문이 올바로 보이고 InsertStatement가 그대로 작동해야하며 DataAdapter.Update를 호출 한 후에 DataTable의 모든 행에 대한 RowState는 변경되지 않습니다. –
DataAdapter.Update 호출에서 실패하는 것처럼 보입니다. –
본 적이 있습니까? http://stackoverflow.com/questions/7126356/sqldataadapter-not-updating –