【问题标题】:VB.Net Application does not return all Oracle data rowsVB.Net 应用程序不返回所有 Oracle 数据行
【发布时间】:2019-05-16 04:13:15
【问题描述】:

我有一个我们已经使用了一段时间的 VB.Net 应用程序。最近有人指出,我们为零件编号加载到程序中的数据集缺少一些记录。

我尝试了 select 语句的不同变体。我已经编辑了应用程序下拉菜单属性以使下拉菜单更大,试图让它显示更多问题。我还尝试重写将我的数据集行添加到下拉列表中的项目的循环。我放了一个消息框来给我记录数,数据集中缺少大约 80 条记录。

我通过打开我的数据库客户端并对数据库运行完全相同的 select 语句来确认这一点。在数据库客户端上运行 select 语句会返回所有行,但如果我使用数据适配器运行它并填充数据集,则会丢失记录。下面是我的代码。对可能发生的事情有什么建议吗?

'Load Part #s
OraSQL = "SELECT Part_No FROM TableName Where Contract = 'ContractName' AND Part_No Like 'PartPrefix%' AND Pat_No NOT LIKE = 'WrongPartPrefix%'"
OraDa = New Odbc.OdbcDataAdapter(OraSQL, OraCon)
OraCon.Open()
OraDa.Fill(OraDs, "Part")
OraCon.Close()
'Populate Combo Box with Active Machines
SelectedRow = 0

' Load items into dropdown
        TotalRows = OraDs.Tables("Part").Rows.Count
        SelectedRow = 0
        TxtPartNo.Items.Add("")
        While SelectedRow < TotalRows
            TxtPartNo.Items.Add(OraDs.Tables("Part").Rows(SelectedRow).Item("Part_No"))
            SelectedRow += 1
        End While

编辑:我更新了 SQL 语句,使其看起来更像我正在使用的实际 SQL 语句。只有一个 WHERE 语句后跟 AND 运算符。

再次编辑:我重写了函数以利用数据读取器而不是数据适配器来查看以更有效的方式重写是否会有所帮助。但是,我仍然得到相同的结果。下面是代码块:

Using OraCon

    Dim command As Odbc.OdbcCommand = New Odbc.OdbcCommand(OraSQL, OraCon)

    OraCon.Open()
    Dim reader As Odbc.OdbcDataReader = command.ExecuteReader()

    If reader.HasRows Then
        Do While reader.Read()
            TxtPartNo.Items.Add(reader.GetString(0))
        Loop
    End If
    OraCon.Close()
End Using

【问题讨论】:

  • 可能是错误的,但TotalRows = MyDs.Tables("Machine").Rows.Count 行引用了一个名为Machine 的表,稍后您在TxtPartNo.Items.Add(OraDs.Tables("Part").Rows(SelectedRow).Item("Part_No")) 中请求名为Part 的表
  • 抱歉,该行实际上引用了我们从中获取机器信息的另一个数据集。它不会对 part_no 数据集做任何事情。
  • 我建议,为了测试,您使用查询“SELECT COUNT(Part_No) FROM TableName Where Contract = 'ContractName' Where Part_No Like 'PartPrefix%'" 并调用ExecuteScalar 然后直接对您的数据库执行相同的查询。如果它们返回不同的值,那么唯一的解释是您的系统上的某些内容已损坏,或者您正在使用两个不同的数据库。
  • 我还发现了两个与您的代码质量无关的问题。首先,如果您只是要将值直接添加为项目,请使用数据读取器而不是数据适配器和DataTable。如果要使用数据适配器和DataTable,请将DataTable 绑定到控件而不是使用DataSet 来保存单个DataTable。最后,如果您要使用循环,While 循环是一个愚蠢的选择。这是For Each 循环的工作。
  • 我看到的另一个问题是声明 "SELECT Part_No FROM TableName Where Contract = 'ContractName' Where Part_No Like 'PartPrefix%'" 不正确,根本不起作用。 - 太多WHERE 语句

标签: vb.net datatable dataset


【解决方案1】:

原来我在程序中使用了我们的测试数据源,并在客户端使用了生产数据库。像个白痴一样。感谢所有帮助过的人!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 2017-08-28
    相关资源
    最近更新 更多