C# 在2个不同的后台工作进程中写入同一数据库中的2个表
我有一个winforms应用程序,它将数据写入同一数据库中的两个不同表中。我的计时器每一秒都会计数。当第一台机器准备好提供数据时,我将获取数据并写入第一个表。当机器2也准备好时,我将获取它并将数据写入第二个表。我将这两个插入进程放在两个不同的后台工作进程中。但我一直收到一个错误:“ExecuteOnQuery需要一个打开的可用连接。该连接的当前状态为连接。”下面是我的代码C# 在2个不同的后台工作进程中写入同一数据库中的2个表,c#,sql-server,winforms,C#,Sql Server,Winforms,我有一个winforms应用程序,它将数据写入同一数据库中的两个不同表中。我的计时器每一秒都会计数。当第一台机器准备好提供数据时,我将获取数据并写入第一个表。当机器2也准备好时,我将获取它并将数据写入第二个表。我将这两个插入进程放在两个不同的后台工作进程中。但我一直收到一个错误:“ExecuteOnQuery需要一个打开的可用连接。该连接的当前状态为连接。”下面是我的代码 private void timer1_Tick(object sender, EventArgs e) {
private void timer1_Tick(object sender, EventArgs e)
{
readMachinewidth();
}
private void readMachinewidth()
{
if(M1 == "true")
{
backgroundWorker1.RunWorkerAsync();
}
if(M2 == "true")
{
backgroundWorker2.RunWorkerAsync();
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
if (!oData.saveM1ProcessQty("M1", "M1"))
{
MessageBox.Show("M1 - Database Error");
return;
}
}
private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
if (oData.saveM2ProcessQty("M2", "M2"))
{
MessageBox.Show("M2 - Database Error");
return;
}
}
我可以知道怎么修理吗?如何使winforms在同一数据库中几乎同时在两个不同的表中写入数据。我想这是一个尚未解决的问题。但我想不出如何修复它。当写入表1数据时,连接打开,同时机器2的数据也可以准备写入
我的数据插入函数
public Boolean saveM1ProcessQty(string M1, string M1a)
{
try
{
string sSQL = "";
SqlCommand oCmd;
sSQL = "INSERT INTO xxx(M1, M1-1)VALUES('";
sSQL = sSQL + M1+ "','" + M1a+ "')";
oConn.ConnectionLocal.Open();
oCmd = new SqlCommand(sSQL, oConn.ConnectionLocal);
oCmd.ExecuteNonQuery();
oConn.ConnectionLocal.Close();
oCmd.Dispose();
return true;
}
catch(SqlException sqlex)
{
oConn.ConnectionLocal.Close();
Common.ErrorLog("M1 - " + sqlex.Message.ToString());
return false;
}
catch(Exception ex)
{
oConn.ConnectionLocal.Close();
Common.ErrorLog("M1 - " + ex.Message.ToString());
return false;
}
}
public Boolean saveM2ProcessQty(string M2, string M2a)
{
try
{
string sSQL = "";
SqlCommand oCmd;
sSQL = "INSERT INTO xxx(M1, M1-1)VALUES('";
sSQL = sSQL + M2+ "','" + M2a+ "')";
oConn.ConnectionLocal.Open();
oCmd = new SqlCommand(sSQL, oConn.ConnectionLocal);
oCmd.ExecuteNonQuery();
oConn.ConnectionLocal.Close();
oCmd.Dispose();
return true;
}
catch(SqlException sqlex)
{
oConn.ConnectionLocal.Close();
Common.ErrorLog("M2 - " + sqlex.Message.ToString());
return false;
}
catch(Exception ex)
{
oConn.ConnectionLocal.Close();
Common.ErrorLog("M2 - " + ex.Message.ToString());
return false;
}
}
我的连接类
public SqlConnection ConnectionLocal
{
get
{
if(_localConn == null)
{
string sconnstring =
ConfigurationManager.ConnectionStrings["local"].ToString();
_localConn = new SqlConnection(sconnstring);
}
return _localConn;
}
}
当您不调用
SqlConnection.Open()
时,会发生此错误。它与并发无关。如果看不到您的实际数据库访问代码,我将无法为您提供更多帮助。但在这条线路的某个地方,连接正在内存中创建,但没有连接
编辑:
在回复注释的过程中,下面是使用块的代码。我还冒昧地对查询进行了参数化,以避免SQL注入攻击
public Boolean saveM1ProcessQty(string M1, string M1a)
{
try
{
string sSQL = "INSERT INTO xxx (M1, M1-1) VALUES ('@m1, @m1a')";
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["local"].ToString()))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(sSQL, conn));
{
cmd.Parameters.AddWithValue("@m1", M1);
cmd.Parameters.AddWithValue("@m1a", M1a);
cmd.ExecuteNonQuery();
}
}
return true;
}
catch(Exception ex)
{
Common.ErrorLog("M1 - " + ex.Message.ToString());
return false;
}
}
在这种情况下,多台机器写入多个表是不相关的。您只是在我们的代码中有一个bug。如果你只运行一个应用程序,我预计同样的错误也会发生。嗨,Matthew,我已经添加了我的数据库访问代码。请帮助检查错误是什么。非常感谢。首先,您应该使用块通过
处理连接和命令。这将比手工操作更加可靠。第二,您只创建一个连接对象,使用它,处理它,然后再次尝试使用它,这有什么原因吗?为什么不在每次需要连接时创建一个新连接呢?嗨,Matthew,你介意给我一个示例代码,告诉我如何使用块处理连接吗?对于连接,您的意思是每次需要执行插入时,我都会创建一个新连接吗?