Исправьте этот SQL-запрос: ошибка Механизм базы данных Microsoft Jet не может найти входную таблицу или запрос «IF»

я должен сказать привет экспертам: D. Помогите мне с этим красивым кодом :)

База данных:

"ID (Первичный ключ)" | "Название"
0 | "title1"
1 | "title2"
2 | "title3"
3 | "название4"


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

Первая процедура представляет собой оболочку для добавления данных в поля базы данных (если данные не существуют), но обновите ее в строке с уже существующими новыми данными.

Ввод:
Table = TableName
Columns = имена столбцов, которые будут обновлены, разделенные запятой (Ex1: "ID" , Ex2: "ID,Title,...")
Record() = string массив, который представляет новые значения (несколько значений разделены запятой)

Хорошо, прежде чем добавлять значения в базу данных, мы должны проверить, существует ли строка с этими значениями :)
ЧТОБЫ сделать это, создание хранимой процедуры - лучший способ быстро работать с базой данных.

Итак... Теперь проблема заключается в том, что во время выполнения мисс OleDB выдает эту ошибку:
Механизм базы данных Microsoft Jet не может найти входную таблицу или запрос "IF"....

Заранее спасибо


person Fadelovesky    schedule 27.08.2010    source источник
comment
Вы переносите приложение SQL Server на Access/Jet?   -  person Constantin    schedule 27.08.2010


Ответы (2)


 command.CommandType = CommandType.StoredProcedure 

Вы утверждаете, что запускаете хранимую процедуру (CommandText будет именем существующей SPrc). То, что вы на самом деле даете команде SQL, которая будет выполняться напрямую. CommandType должен быть Text;

person James Curran    schedule 27.08.2010
comment
Спасибо за ответ. я пробовал это раньше, но когда я помещаю command.CommandType = CommandType.Text Miss SQL :) выдает ошибку: Invalide SQL инструкция; Ожидается «УДАЛЕНИЕ», «ВСТАВКА», «ПРОЦЕДУРА», «ВЫБОР» или «ОБНОВЛЕНИЕ». в этом случае, что вы предлагаете мне делать? - person Fadelovesky; 28.08.2010

Я нашел решение своей проблемы (с небольшим сетевым исследованием :) ) хахахаха, я счастлив
в любом случае, первоначальный вопрос был: «Как обновить запись в базе данных, если она существует». Поэтому я попытался создать и сохранить сохраненный процедура в базе... но... :)

Затем я нашел интересный метод: ExecuteScalar класса OleDBcommand.

Он просто возвращает значение в соответствии с вводом Sql: в следующем примере, который я использовал, он возвращает индекс (первичный ключ), если запись существует. Итак, начнем:

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

Как и прежде, параметр Columns может быть одним столбцом базы данных или несколькими столбцами, разделенными запятой. то же самое с записью, которая представляет данные внутри каждого столбца

Благодарим за помощь

person Fadelovesky    schedule 29.08.2010