为啥我的数据表单元格返回空值?
Posted
技术标签:
【中文标题】为啥我的数据表单元格返回空值?【英文标题】:Why is my datatable cell returning a null value?为什么我的数据表单元格返回空值? 【发布时间】:2013-05-17 17:00:41 【问题描述】:我有一个访问数据库和一个存储查询。这是我的查询...
SELECT MAX(CLNG(RIGHT(ProjectNum, 6))) AS LastDigits
FROM project_master_query
WHERE ((ProjectNum LIKE (IIF([@priorityDefID] = 4, "C*", "F*"))));
当我运行此查询并传入 @priorityDefID 为 2 时,我会返回 LastDigits 的列名和包含正确值 1 的行。这是我调用它的 VB 代码...
'Project Class (Without adding unnecessary code)
Public Shared Function GenerateProjectNumber(ByVal priorityDefID As Integer) As String
Dim dt As DataTable = ProjectSQL.GetLastGeneratedNumber(priorityDefID)
Dim lastGeneratedNumber As Integer
If dt.Rows.Count > 0 Then
'Exception Occurs Below: DBNull cannot be cast to other types
lastGeneratedNumber = Convert.ToInt32(dt.Rows(0).Item(0)) ' Or .Item("LastDigits"))
End If
End Function
'ProjectSQL Class
Public Shared Function GetLastGeneratedNumber(ByVal priorityDefID As Integer) As DataTable
Dim parameterList As New List(Of DataParameter)
parameterList.Add(New DataParameter("@priorityDefID", priorityDefID, ParameterDirection.Input, OleDbType.Integer))
Return DAL.GetDataTableUsingReader("GetLastGeneratedNumber", parameterList)
End Function
现在您可以看到,返回了一行,但它包含一个空值。当我在 Access 中运行查询并传入与通过 VB 传入的完全相同的值时,我得到了正确的值。当我通过代码运行它时,我得到一个空值。这里有什么突出的我想念的东西吗?
【问题讨论】:
【参考方案1】:我假设您的 .Net
使用 OleDb 连接到 Access db 文件。 OleDb(与 Access 中的 ADO 相同)需要不同的通配符:%
和 _
,而不是分别使用 *
和 ?
。
试试这个方法:
WHERE ProjectNum LIKE IIF([@priorityDefID] = 4, "C%", "F%");
注意我从WHERE
子句中丢弃了不需要的括号;如果我丢弃了太多,您可能需要添加一些。
还要考虑您是否发现ALike
是Like
的合适替代品:
WHERE ProjectNum ALike IIF([@priorityDefID] = 4, "C%", "F%");
对于ALike
,Access db 引擎总是期望通配符为%
和_
,而不管查询运行的上下文... ADO、DAO、OleDb ...它将始终返回相同的结果集。因此,使用 ALike
时,查询在 Access 会话中的工作方式与使用 OleDb 从 .Net
调用时的工作方式相同。
【讨论】:
好的,这很神奇。我正在使用 OleDB。现在,当我在访问中运行存储的查询时,它只返回在我的应用程序中工作。我离开了括号。感谢您的帮助,整天都在努力解决这个问题。 好。别客气。看看你是否发现我添加的关于ALike
的注释有用。我个人更喜欢ALike
而不是Like
,但有些人似乎不喜欢ALike
。 :-)
从来不知道。很高兴知道,它也适用于 ALIKE 的两端。现在我可以继续前进了:)以上是关于为啥我的数据表单元格返回空值?的主要内容,如果未能解决你的问题,请参考以下文章
如何将具有隐藏字符的空白/单元格转换为空值或以其他方式删除隐藏字符