Sql server VB.net应用程序对于SQL查询循环太快

Sql server VB.net应用程序对于SQL查询循环太快,sql-server,vb.net,.net-4.0,Sql Server,Vb.net,.net 4.0,我正在使用Visual Basic和.Net 4.0以及MS SQL server后端设计用于存储数据的软件。我为数据库的“雇员工资”部分设计了一个类。此类子例程的目的是重置已准备好的工资表。每次用户“运行工资单”时,它都会使用[SELECT*INTO]方法创建当前关联表的备份。这部分通常工作得很好,没有问题。我遇到的问题是,当我尝试[重置]工资单时,它[删除]了“已修改”的表,并再次使用[SELECT*into]方法从以前创建的备份中重新创建表。下面是我编写的[RESET]代码示例 Publi

我正在使用Visual Basic和.Net 4.0以及MS SQL server后端设计用于存储数据的软件。我为数据库的“雇员工资”部分设计了一个类。此类子例程的目的是重置已准备好的工资表。每次用户“运行工资单”时,它都会使用[SELECT*INTO]方法创建当前关联表的备份。这部分通常工作得很好,没有问题。我遇到的问题是,当我尝试[重置]工资单时,它[删除]了“已修改”的表,并再次使用[SELECT*into]方法从以前创建的备份中重新创建表。下面是我编写的[RESET]代码示例

Public Sub Reset_Payroll()
Dim conn作为新的SqlConnection()连接
conn.ConnectionString=\u sqlConnector
Dim varSQL(4)作为字符串
varSQL(0)=“删除表[员工工资]”
varSQL(1)=“删除表[EMPLOYEECHECKS]”
varSQL(2)=“删除表[EMPLOYEEREGISTAR]”
varSQL(3)=“删除表[EMPLOYEEPAY]”
对于x作为整数=0到3
尝试
如果连接状态=连接状态关闭,则
康涅狄格州公开赛
如果结束
Dim cmd作为新的SqlCommand(varSQL(x),conn)
cmd.ExecuteNonQuery()
Application.DoEvents()
特例
MsgBox(“请将此消息报告给CIS部门:”&ex.ToString,vbOKOnly,“员工工资[创建工资]一般异常错误。”)
'Utilities.CreateMessageAlert(_aspxPage,“请将此消息报告给CIS部门:”&ex.ToString,“strKey”)
康涅狄格州关闭
结束尝试
下一个
varSQL(0)=“从[EMPLOYEEWAGES\u RUNCHK]中选择*进入[EMPLOYEEWAGES]”
varSQL(1)=“从[EMPLOYEECHECKS\u RUNCHK]选择*进入[EMPLOYEECHECKS]”
varSQL(2)=“从[EMPLOYEEREGISTAR\u RUNCHK]选择*进入[EMPLOYEEREGISTAR]”
varSQL(3)=“从[EMPLOYEEPAY\u RUNCHK]选择*进入[EMPLOYEEPAY]”
对于x作为整数=0到3
尝试
如果连接状态=连接状态关闭,则
康涅狄格州公开赛
如果结束
Dim cmd作为新的SqlCommand(varSQL(x),conn)
cmd.ExecuteNonQuery()
Application.DoEvents()
特例
MsgBox(“请将此消息报告给CIS部门:”&ex.ToString,vbOKOnly,“员工工资[创建工资]一般异常错误。”)
'Utilities.CreateMessageAlert(_aspxPage,“请将此消息报告给CIS部门:”&ex.ToString,“strKey”)
最后
康涅狄格州关闭
结束尝试
下一个
varSQL(0)=“删除表[EMPLOYEEWAGES\u RUNCHK]”
varSQL(1)=“删除表[EMPLOYEECHECKS\u RUNCHK]”
varSQL(2)=“删除表[EMPLOYEEREGISTAR\u RUNCHK]”
varSQL(3)=“删除表[EMPLOYEEPAY\u RUNCHK]”
对于x作为整数=0到3
尝试
如果连接状态=连接状态关闭,则
康涅狄格州公开赛
如果结束
Dim cmd作为新的SqlCommand(varSQL(x),conn)
Application.DoEvents()
cmd.ExecuteNonQuery()
特例
MsgBox(“请将此消息报告给CIS部门:”&ex.ToString,vbOKOnly,“员工工资[创建工资]一般异常错误。”)
'Utilities.CreateMessageAlert(_aspxPage,“请将此消息报告给CIS部门:”&ex.ToString,“strKey”)
最后
康涅狄格州关闭
结束尝试
下一个
端接头
我遇到问题的地方在代码的第二部分,系统正在从备份表[Sweers_RUNCHK]重新创建工资、支票、注册表和工资表。在上一个sql查询完成之前,sql命令之间的for循环处理似乎执行得太快。因此,某些表没有从备份中重新创建,数据正在丢失。我添加了application.DoEvents(),但尚未将其投入生产。以前,我必须实现thread.sleep()事件来尝试给它处理时间,但我对这两种解决方案都不满意

是否有任何方法或方式可以实现暂停,直到上一个查询完成。允许系统在For循环内与SQL server通信:
“上一个查询是否已完成,如果已完成,则[选择进入]下一个查询。我一直在尝试阅读多线程处理,但仍然找到了一个令人满意的解决方案。如有任何帮助,将不胜感激。

我将制作一个包含所有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()

为什么不把所有这些都放到一个存储过程中呢?这会简化您的代码。谢谢您的快速响应。然后我只需要调用SQL server来运行存储过程。这会解决程序运行“太快”的问题吗“为了查询而不是等待查询完成?换句话说,在另一个存储过程运行时调用该存储过程是否仍然会导致问题?VB和.NET版本号是否相同?对不起,JeffO,我不太理解这个问题。最初该程序是用ASP.net 4.0编写的,但我们迁移到Windows应用程序,现在使用Windows窗体。但是,此代码位于调用子例程的vb.net 4.0类中。我希望这能回答这个问题。呵呵:vb4.0最初是在1995年8月发布的,但还可以。我们理解您的意思。+1表示存储过程。我经常看到开发人员出于错误的原因对他们不满。我同意Dan的评估,这可能应该包含在事务中。非常感谢大家推荐存储过程。我可以看到软件发展成这样