Corregir este consultas SQL: error “motor de base de datos Microsoft Jet no puede encontrar la tabla de entrada o consulta 'SI'”

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

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

¿Fue útil?

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;

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top