需要扩展DataTable的范围

时间:2014-10-23 13:26:17

标签: vb.net datatable scope ms-access-2010

我将旧的VB 7代码转换为使用ODBC连接到SQL Anywhere DB到VB 2013和Access 2010 DB。

我在模块的顶部声明了几个DataSet,但是当我进入过程和函数时,我已经失去了DataTable的范围。

我声明了以下内容:

Public con As New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\CLI_CRVM.accdb")

Public extractDA As New OleDbDataAdapter("SELECT * FROM [extract]", con)
Public extractCB = New OleDbCommandBuilder(extractDA)
Public extractDT As DataTable
Public extractDR As DataRow

然后,在按钮的单击事件中,我调用一个加载DataTable的过程:

extractCB.quoteprefix = "["
extractCB.quotesuffix = "]"
extractDT = New DataTable
extractDA.Fill(extractDT)

当它返回到单击的事件代码时,它会执行For Each循环:

For Each extractDR As System.Data.DataRow In extractDT.Rows

此时,我可以看到DataTable中的值,如下所示:

ls_plan_code = Trim(extractDR("plan_code"))
MsgBox("Plan Code: " & ls_plan_code)

但是当我调用一个需要DataTable值的过程或函数时,它们就不再可用了。 IE浏览器。执行时:

Sub accumulation(ByVal adec_premium As Decimal, ByVal ai_stage As Integer)
    Dim ldec_mode As Decimal
    ldec_mode = CDec(extractDR("pay_mode"))
End Sub

我收到此错误:"对象引用未设置为对象的实例。"

我知道一种解决方法是将DataRow传递给子例程;但是,有几个DataTables和许多过程和函数,其中一些调用依赖于其他DataTables数据的其他过程和函数。此外,一些子例程将值写入答案DataTable,然后将其写入Access DB。

所以,虽然我知道这可能不是"正确的"表单,我必须得到这个代码并运行来测试值,如果有一种方法 - 就像在VB 7代码中那样 - 让DataTable的范围扩展到整个模块,我想我的问题将得到解决。

提前致谢!

1 个答案:

答案 0 :(得分:2)

在以下行中:

For Each extractDR As System.Data.DataRow In extractDT.Rows

通过指定extractDR As System.Data.DataRow,您将创建一个 new 变量。该变量被赋予值,而不是在较高范围内具有相同名称的变量。

只需删除As System.Data.DataRow

即可
For Each extractDR In extractDT.Rows