为啥我的数据表单元格返回空值?

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 子句中丢弃了不需要的括号;如果我丢弃了太多,您可能需要添加一些。

还要考虑您是否发现ALikeLike 的合适替代品:

WHERE ProjectNum ALike IIF([@priorityDefID] = 4, "C%", "F%");

对于ALike,Access db 引擎总是期望通配符为%_,而不管查询运行的上下文... ADO、DAO、OleDb ...它将始终返回相同的结果集。因此,使用 ALike 时,查询在 Access 会话中的工作方式与使用 OleDb 从 .Net 调用时的工作方式相同。

【讨论】:

好的,这很神奇。我正在使用 OleDB。现在,当我在访问中运行存储的查询时,它只返回在我的应用程序中工作。我离开了括号。感谢您的帮助,整天都在努力解决这个问题。 好。别客气。看看你是否发现我添加的关于ALike 的注释有用。我个人更喜欢ALike 而不是Like,但有些人似乎不喜欢ALike。 :-) 从来不知道。很高兴知道,它也适用于 ALIKE 的两端。现在我可以继续前进了:)

以上是关于为啥我的数据表单元格返回空值?的主要内容,如果未能解决你的问题,请参考以下文章

如何将具有隐藏字符的空白/单元格转换为空值或以其他方式删除隐藏字符

为啥导航返回后表格视图单元格背景视图工作良好?

为啥我的collectionView中的单元格的形成速度比接收数据的方法快,因为它们的形成?

为啥 futureBuilder 返回一个空值?

Java-poi-excel-对空值单元格的读取

为啥 TableView 只返回一个单元格?