【问题标题】:SQL query from VB.Net to Access database从 VB.Net 到 Access 数据库的 SQL 查询
【发布时间】:2017-05-25 18:45:04
【问题描述】:

我有一个查询,但是当我尝试时,它在日期或任何其他变量上给了我一些错误。我做错了。你能帮我么?代码如下:

 Dim tax As Integer = 10
        Dim APPROVED As Boolean = 1
        Dim admin As String = "admin"
        sqlquery.CommandText = "INSERT INTO ACCOUNTS (REFERENCE_NO, ACCT_DATE, ACCT_FROM, ACCT_DUE_DATE, TOTAL, [CURRENCY], AMOUNTS_ARE, TAX, APPROVED, UPDATED_BY, UPDATED_DATE) VALUES ('" & TextBox2.Text & "', #" & DateTimePicker1.Value.Date & "#, '" & TextBox1.Text & "', #" & DateTimePicker2.Value.Date & "#, " & TextBox3.Text & ", '" & ComboBox1.SelectedItem.ToString & "', '" & ComboBox2.SelectedItem.ToString & "', " & tax & ", '" & APPROVED & "', '" & admin & "', #" & DateTimePicker1.Value.Date & "#);"

        sqlquery.ExecuteNonQuery()

现在我收到此错误:

条件表达式中的数据类型不匹配。

要遵循哪种日期格式?

【问题讨论】:

  • 使用参数避免sql注入和格式化问题。

标签: sql vb.net ms-access


【解决方案1】:

使用参数化查询。

您所拥有的非常容易受到 sql 注入攻击。参数化查询将解决该问题和您的格式问题:

Dim tax As Integer = 10
Dim APPROVED As Boolean = 1
Dim admin As String = "admin"
sqlquery.CommandText = "INSERT INTO ACCOUNTS (REFERENCE_NO, ACCT_DATE, ACCT_FROM, ACCT_DUE_DATE, TOTAL, [CURRENCY], AMOUNTS_ARE, TAX, APPROVED, UPDATED_BY, UPDATED_DATE) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"

sqlquery.Parameters.Add("?", OleDbType.VarWChar, 10).Value = TextBox2.Text
sqlquery.Parameters.Add("?", OleDbType.Date).Value = DateTimePicker1.Value.Date 
'...

sqlquery.ExecuteNonQuery()

【讨论】:

    【解决方案2】:

    条件表达式中的数据类型不匹配。您正试图将错误的数据类型插入数据库。仔细检查数据库中的数据类型。如果是日期,则插入日期,如果是文本,则插入文本。

    此外,字符串连接使查找错误变得更加困难,并且还使您容易受到 SQL 注入的影响。

    下面是一个使用参数的简单例子:

    Using con As New OleDbConnection
    
                con.ConnectionString = "Provider = Microsoft.ACE.OLEDB.12.0; " & _
                                         "Data Source = " & My.Settings.dbpath
                con.Open()
    
                Dim sql_insert As String = "INSERT INTO Table_Name (Order_ID, Customer_Name) " & _
                                           "VALUES " & _
                                           "(@entry_ref, @customer_name);"
    
                Dim sql_insert_entry As New OleDbCommand
    
                con.Open()
    
                With sql_insert_entry
                    .Parameters.AddWithValue("@entry_ref", entry_ref)
                    .Parameters.AddWithValue("@customer_name", tb_new_entry_customer_name.Text.Trim())
                    .CommandText = sql_insert
                    .Connection = con
                    .ExecuteNonQuery()
                End With
    
                con.close()
    
    End Using
    

    如您所见,它易于跟踪并同时保护您的数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-27
      相关资源
      最近更新 更多