【问题标题】:Retrieving "Number" From Sql VB.NET System.Data.OleDb.OleDbException: 'Data type mismatch in criteria expression.'从 Sql VB.NET System.Data.OleDb.OleDbException 中检索“数字”:“标准表达式中的数据类型不匹配。”
【发布时间】:2020-04-27 16:16:40
【问题描述】:

如果我想检索在 access 数据库中保存为数字的值。

我正在使用以下内容:

            Dim sql As String = "SELECT ArithmeticScore FROM " & tablename & " WHERE DateAscending = '" & todaysdate & "'"
            Using connection As New OleDbConnection(getconn)
                Using command As New OleDbCommand(sql, connection)
                    connection.Open()
                    scorevalue = CDec(command.ExecuteScalar()) 'Data type mismatch in criteria expression.
                    connection.Close()
                End Using
            End Using
            MsgBox(scorevalue)

getconn = 连接字符串作为字符串

scorevalue = 没有十进制

表格中ArithmeticScore字段设置为Number

现在单元格中的确切值是50,但程序应该允许任何十进制值。

我得到的错误是“标准表达式中的数据类型不匹配”。

【问题讨论】:

  • 哎呀,这看起来容易受到 sql 注入问题的影响。
  • 什么是数据库,DateAscending列的数据类型是什么?如果是 SQL Server,那么你真的应该使用 SqlClient 而不是 OleDb
  • @jmcilhinney 我用谷歌搜索了错误消息的确切文本,似乎表明访问。

标签: vb.net ms-access oledb


【解决方案1】:

错误消息中提到的criteria expression 不是指ArithmeticScore 输出。它在谈论WHERE 子句。无论您对todaysdate 拥有什么,都与数据库对DateAscending 列的期望不匹配。

由于 OleDb 是一个通用提供程序,我们不知道您正在使用哪种数据库,但大多数数据库都有一种方法可以在 SQL 中获取当前日期值:getdate()current_timestamp 等. 使用该机制可能会解决冲突,并且首先不需要使用字符串连接。

Dim sql As String = "SELECT ArithmeticScore FROM " & tablename & " WHERE DateAscending = Date()"

解决此问题的另一种方法是使用适当的参数化查询,无论如何您都应该这样做。 绝不可以使用字符串连接将数据替换为 SQL 查询,如果您发现自己需要考虑如何格式化日期或数字字符串以在 SQL 命令中使用,那么您几乎总是做错事。

【讨论】:

  • 那么数据库中没有记录在 DateAscending 中存在 todaysdate 的记录?
  • 没有。如果没有记录,您会看到不同的消息。这表示todaysdate 值的格式不正确,无法与DateAscending 进行比较。
  • 我在变量todaysdateDateAscending中写入了日期在程序中多次都没有问题,写入和读取时对数据类型的处理是否不同?
猜你喜欢
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
相关资源
最近更新 更多