2010-08-27 70 views
0

我应该打电话给专家:D。帮我看看这个漂亮的代码:)更正此SQL查询:错误“Microsoft Jet数据库引擎无法找到输入表或查询'IF'”

数据库:

“ID(主键)” | “标题”
0 | “title1”
1 | “title2”
2 | “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 

第一个程序是一个包装,以将数据添加到数据库字段(如果数据doent存在) 但随着新的数据已经存在更新的行。

输入:
表=表名
列=将由逗号更新分离colomns的名称(练习1: “ID”,实例2: “ID,标题,...”)
记录()=字符串数组,代表新的值(多值与逗号分隔)

OK,增加值数据库之前,我们应该检查是否有行存在这个值:)
要做到这一点,创建一个存储过程一种快速处理数据库的最佳方法。

所以......现在的问题是,在运行时,OLEDB小姐抛出这个错误:
Microsoft Jet数据库引擎无法找到输入表或查询“IF” ....

在此先感谢:D

+0

你移植的SQL Server应用程序来访问/喷气? – Constantin 2010-08-27 13:50:14

回答

0

我发现我的问题的解决方案(一点点网研究:))哈哈哈哈我很高兴
无论如何,最初的问题是:“如果存在如何更新数据库中的记录” 所以我tryed创建并存储在数据库中的存储过程...但是... :)

后来我发现一个有趣的方法:OleDbCommand的的ExecuteScalar

它只需根据输入的SQL语句返回值:在以下我用过的例子,如果recod存在,它会返回索引(主键)。因此,让我们开始:

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 

与之前一样,列参数可以是单个数据库列,也可以是多个用逗号分隔的列。与记录同样的事情,代表每列

谢谢里面的数据对你有所帮助
Fadelovesky

0
command.CommandType = CommandType.StoredProcedure 

您声称您正在运行存储过程(CommandText将是现有SProc的名称)。你实际上给了它一个直接执行的SQL命令。 CommandType应该是Text;

+0

感谢您的回答。我曾尝试过,但当我把 command.CommandType = CommandType.Text SQL SQL小姐:)抛出一个错误:“无效的SQL指令;'删除','INSERT','程序','选择'或'更新'预期'。 在这种情况下,你建议我做什么? – Fadelovesky 2010-08-28 00:19:28