Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在2个不同的后台工作进程中写入同一数据库中的2个表_C#_Sql Server_Winforms - Fatal编程技术网

C# 在2个不同的后台工作进程中写入同一数据库中的2个表

C# 在2个不同的后台工作进程中写入同一数据库中的2个表,c#,sql-server,winforms,C#,Sql Server,Winforms,我有一个winforms应用程序,它将数据写入同一数据库中的两个不同表中。我的计时器每一秒都会计数。当第一台机器准备好提供数据时,我将获取数据并写入第一个表。当机器2也准备好时,我将获取它并将数据写入第二个表。我将这两个插入进程放在两个不同的后台工作进程中。但我一直收到一个错误:“ExecuteOnQuery需要一个打开的可用连接。该连接的当前状态为连接。”下面是我的代码 private void timer1_Tick(object sender, EventArgs e) {

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

 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,你介意给我一个示例代码,告诉我如何使用块处理连接吗?对于连接,您的意思是每次需要执行插入时,我都会创建一个新连接吗?