在调用'Fill'之前尚未初始化select命令属性

时间:2011-11-27 16:41:40

标签: vb.net ms-access

我正在开发一个连接到Microsoft Access数据库的Windows窗体项目,读取该文件,进行一些数学运算,然后提供一些基本的统计信息。现在我正在自学VB,我知道下面的代码可能更有效率。但是,现在我只是想让它发挥作用。

程序通过sql过滤所需的数据,并且有几个sql语句。我将每个sql语句的代码分隔成子例程,以便在表单加载时以及用户单击按钮进行更新时调用每个语句。该程序在表单加载时工作正常,但是,当您单击更新按钮时,在子例程Count()中的'odaCalls.Fill'上会出现以下错误:“在调用'Fill'之前,尚未初始化select命令属性。

非常感谢任何帮助。我在谷歌搜索并尝试了那里找到的建议,但没有找到解决办法。

Option Explicit On

Public Class Form1

  'Count() Variables
  Dim strSQL = "SELECT * FROM tblcallLog"

  Dim strPath As String = "Provider=Microsoft.ACE.OLEDB.12.0 ;" _
        & "Data Source=C:\callLogRev2_be.accdb"
  Dim odaCalls As New OleDb.OleDbDataAdapter(strSQL, strPath)
  Dim datCallCount As New DataTable
  Dim intCount As Integer = 0

  'LiveCalls() variables
  Dim strSQLLive As String = "SELECT * FROM tblcallLog WHERE callLive=True"
  Dim odaCallsLive As New OleDb.OleDbDataAdapter(strSQLLive, strPath)
  Dim datCallLive As New DataTable
  Dim intCallLiveCount As Integer = 0
  Dim decCallLivePct As Decimal

  'TransferCalls() variables
  Dim strSQLTransfered As String = _
      "SELECT * FROM tblcallLog WHERE callName LIKE '% transfer %' OR callName LIKE 'transfer%'"
  Dim odaCallsTransfered As New OleDb.OleDbDataAdapter(strSQLTransfered, strPath)
  Dim datCallTransfered As New DataTable
  Dim intCallTransfered As Integer = 0
  Dim decCallTranfered As Decimal

  'SingleStaffCall() Variables
  Dim strSQLSingleStaff As String = _
      "SELECT * FROM tblcallLog WHERE callName LIKE '% single %' OR callName LIKE 'single%'"
  Dim odaCallSingleStaff As New OleDb.OleDbDataAdapter(strSQLSingleStaff, strPath)
  Dim datCallSingleStaff As New DataTable
  Dim intCallSingleStaff As Integer = 0
  Dim decCallSingleStaff As Decimal

  'SingleStaffCallsLive() Variables
  Dim strSQLSingleStaffLive As String = _
      "SELECT * FROM tblcallLog WHERE callName LIKE '% single %' OR callName LIKE 'single%' AND callLive=True"
  Dim odaCallSingleStaffLive As New OleDb.OleDbDataAdapter(strSQLSingleStaffLive, strPath)
  Dim datCallSingleStaffLive As New DataTable
  Dim intCallSingleStaffLive As Integer = 0
  Dim decCallSingleStaffLive As Decimal

  'CallToday() Variables
  Dim strSQLToday As String = _
      "SELECT * FROM tblcallLog WHERE startDate = date()"
  Dim odaCallToday As New OleDb.OleDbDataAdapter(strSQLToday, strPath)
  Dim datCallToday As New DataTable
  Dim intCallToday As New Integer

  'CallTodayLive() Variables
  Dim strSQLTodayLiveCalls As String = _
      "SELECT * FROM tblcallLog WHERE callLive=TRUE AND startDate = date()"
  Dim odaCallTodayLive As New OleDb.OleDbDataAdapter(strSQLTodayLiveCalls, strPath)
  Dim datCallTodayLive As New DataTable
  Dim intCallTodayLive As New Integer
  Dim decCallTodayLive As New Decimal

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Count()
    LiveCalls()
    TransferCalls()
    SingleStaffCalls()
    SingleStaffCallsLive()
    CallToday()
    CallTodayLive()
  End Sub

  Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click

    'Checks the database for updates when user pushes the update button on the static data tab.
    Count()
    LiveCalls()
    TransferCalls()
    SingleStaffCalls()
    SingleStaffCallsLive()
    CallToday()
    CallTodayLive()
  End Sub

  Private Sub Count()
    'database connect and call count
    odaCalls.Fill(datCallCount)
    odaCalls.Dispose()

    intCount = datCallCount.Rows.Count

    lblTotalCallsData.Text = intCount.ToString
    lblTotalCallsData.Visible = True
  End Sub

  Private Sub LiveCalls()
    'determine number of live calls
    odaCallsLive.Fill(datCallLive)
    odaCallsLive.Dispose()

    intCallLiveCount = datCallLive.Rows.Count
    lblcallsLiveData.Text = intCallLiveCount.ToString
    lblcallsLiveData.Visible = True

    decCallLivePct = intCallLiveCount / intCount
    lblPctCallsLiveData.Text = decCallLivePct.ToString("P")
    lblPctCallsLiveData.Visible = True
  End Sub

  Private Sub TransferCalls()
    'determine the number of transfer calls

    odaCallsTransfered.Fill(datCallTransfered)
    odaCallsTransfered.Dispose()

    intCallTransfered = datCallTransfered.Rows.Count
    lblTotalTransferCallsData.Text = intCallTransfered.ToString
    lblTotalTransferCallsData.Visible = True

    decCallTranfered = intCallTransfered / intCount
    lblPctTransferCallsData.Text = decCallTranfered.ToString("P")
    lblPctTransferCallsData.Visible = True
  End Sub

  Private Sub SingleStaffCalls()
    'determine the number of single staff calls and percentage of total

    odaCallSingleStaff.Fill(datCallSingleStaff)
    odaCallSingleStaff.Dispose()

    intCallSingleStaff = datCallSingleStaff.Rows.Count
    lblTotalSingleStaffCallData.Text = intCallSingleStaff.ToString
    lblTotalSingleStaffCallData.Visible = True
    decCallSingleStaff = intCallSingleStaff / intCount
    lblPctSingleStaffCallsData.Text = decCallSingleStaff.ToString("P")
  End Sub

  Private Sub SingleStaffCallsLive()
    'determine the percentage of single staff calls taken live

    odaCallSingleStaffLive.Fill(datCallSingleStaffLive)
    odaCallSingleStaffLive.Dispose()

    intCallSingleStaffLive = datCallSingleStaffLive.Rows.Count
    decCallSingleStaffLive = intCallSingleStaffLive / intCount

    lblPctSingleStaffCallsLiveData.Visible = True
    lblPctSingleStaffCallsLiveData.Text = decCallSingleStaffLive.ToString("P")
  End Sub

  Private Sub CallToday()
    'determine values for todays date
    odaCallToday.Fill(datCallToday)
    odaCallToday.Dispose()

    intCallToday = datCallToday.Rows.Count
    lblTotalCallsTodayData.Text = intCallToday
    lblTotalCallsTodayData.Visible = True
  End Sub

  Private Sub CallTodayLive()
    'determine the number of live calls today
    odaCallTodayLive.Fill(datCallTodayLive)
    odaCallTodayLive.Dispose()

    intCallTodayLive = datCallTodayLive.Rows.Count
    lblCallsTodayLiveData.Text = intCallTodayLive.ToString
    lblCallsTodayLiveData.Visible = True

    'Statement to error correct so the database doesn't force the program to divide by zero
    Try
      decCallTodayLive = intCallTodayLive / intCallToday
    Catch Exception As DivideByZeroException
      lblPctCallsTodayLiveData.Text = "0.00%"
      lblPctCallsTodayLiveData.Visible = True
    Catch Exception As OverflowException
      decCallTodayLive = 0
    End Try

    lblPctCallsTodayLiveData.Text = decCallTodayLive.ToString("P")
    lblPctCallsTodayLiveData.Visible = True
  End Sub
End Class

1 个答案:

答案 0 :(得分:1)

问题是您在填充后立即处理数据适配器。

这就是为什么它适用于表单加载,而不是之后。最好的做法是在使用它们的方法中创建和销毁dataadapter,而不是在表单级别的spec上创建它们。