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 » »
-
01-10-2019 - |
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
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;