2011-11-27 71 views
0

我正在處理連接到Microsoft Access數據庫的Windows窗體項目,讀取文件,執行一些數學計算,然後提供一些基本統計數據。現在我正在自學VB,我知道下面的代碼可能更有效率。但是,現在我只是想讓它發揮功能。在調用'Fill'之前,select命令屬性尚未初始化

程序通過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 
+2

這是很多代碼發佈您的錯誤。你可以嘗試把它修剪到相關的部分嗎? – LarsTech

回答

1

的問題是,您要填寫後立即處置的dataadapters。

這就是爲什麼它可以在表單加載的情況下運行,但不能在這之後運行。最好的做法是創建和刪除y使用它們的方法中的數據適配器,而不是在表單級別的spec上創建它們。

+1

+1使用'using'語句而不是調用Dispose也是一個好主意。這隻能在OP按您的建議進行時才能完成。 –

+0

謝謝大家的建議。 – Brad

+0

不客氣。請記住,如果答案已解決或幫助您解決問題,請點擊答案旁邊的複選框,讓未來的問題訪問者知道該答案適合您。 –

相關問題