我正在設計使用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]下一個查詢。我一直試圖讀取多線程處理,但仍然找到了一個舒適的解決方案。任何援助將不勝感激
爲什麼不把所有這些都放到存儲過程中?它會簡化你的代碼。 – 2015-02-23 15:54:15
感謝您的快速回復。然後我只需要調用SQL服務器來運行存儲過程。這是否會解決程序移動「太快」而不是等待它們完成的問題?換句話說,在其他存儲過程運行時調用存儲過程仍然會導致問題? – 2015-02-23 16:11:35
VB和.NET版本號是否相同? – JeffO 2015-02-23 20:40:31