2015-02-23 20 views
1

我正在設計使用Visual Basic與.Net 4.0與MS SQL服務器後端存儲數據的軟件。我爲數據庫的「員工工資」部分設計了一個類。這個類的子例程的目的是重置已經準備好的工資表。每次用戶「運行工資單」時,都會使用[SELECT * INTO]方法創建當前關聯表的備份。這部分通常工作得很好,沒有問題或問題。我遇到的問題是當我嘗試[重置]工資單時,[DROPS]「已修改」表並且再次使用[SELECT * INTO]方法從先前創建的備份中重新創建表。這是我寫的[RESET]代碼的示例。對於SQL查詢循環VB.net應用程序太快

Public Sub Reset_Payroll() 
    Dim conn As New SqlConnection() 
    conn.ConnectionString = _sqlConnector 

    Dim varSQL(4) As String 
    varSQL(0) = "DROP TABLE [EMPLOYEEWAGES]" 
    varSQL(1) = "DROP TABLE [EMPLOYEECHECKS]" 
    varSQL(2) = "DROP TABLE [EMPLOYEEREGISTAR]" 
    varSQL(3) = "DROP TABLE [EMPLOYEEPAY]" 

    For x As Integer = 0 To 3 
     Try 
      If conn.State = ConnectionState.Closed Then 
       conn.Open() 
      End If 
      Dim cmd As New SqlCommand(varSQL(x), conn) 
      cmd.ExecuteNonQuery() 
      Application.DoEvents() 
     Catch ex As Exception 
      MsgBox("PLEASE REPORT THIS MESSAGE TO CIS DEPT: " & ex.ToString, vbOKOnly, "STAFF WAGES [CREATE WAGES_TEMP] GENERAL EXCEPTION ERROR.") 
      'Utilities.CreateMessageAlert(_aspxPage, "PLEASE REPORT THIS MESSAGE TO CIS DEPT: " & ex.ToString, "strKey") 
      conn.Close() 
     End Try 
    Next 

    varSQL(0) = "SELECT * INTO [EMPLOYEEWAGES] FROM [EMPLOYEEWAGES_RUNCHK]" 
    varSQL(1) = "SELECT * INTO [EMPLOYEECHECKS] FROM [EMPLOYEECHECKS_RUNCHK]" 
    varSQL(2) = "SELECT * INTO [EMPLOYEEREGISTAR] FROM [EMPLOYEEREGISTAR_RUNCHK]" 
    varSQL(3) = "SELECT * INTO [EMPLOYEEPAY] FROM [EMPLOYEEPAY_RUNCHK]" 

    For x As Integer = 0 To 3 
     Try 
      If conn.State = ConnectionState.Closed Then 
       conn.Open() 
      End If 
      Dim cmd As New SqlCommand(varSQL(x), conn) 
      cmd.ExecuteNonQuery() 
      Application.DoEvents() 
     Catch ex As Exception 
      MsgBox("PLEASE REPORT THIS MESSAGE TO CIS DEPT: " & ex.ToString, vbOKOnly, "STAFF WAGES [CREATE WAGES_TEMP] GENERAL EXCEPTION ERROR.") 
      'Utilities.CreateMessageAlert(_aspxPage, "PLEASE REPORT THIS MESSAGE TO CIS DEPT: " & ex.ToString, "strKey") 
     Finally 
      conn.Close() 
     End Try 
    Next 

    varSQL(0) = "DROP TABLE [EMPLOYEEWAGES_RUNCHK]" 
    varSQL(1) = "DROP TABLE [EMPLOYEECHECKS_RUNCHK]" 
    varSQL(2) = "DROP TABLE [EMPLOYEEREGISTAR_RUNCHK]" 
    varSQL(3) = "DROP TABLE [EMPLOYEEPAY_RUNCHK]" 

    For x As Integer = 0 To 3 
     Try 
      If conn.State = ConnectionState.Closed Then 
       conn.Open() 
      End If 
      Dim cmd As New SqlCommand(varSQL(x), conn) 
      Application.DoEvents() 
      cmd.ExecuteNonQuery() 
     Catch ex As Exception 
      MsgBox("PLEASE REPORT THIS MESSAGE TO CIS DEPT: " & ex.ToString, vbOKOnly, "STAFF WAGES [CREATE WAGES_TEMP] GENERAL EXCEPTION ERROR.") 
      'Utilities.CreateMessageAlert(_aspxPage, "PLEASE REPORT THIS MESSAGE TO CIS DEPT: " & ex.ToString, "strKey") 
     Finally 
      conn.Close() 
     End Try 
    Next 

