使用多种形式的数据集

时间:2014-03-18 08:51:13

标签: vb.net forms dataset

我正在使用vb.net从sql server数据库加载数据。我在我的模块中定义了一个数据集 并希望以多种形式Public dsDataset As DataSet使用它。当我加载主窗体时,我加载了所有窗体中可能相同的选项,如部门和部分,因此我不必在所有窗体中再次加载它们。当从主窗体导航到另一个窗体时,我在窗体构造函数中传递此数据集。

在主要表单中,我正在加载这些选项:

Sub loadOptions()
        Dim da As SqlDataAdapter
        Dim sql As String

        Try
            sqlConn = New SqlConnection(connString)
            sqlConn.Open()

            sql = " select depId, name from DEPARTMENT "
            da = New SqlDataAdapter(sql, sqlConn)
            da.Fill(dsDataset, "department")


            sql = " select select depId, sectionId, name from SECTION "
            da = New SqlDataAdapter(sql, sqlConn)
            da.Fill(dsDataset, "section")

            '----------------------------------------------------------------------

            sqlConn.Close()
        Catch ex As Exception
            sqlConn.Close()
            MsgBox(Err.Description)
        End Try
    End Sub

然后假设我有打印机表单从数据库加载数据并使用dsDataset中的选项而不是再次加载它们。我按如下方式传递数据集:

Dim printers As frmPrinters = New frmPrinters(dsDataset)
printers.ShowDialog()

并且在打印机表单中我有一个构造函数如下:

Sub New(ByRef dsDataset As DataSet)
        InitializeComponent()

        cmbDepartment.DataSource = dsDataset.Tables("department")
        cmbDepartment.DisplayMember = "name"
        cmbDepartment.ValueMember = "depId"

        cmbSection.DataSource = dsDataset.Tables("section")
        cmbSection.DisplayMember = "name"
        cmbSection.ValueMember = "sectionId"

    End Sub

将所有打印机加载到数据集中没有问题:

 sql = "select * from printer where printerId=" & printerId
 daPrinter = New SqlDataAdapter(sql, sqlConn)
 daPrinter.Fill(dsDataset, "printer")
 dgvPrinters.DataSource = dsDataset.Tables("printers")

现在,当我双击任何一台打印机时,我会转到另一张表格,按如下方式加载该特定打印机的详细信息:

printerId = dgvPrinters.Rows(dgvPrinters.CurrentRow.Index).Cells(0).Value
printerMode = "modify"
Dim printer As New frmPrinter(dsDataset)
printer.ShowDialog()

在新表单中,我使用上面相同的构造函数,但问题发生在那里。出现以下错误:

Value cannot be null.
Parameter name: dataSet

我做错了什么?

1 个答案:

答案 0 :(得分:0)

看起来您并没有在构造函数中的任何位置保存dsDataset。例如,在私有变量中。我的猜测是在frmPrinters里面你会有一个公共dsDataSet变量,你永远不会设置它。

所以你应该做的是:

在frmPrinter中创建一个名为_dsDataset的私有dsDataSet变量:

Private _dsDataset As DataSet

在构造函数中执行以下操作:

_dsDataset = dsDataset

最后在doubleclick事件中发送私有变量:

Dim printer As New frmPrinter(_dsDataset)

然后你应该没事。