Corriger cette requête SQL: erreur « moteur de base de données Microsoft Jet ne peut pas trouver la table d'entrée ou de la requête « IF » »

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

Question

Je dois dire que les experts hi: D. Aidez-moi avec ce joli code:)

La base de données:

"ID (clé primaire)" |
« Titre » 0 |
« de titre1 » 1 |
"de Title2" 2 |
"de title3" 3 | "Title4"


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

La première procédure est un wrapper pour ajouter des données aux champs de base de données (si le exist de doent de données) Mais le mettre à jour la ligne avec de nouvelles données existent déjà.

Entrée:
 Tableau = TableName
       Columns = nom de colomns qui sera mise à jour séparées par des virgules (EX1: "ID", Ex2: "ID, titre, ...")
       Notice () = tableau de chaînes qui représentent les nouvelles valeurs (valeurs multiples sont séparés par une virgule)

OK, avant d'ajouter des valeurs à la base de données, nous devons vérifier si une ligne existe avec ces valeurs :)
Pour ce faire, la création d'une procédure stockée est une meilleure façon de traiter avec la base de données fastly.

Alors ... Le problème est maintenant, à l'exécution, Mlle OleDB lancer cette erreur:
moteur de base de données Microsoft Jet ne peut pas trouver la table d'entrée ou de la requête « IF » ....

Merci à l'avance: D

Était-ce utile?

La solution 2

J'ai trouvé une solution pour mon problème (avec un peu de recherche net :)) hahahaha i suis heureux
De toute façon, la question initiale était: « Comment mettre à jour un enregistrement dans la base de données si elle existe » Donc, j'ai essayé de créer et de stocker une procédure stockée dans la base de données ... mais ... :)

Alors j'ai trouvé une intéressante Méthode: la ExecuteScalar de OleDbCommand classe

Il suffit de retourner une valeur en fonction de l'entrée SQL: dans l'exemple suivant qui i utilisé, il renvoie l'index (clé primaire) si le RecOd existe. permet donc de commencer:

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

Comme précédemment, les colonnes de paramètre peut être une seule colonne de la base de données, ou plusieurs colonnes séparées par des virgules. même chose avec enregistrement qui représentent les données dans chaque colonne

Merci pour votre aide
Fadelovesky

Autres conseils

 command.CommandType = CommandType.StoredProcedure 

Vous prétendez que vous exécutez un proc stocké (CommandText serait le nom d'un SProc existant). Qu'est-ce que vous êtes réellement en lui donnant une commande SQL à exécuter directement. Le CommandType doit être texte;

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top