Corregir este consultas SQL: error “motor de base de datos Microsoft Jet no puede encontrar la tabla de entrada o consulta 'SI'”
-
01-10-2019 - |
Pregunta
i debería decir Hola expertos: D. Ayúdame con este código bonita:)
La base de datos:
"ID (clave primaria)" | "Título"
0 | "Título1"
1 | "Title2"
2 | "Title3"
3 | "Título4"
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
El primer procedimiento es un envoltorio para añadir datos a los campos de base de datos (si el doent existen datos) Pero actualizarlo con la fila ya existen nuevos datos.
Entrada:
Tabla = NombreTabla
Columnas = nombre de colomns que se actualizará separados por comas (Ex1: "ID", Ex2: "ID, título, ...")
Grabar () = matriz de cadenas que representan los nuevos valores (valores múltiples se separan con coma)
OK, antes de añadir valores a la base de datos, se debe comprobar si existe una fila con esta :) valores
Para ello, la creación de un procedimiento almacenado es una mejor manera de hacer frente a la base de datos rápidamente.
Así que ... El problema ahora es, en el tiempo de ejecución, la señorita OleDB lanzar este error:
motor de base de datos Microsoft Jet no puede encontrar la tabla de entrada o consulta 'SI' ....
Gracias de antemano: D
Solución 2
He encontrado una solución para mi problema (con un poco de investigación neta :)) jajajaja i m feliz
de todos modos, la pregunta inicial fue: '¿Cómo actualizar un registro de base de datos en caso de que exista'
Así i tryed para crear y guardar un procedimiento almacenado en la base de datos ... pero ... :)
Entonces me encontré con un interesante método: la ExecuteScalar OleDbCommand Clase
Simplemente devuelve un valor de acuerdo con la entrada de SQL: en el siguiente ejemplo que i utilizada, se devuelve el (clave primaria) índice de si existe el recod. Así que vamos a empezar:
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
Como antes, las columnas de parámetros puede ser una columna única base de datos, o múltiples columnas separados con comas. lo mismo con el registro que representan los datos dentro de cada columna
Gracias por su ayuda
Fadelovesky
Otros consejos
command.CommandType = CommandType.StoredProcedure
Se está reclamando está ejecutando un procedimiento almacenado (CommandText sería el nombre de un procedimiento almacenado existente). Lo que en realidad se está dando un comando SQL para su ejecución directa. El CommandType debe ser texto;