我正在使用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
我做错了什么?
答案 0 :(得分:0)
看起来您并没有在构造函数中的任何位置保存dsDataset。例如,在私有变量中。我的猜测是在frmPrinters里面你会有一个公共dsDataSet变量,你永远不会设置它。
所以你应该做的是:
在frmPrinter中创建一个名为_dsDataset的私有dsDataSet变量:
Private _dsDataset As DataSet
在构造函数中执行以下操作:
_dsDataset = dsDataset
最后在doubleclick事件中发送私有变量:
Dim printer As New frmPrinter(_dsDataset)
然后你应该没事。