写入同一个DB的2个表,在2个不同的后台工作进程

本文关键字:后台 进程 工作 2个 同一个 DB 2个表 | 更新日期: 2023-09-27 18:15:37

我有一个winforms应用程序,它将数据写入同一个DB中的2个不同的表。我的计时器每一秒都会计数。当第一台机器准备好提供数据时,我将获取数据并写入第一个表。当机器2也准备好时,我将获取它并将数据写入第二个表。我把这两个插入进程放在两个不同的后台工作进程中。但我一直得到一个错误"ExecuteNonQuery需要一个开放的和可用的连接。连接的当前状态是正在连接。"下面是我的代码。

 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;               
        }
    }

My Connection class

   public SqlConnection ConnectionLocal
    {
        get
        {
            if(_localConn == null)
            {                
                string sconnstring =  
                      ConfigurationManager.ConnectionStrings["local"].ToString();
                _localConn = new SqlConnection(sconnstring);
            }
            return _localConn;
        }
    }

写入同一个DB的2个表,在2个不同的后台工作进程

当您不调用SqlConnection.Open()时发生错误。它与并发无关。在没有看到实际的数据库访问代码之前,我无法提供更多的帮助。但是在某个地方,连接正在内存中创建,但尚未连接。

编辑:

关于注释,这里是适当的using块代码。我还采取了参数化查询的自由,以避免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;               
    }
}