it-swarm.com.de

Fügen Sie neue Datensätze nur in SQL-Tabelle mit VBA ein

Ich habe eine Excel-Arbeitsmappe mit dem folgenden Code -

Sub Button1_Click()
    Dim conn As New ADODB.Connection
    Dim iRowNo As Integer
    Dim sFirstName, sLastName As String

    With Sheets("Sheet1")

        'Open a connection to SQL Server
        conn.Open "Provider=SQLOLEDB;" & _
            "Data Source=server1;" & _
            "Initial Catalog=table1;" & _
            "User ID=user1; Password=pass1"

        'Skip the header row
        iRowNo = 2

        'Loop until empty cell in CustomerId
        Do Until .Cells(iRowNo, 1) = ""
            sFirstName = .Cells(iRowNo, 1)
            sLastName = .Cells(iRowNo, 2)

            'Generate and execute sql statement
            ' to import the Excel rows to SQL Server table
            conn.Execute "Insert into dbo.Customers (FirstName, LastName) " & _
                         "values ('" & sFirstName & "', '" & sLastName & "')"

            iRowNo = iRowNo + 1
        Loop

        MsgBox "Customers imported."

        conn.Close
        Set conn = Nothing

    End With

End Sub

Dadurch wird eine Verbindung zu meiner Datenbank hergestellt und die Werte aus den angegebenen Spalten eingegeben.

Der Primärschlüssel ist ein inkrementeller Schlüssel in der Datenbank. Das Problem ist, dass ALLE Werte kopiert werden.

Ich möchte neue Datenzeilen in die Excel-Tabelle einfügen und nur die Zeilen einfügen, die noch nicht vorhanden sind.

Ich habe verschiedene Methoden ausprobiert ("Zusammenführen", "Wenn vorhanden", falls nicht vorhanden usw.), aber ich kann es nicht richtig verstehen.

Die Lösung muss über VBA sein. Das Einrichten einer Verbindung mit SSMS ist keine Option.

Ich verstehe, dass es möglich sein kann, temporäre Tabellen zu verwenden und dann eine Prozedur auszulösen, die die Zusammenführung durchführt, aber ich möchte das als letzten Ausweg betrachten. Ich habe es noch nicht gelesen (durch mein MS SQL-Bibelbuch), aber ich hoffe, dass es nicht notwendig sein wird.

--- Update von @ Kannans Antwort ---

Neuer Teil der VBA -

conn.Execute "IF EXISTS (SELECT 1 FROM dbo.Customers WHERE FirstName = '" &      sFirstName & "' and LastName = '" & sLastName & "') " & _
             "THEN UPDATE dbo.customers SET WHERE Firstname = '" & sFirstName & "' and LastName = '" & sLastName & "' " & _
             "ELSE INSERT INTO dbo.Customers (FirstName, LastName) " & _
             "VALUES ('" & sFirstName & "', '" & sLastName & "')"

Dies gibt den Fehler 'Falsche Syntax in der Nähe des Schlüsselworts' THEN 'zurück.

4
Jamsandwich

Ihre SQL-Abfrage ist nicht ganz richtig - es gibt keine THEN in einer SQL-IF.

Sie müssen auch nichts tun, wenn es existiert. Verwenden Sie also, falls nicht vorhanden.

"IF NOT EXISTS (SELECT 1 FROM dbo.Customers WHERE FirstName = '" & sFirstName & "' and LastName = '" & sLastName & "') " & _
         "INSERT INTO dbo.Customers (FirstName, LastName) " & _
         "VALUES ('" & sFirstName & "', '" & sLastName & "')"
7
BeanFrog

Das sollte es für dich tun.

Sub Button_Click()
'TRUSTED CONNECTION
    On Error GoTo errH

    Dim con As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim strPath As String
    Dim intImportRow As Integer
    Dim strFirstName, strLastName As String

    Dim server, username, password, table, database As String


    With Sheets("Sheet1")

            server = .TextBox1.Text
            table = .TextBox4.Text
            database = .TextBox5.Text


            If con.State <> 1 Then

                con.Open "Provider=SQLOLEDB;Data Source=" & server & ";Initial Catalog=" & database & ";Integrated Security=SSPI;"
                'con.Open

            End If
            'this is the TRUSTED connection string

            Set rs.ActiveConnection = con

            'delete all records first if checkbox checked
            If .CheckBox1 Then
                con.Execute "delete from tbl_demo"
            End If

            'set first row with records to import
            'you could also just loop thru a range if you want.
            intImportRow = 10

            Do Until .Cells(intImportRow, 1) = ""
                strFirstName = .Cells(intImportRow, 1)
                strLastName = .Cells(intImportRow, 2)

                'insert row into database
                con.Execute "insert into tbl_demo (firstname, lastname) values ('" & strFirstName & "', '" & strLastName & "')"

                intImportRow = intImportRow + 1
            Loop

            MsgBox "Done importing", vbInformation

            con.Close
            Set con = Nothing

    End With

Exit Sub

errH:
    MsgBox Err.Description
End Sub

Fügen Sie einen Verweis hinzu: Microsoft ActiveX Data Objects 2.8-Bibliothek

Zur Info, mein Blatt sieht so aus.

 enter image description here

1
user7075507

Sie können SQL-Abfrage wie folgt verwenden:

IF Exists ( Select 1 from dbo.customers where Firstname = '" & sFirstName & "' and LastName = '" & sLastName & "' THEN Update dbo.customers set --other columns where Firstname = '" & sFirstName & "' and LastName = '" & sLastName & "'
ELSE Insert into dbo.Customers (FirstName, LastName) " & _
                     "values ('" & sFirstName & "', '" & sLastName & "')"

Sie sind sich nicht sicher, welche Syntax für Excel und C # gilt, Sie können dies ähnlich wie bei dieser Abfrage korrigieren

0