Hallo liebe Forumgemeinde,
wie der Titel schon verrät, will ich eine SQL Tabelle mit einem Dataset vergleichen.
Das Problem bei der Sache ist, das Ich die Änderungen des Datasets nicht während der Laufzeit mache, sondern die Änderungen in einem Excelsheet gemacht werden, dass ich zur Laufzeit einlese.
Sprich ich muss ein "unverändertes" (zur Laufzeit unverändertes) Dataset mit der SQL Tabelle vergleichen, um Änderungen zu bemerken.
Ist dies Überhaupt möglich? Ich habe viel Herumexperimentiert und Stundenlang gegoogelt, aber nichts gefunden..
Ich hoffe es hat jemand eine Lösung für mich.
Nachfolgend mein Code:
[highlight=vbnet]Private Sub einlesenxls()
Dim SQLservername_Text As String
Dim antwort As DialogResult
Dim conString As String
Dim con As SqlConnection = Nothing
SQLservername_Text = SQLservername.CurrentRow.Cells(0).Value & "\" & SQLservername.CurrentRow.Cells(1).Value
antwort = MsgBox("Soll die Datei '" & Mid(Pfad.Text, InStrRev(Pfad.Text, "\") + 1, Len(Pfad.Text)) & "'" & vbCrLf & _
"in die Tabelle '" & Tabelle.SelectedItem & "'" & vbCrLf & _
"importiert werden?", MsgBoxStyle.YesNo, "Importieren?")
If antwort = Windows.Forms.DialogResult.Yes Then
Cursor.Current = Cursors.WaitCursor
Dim constr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Pfad.Text & ";Extended Properties=text;HDR=Yes;FMT=Delimited;"
Dim SQL As String = "Select * From " & Mid(Pfad.Text, InStrRev(Pfad.Text, "\") + 1, Len(Pfad.Text))
Dim DT As New DataTable
Dim conn As New OleDb.OleDbConnection(constr)
Dim da As New OleDb.OleDbDataAdapter(SQL, conn)
Try
Dim anmeldung As String
If SSPI.Checked = True Then
anmeldung = ";Integrated Security=SSPI"
Else
anmeldung = ";User ID=" & Benutzername.Text & ";Pwd=" & Passwort.Text
End If
conString = "Server=" & SQLservername_Text & ";database=" & Datenbank.Text & anmeldung
con = New SqlConnection(conString)
Dim sConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Text;Data Source=" & Mid(Pfad.Text, 1, InStrRev(Pfad.Text, "\"))
Dim objConn As New OleDbConnection(sConnectionString)
objConn.Open()
Dim strConnection As System.Data.OleDb.OleDbConnection = Nothing
Dim myPath As String = Pfad.Text
Dim objDataSet As System.Data.DataSet
Dim objAdapter As System.Data.OleDb.OleDbDataAdapter
strConnection = New System.Data.OleDb.OleDbConnection("Provider=Micros oft.Jet.OLEDB.4.0; Data Source='" & myPath & " '; " & "Extended Properties=Excel 8.0;")
objAdapter = New System.Data.OleDb.OleDbDataAdapter("select * from [Tabelle1$]", strConnection)
objDataSet = New System.Data.DataSet
objAdapter.Fill(objDataSet)
objConn.Close()
con.Open()
If Insert.Checked = True Then
Dim oBulkCopy As New SqlBulkCopy(con)
With oBulkCopy
.DestinationTableName = "dbo." & Tabelle.SelectedItem
.WriteToServer(objDataSet.Tables(0))
End With
End If
If Update1.Checked = True Then
Dim da1 As New SqlDataAdapter("SELECT * FROM " & Tabelle.SelectedItem, con)
'Dim UpdRecords As DataTable = CType(objDataSet.Tables(0), DataTable).GetChanges(DataRowState.Modified)
'Dim da1 As New SqlDataAdapter
' da1.SelectCommand = New SqlCommand("SELECT * FROM " & Tabelle.SelectedItem, con)
'da1.SelectCommand.CommandText = "SELECT * FROM " & Tabelle.SelectedItem
'da1.SelectCommand.CommandType = CommandType.Text
'If Not UpdRecords Is Nothing Then
'Dim cb As SqlCommandBuilder
'cb = New SqlClient.SqlCommandBuilder(da1)
' da1.UpdateCommand = cb.GetUpdateCommand
' da1.Update(UpdRecords)
' UpdRecords.Dispose()
' End If
'Dim dataSet As DataSet = New DataSet
Dim cmdBuilder As SqlCommandBuilder = New SqlCommandBuilder(da1)
da1.Fill(objDataSet, Tabelle.SelectedItem)
' Code to modify data in DataSet here
cmdBuilder.GetUpdateCommand()
' Without the SqlCommandBuilder this line would fail.
Dim betroffen As Integer
betroffen = da1.Update(objDataSet)
'Dim da1 As SqlDataAdapter
'da1 = New SqlDataAdapter("", con)
'da1.SelectCommand.CommandText = "SELECT * FROM " & Tabelle.SelectedItem
'da1.SelectCommand.CommandType = CommandType.Text
'Dim cmdBuilder As SqlCommandBuilder = New SqlCommandBuilder(da1)
'da1.Update(objDataSet, Tabelle.SelectedItem)
End If
If Delete.Checked = True Then
MsgBox("noch nicht fertig!")
End If
con.Close()
Anzeige.Text = "Daten importiert!"
Catch ex As Exception
MsgBox(ex.Message, MessageBoxButtons.OK, _
MessageBoxIcon.Exclamation)
End Try
Else
Exit Sub
End If
End Sub[/highlight]
Der im Code relevante Teil ist in Grün markiert. (Code Zeilen 54-89)
(Wie man sieht hab ich einiges ausprobiert.)
Ich hoffe es kann mir jemand helfen.
Vielen Dank im Vorraus.
Mit freundlichen Grüßen
Thors Hamster
wie der Titel schon verrät, will ich eine SQL Tabelle mit einem Dataset vergleichen.
Das Problem bei der Sache ist, das Ich die Änderungen des Datasets nicht während der Laufzeit mache, sondern die Änderungen in einem Excelsheet gemacht werden, dass ich zur Laufzeit einlese.
Sprich ich muss ein "unverändertes" (zur Laufzeit unverändertes) Dataset mit der SQL Tabelle vergleichen, um Änderungen zu bemerken.
Ist dies Überhaupt möglich? Ich habe viel Herumexperimentiert und Stundenlang gegoogelt, aber nichts gefunden..
Ich hoffe es hat jemand eine Lösung für mich.
Nachfolgend mein Code:
[highlight=vbnet]Private Sub einlesenxls()
Dim SQLservername_Text As String
Dim antwort As DialogResult
Dim conString As String
Dim con As SqlConnection = Nothing
SQLservername_Text = SQLservername.CurrentRow.Cells(0).Value & "\" & SQLservername.CurrentRow.Cells(1).Value
antwort = MsgBox("Soll die Datei '" & Mid(Pfad.Text, InStrRev(Pfad.Text, "\") + 1, Len(Pfad.Text)) & "'" & vbCrLf & _
"in die Tabelle '" & Tabelle.SelectedItem & "'" & vbCrLf & _
"importiert werden?", MsgBoxStyle.YesNo, "Importieren?")
If antwort = Windows.Forms.DialogResult.Yes Then
Cursor.Current = Cursors.WaitCursor
Dim constr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Pfad.Text & ";Extended Properties=text;HDR=Yes;FMT=Delimited;"
Dim SQL As String = "Select * From " & Mid(Pfad.Text, InStrRev(Pfad.Text, "\") + 1, Len(Pfad.Text))
Dim DT As New DataTable
Dim conn As New OleDb.OleDbConnection(constr)
Dim da As New OleDb.OleDbDataAdapter(SQL, conn)
Try
Dim anmeldung As String
If SSPI.Checked = True Then
anmeldung = ";Integrated Security=SSPI"
Else
anmeldung = ";User ID=" & Benutzername.Text & ";Pwd=" & Passwort.Text
End If
conString = "Server=" & SQLservername_Text & ";database=" & Datenbank.Text & anmeldung
con = New SqlConnection(conString)
Dim sConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Text;Data Source=" & Mid(Pfad.Text, 1, InStrRev(Pfad.Text, "\"))
Dim objConn As New OleDbConnection(sConnectionString)
objConn.Open()
Dim strConnection As System.Data.OleDb.OleDbConnection = Nothing
Dim myPath As String = Pfad.Text
Dim objDataSet As System.Data.DataSet
Dim objAdapter As System.Data.OleDb.OleDbDataAdapter
strConnection = New System.Data.OleDb.OleDbConnection("Provider=Micros oft.Jet.OLEDB.4.0; Data Source='" & myPath & " '; " & "Extended Properties=Excel 8.0;")
objAdapter = New System.Data.OleDb.OleDbDataAdapter("select * from [Tabelle1$]", strConnection)
objDataSet = New System.Data.DataSet
objAdapter.Fill(objDataSet)
objConn.Close()
con.Open()
If Insert.Checked = True Then
Dim oBulkCopy As New SqlBulkCopy(con)
With oBulkCopy
.DestinationTableName = "dbo." & Tabelle.SelectedItem
.WriteToServer(objDataSet.Tables(0))
End With
End If
If Update1.Checked = True Then
Dim da1 As New SqlDataAdapter("SELECT * FROM " & Tabelle.SelectedItem, con)
'Dim UpdRecords As DataTable = CType(objDataSet.Tables(0), DataTable).GetChanges(DataRowState.Modified)
'Dim da1 As New SqlDataAdapter
' da1.SelectCommand = New SqlCommand("SELECT * FROM " & Tabelle.SelectedItem, con)
'da1.SelectCommand.CommandText = "SELECT * FROM " & Tabelle.SelectedItem
'da1.SelectCommand.CommandType = CommandType.Text
'If Not UpdRecords Is Nothing Then
'Dim cb As SqlCommandBuilder
'cb = New SqlClient.SqlCommandBuilder(da1)
' da1.UpdateCommand = cb.GetUpdateCommand
' da1.Update(UpdRecords)
' UpdRecords.Dispose()
' End If
'Dim dataSet As DataSet = New DataSet
Dim cmdBuilder As SqlCommandBuilder = New SqlCommandBuilder(da1)
da1.Fill(objDataSet, Tabelle.SelectedItem)
' Code to modify data in DataSet here
cmdBuilder.GetUpdateCommand()
' Without the SqlCommandBuilder this line would fail.
Dim betroffen As Integer
betroffen = da1.Update(objDataSet)
'Dim da1 As SqlDataAdapter
'da1 = New SqlDataAdapter("", con)
'da1.SelectCommand.CommandText = "SELECT * FROM " & Tabelle.SelectedItem
'da1.SelectCommand.CommandType = CommandType.Text
'Dim cmdBuilder As SqlCommandBuilder = New SqlCommandBuilder(da1)
'da1.Update(objDataSet, Tabelle.SelectedItem)
End If
If Delete.Checked = True Then
MsgBox("noch nicht fertig!")
End If
con.Close()
Anzeige.Text = "Daten importiert!"
Catch ex As Exception
MsgBox(ex.Message, MessageBoxButtons.OK, _
MessageBoxIcon.Exclamation)
End Try
Else
Exit Sub
End If
End Sub[/highlight]
Der im Code relevante Teil ist in Grün markiert. (Code Zeilen 54-89)
(Wie man sieht hab ich einiges ausprobiert.)
Ich hoffe es kann mir jemand helfen.
Vielen Dank im Vorraus.
Mit freundlichen Grüßen
Thors Hamster
Comment