Korrigieren Sie diese SQL-Abfrage: Fehler „Microsoft Jet-Datenbankmodul die Eingabetabelle oder Abfrage‚IF‘nicht finden können“

StackOverflow https://stackoverflow.com/questions/3584729

Frage

soll ich hallo sagen Experten: D. Helfen Sie mir mit diesem hübschen Code:)

Die Datenbank:

"ID (Primärschlüssel)" | „Titel“
0 | "Title1"
1 | "Title2"
2 | "Title3"
3 | "TITEL4"


Sub AddRecord(ByVal Table As String, ByVal Columns As String, ByVal Record() As String)
    Dim SubDir As String = ""

    Dim Adapter As OleDbDataAdapter = New OleDbDataAdapter("SELECT * FROM " & Table, connectionString)
    Dim command As OleDbCommand
    Dim tbCorrectSyntax = ""

    Using connection As New OleDbConnection(connectionString)
        Try
            connection.Open()
            Dim Commandtxt As String = ""
            For i = 0 To Record.GetUpperBound(0)
                If Record(i).IndexOf(",") > 0 Then
                    Dim tmpRec() As String = Nothing
                    Dim cols() As String = Nothing

                    tmpRec = Record(i).Split(",")
                    cols = Columns.Split(",")

                    For j = 0 To tmpRec.GetUpperBound(0)
                        tbCorrectSyntax &= cols(j) & " = '" & tmpRec(j) & "' " & IIf(j = tmpRec.GetUpperBound(0), "", " , ")
                    Next
                End If


                Dim txtCorrect As String = IIf(tbCorrectSyntax = "", Columns & " = " & Record(i), tbCorrectSyntax)

                Commandtxt = "IF OBJECT_ID ( 'InsertOrUpdateItem', 'P' ) IS NOT NULL " & _
                                "DROP PROCEDURE InsertOrUpdateItem " & _
                             "GO " & _
                             "CREATE PROCEDURE InsertOrUpdateItem " & _
                                "AS " & _
                                "IF (EXISTS (SELECT * FROM " & Table & _
                                            " WHERE " & txtCorrect & "))" & _
                                            " begin " & _
                                                "UPDATE (" & Table & ") " & _
                                                txtCorrect & _
                                                " WHERE " & txtCorrect & " " & _
                                            " End " & _
                                            " else " & _
                                                " begin " & _
                                                " INSERT INTO " & Table & " (" & Columns & ") " & _
                                                " VALUES (" & Record(i) & ")" & _
                                            " End " & _
                                "End "

                'Commandtxt = "INSERT INTO " & Table & " (" & Columns & ") VALUES (" & Record(i) & ")"
                command = New OleDbCommand(Commandtxt, connection)
                command.CommandType = CommandType.StoredProcedure
                command.ExecuteNonQuery()

            Next


        Catch ex As Exception
            msgbox(ex.Message)
        Finally
            connection.Close()
        End Try
    End Using
End Sub

Function connectionString() As String
    Return "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DBdir & ";User Id=admin;Password=;"
End Function

Das erste Verfahren ist ein Wrapper Daten auf Datenbankfelder (wenn die Daten doent exist) hinzufügen Aber aktualisieren Sie die Zeile mit neuen Daten bereits vorhanden sein.

Input:
Table = Tablename
Columns = Name des colomns, die durch Komma (Ex1: "ID", Ex2: "ID, Titel, ...") getrennt werden aktualisiert wird
Record () = String-Array, das die neuen Werte repräsentieren (Mehrfachwerte werden mit Komma getrennt)

OK, bevor Werte zur Datenbank hinzufügen, sollten wir prüfen, ob eine Zeile existiert mit diesen Werten :)
Dazu Erstellen eine gespeicherten Prozedur ist ein bester Weg, um mit der Datenbank behandeln fastly.

So ... Das Problem ist jetzt, während der Laufzeit, werfen Fräulein OleDB diesen Fehler:
Microsoft Jet-Datenbankmodul kann nicht die Eingabetabelle oder Abfrage ‚IF‘ gefunden ....

Vielen Dank im Voraus: D

War es hilfreich?

Lösung 2

fand ich eine Lösung für mein Problem (mit einem wenig Netto-Forschung :)) hahaha i glücklich und bin wie auch immer, die erste Frage war: ‚Wie eine Aufzeichnung in der Datenbank zu aktualisieren, wenn es vorhanden ist‘ Also ich habe versucht eine gespeicherte Prozedur in der Datenbank zu erstellen und speichern ... aber ... :)

Dann fand ich eine interessante Methode: die ExecuteScalar von OleDbCommand Klasse

zurückgeben einfach einen Wert entsprechend SQL-Eingabe: Im folgende Beispiel, die ich verwenden, es zurück um den Index (Primärschlüssel), wenn der recod existiert. So kann beginnen:

Function GetRecordIndex(ByVal Table As String, ByVal Columns As String, ByVal Record As String) As String
    Dim Commandtxt As String = ""
    Dim Command As OleDbCommand
    Dim tbCorrectSyntax As String = ""
    Dim tbCorrectSyntaxAND As String = ""

    Using connection As New OleDbConnection(connectionString)

        Try
            connection.Open()
            If Record.IndexOf(",") > 0 Then
                Dim tmpRec() As String = Nothing
                Dim cols() As String = Nothing

                tmpRec = Record.Split(",")
                cols = Columns.Split(",")

                For j = 0 To tmpRec.GetUpperBound(0)
                    tbCorrectSyntax &= cols(j) & "='" & tmpRec(j) & "' " & IIf(j = tmpRec.GetUpperBound(0), "", " , ")
                    tbCorrectSyntaxAND &= cols(j) & "='" & tmpRec(j) & "' " & IIf(j = tmpRec.GetUpperBound(0), "", " AND ")
                Next
            End If
            Dim txtCorrect As String = IIf(tbCorrectSyntax = "", Columns & "=" & Record, tbCorrectSyntax)
            Dim txtCorrectAND As String = IIf(tbCorrectSyntaxAND = "", Columns & "=" & Record, tbCorrectSyntaxAND)

            Commandtxt = "SELECT * FROM " & Table & " WHERE " & txtCorrectAND
            Command = New OleDbCommand(Commandtxt, connection)
            Dim RecordIndex As String = Command.ExecuteScalar

            Return RecordIndex

        Catch ex As Exception
            Return Nothing
        Finally
            connection.Close()
        End Try
    End Using
End Function

Wie zuvor Spalten Parameter können eine einzelne Datenbank Spalte sein oder mehr Spalten getrennt mit Komma. Gleiche mit Datensatz, der die Daten in jeder Spalte

repräsentieren

Danke für Ihre Hilfe
Fadelovesky

Andere Tipps

 command.CommandType = CommandType.StoredProcedure 

Sie behaupten, Sie eine gespeicherte Prozedur ausgeführt werden (Command wäre der Name eines bestehenden SProc sein). Was Sie tatsächlich einen SQL-Befehl geben direkt ausgeführt werden. Der Command sollte Text sein;

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top