End Sub 

我有問題的區域是在代碼,其中該系統被重新創建,工資,支票,註冊器的所述第二部分,並從備份表[WAGES_RUNCHK]支付表。在前面的SQL查詢完成之前,似乎sql命令之間的for循環處理執行得太快。因此,一些表格不會從備份中重新創建,並且數據正在丟失。我添加了application.DoEvents(),但沒有投入生產。以前我不得不實施thread.sleep()事件來嘗試給它一些時間來處理,但是我對這兩種解決方案都不滿意。

是否有任何方法或方法可以實現暫停,直到上一個查詢完成。允許系統與For循環中的SQL服務器進行通信: 「以前的查詢是否完成,如果是,則選擇[SELECT INTO]下一個查詢。我一直試圖讀取多線程處理,但仍然找到了一個舒適的解決方案。任何援助將不勝感激

+0

爲什麼不把所有這些都放到存儲過程中?它會簡化你的代碼。 – 2015-02-23 15:54:15

+0

感謝您的快速回復。然後我只需要調用SQL服務器來運行存儲過程。這是否會解決程序移動「太快」而不是等待它們完成的問題?換句話說,在其他存儲過程運行時調用存儲過程仍然會導致問題? – 2015-02-23 16:11:35

+0

VB和.NET版本號是否相同? – JeffO 2015-02-23 20:40:31

回答

3

我會做一個單一的存儲過程中的所有12個語句:。

CREATE PROCEDURE dbo.resetPayroll 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 
    DROP TABLE [EMPLOYEEWAGES] 
    DROP TABLE [EMPLOYEECHECKS] 
    DROP TABLE [EMPLOYEEREGISTAR] 
    DROP TABLE [EMPLOYEEPAY] 
    SELECT * INTO [EMPLOYEEWAGES] FROM [EMPLOYEEWAGES_RUNCHK] 
    SELECT * INTO [EMPLOYEECHECKS] FROM [EMPLOYEECHECKS_RUNCHK] 
    SELECT * INTO [EMPLOYEEREGISTAR] FROM [EMPLOYEEREGISTAR_RUNCHK] 
    SELECT * INTO [EMPLOYEEPAY] FROM [EMPLOYEEPAY_RUNCHK] 
    DROP TABLE [EMPLOYEEWAGES_RUNCHK] 
    DROP TABLE [EMPLOYEECHECKS_RUNCHK] 
    DROP TABLE [EMPLOYEEREGISTAR_RUNCHK] 
    DROP TABLE [EMPLOYEEPAY_RUNCHK] 
END 

請注意,我的樣本存儲過程不包含任何錯誤捕獲或報告包裝在交易中這可能是一個非常好的主意。

然後您的代碼將成爲對數據庫的單個調用:

Dim cmd as New SqlCommand("resetPayroll", conn) 
cmd.CommandType = CommandType.StoredProcedure 
cmd.ExecuteNonQuery() 
+0

存儲過程+1。我常常看到開發者因爲所有錯誤的原因而沮喪。我同意丹的評估,認爲這應該包含在交易中。 – mgw854 2015-02-23 17:03:26

+0

非常感謝您推薦存儲過程。由於它,我可以看到軟件正在發展成爲更強大的軟件。非常感謝你。 – 2015-02-23 17:47:07

+0

@wewesthemenace我意外地發佈了我改爲「答案」的代碼,而不是作爲評論來問我是否按照建議實施了。我相信我有答案。我看起來沒有測試時發生的問題。謝謝大家的幫助。現在我可能需要一些更多的幫助,知道在哪裏標記爲已回答。從字面上看,我是第一次來到這個網站,因爲我被推薦由一位同事來到這裏。 – 2015-02-24 14:45:34