在命令所分配的连接处于挂起本地事务时,ExecuteNonQuery需要该命令具有事务。

4

我有以下代码,但不知道为什么会出现以下错误:"ExecuteNonQuery需要在命令所分配的连接处于等待本地事务状态时具有事务。 命令的Transaction属性尚未初始化"。我正在使用SQL事务。请问有人能帮助我吗?

protected void RunLeave(int posID, int tot, int rowid)
{


    using (SqlConnection con = new SqlConnection(Modfunctions.configstring))
    {
        con.Open();

        SqlDataReader dr = default(SqlDataReader);


        int i = 0;
        try
        {
            SqlCommand cmd = new SqlCommand("Select ID from Employee WITH(Nolock) WHERE PositionID=@a", con);
            cmd.Parameters.Add("@a", SqlDbType.Int).Value = posID;
            //cmd.Transaction = transaction;
            dr = cmd.ExecuteReader();

            if (dr.HasRows)
                using (SqlConnection cons = new SqlConnection(Modfunctions.configstring))

                {
                    cons.Open();
                    SqlTransaction transaction = cons.BeginTransaction(DateTime.Now.ToLongTimeString());
                    SqlCommand cm = new SqlCommand();
                    cm.Transaction = transaction;
                    cm.Connection = cons;

                    while (dr.Read())
                    {
                        cm.CommandText="INSERT INTO LeaveAssignmentEntry VALUES('" + rowid + "','" + ddl.SelectedItem.Text + "','" + dr[0].ToString() + "','" + tot + "','" + tot + "','0')";
                        cm.ExecuteNonQuery();
                        i++;
                    }
                    transaction.Commit();
                }


            ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "", "alert('" + i + " employee(s) run successfully')", true);
        }
        catch (Exception ex)
        {

            try
            {
                //transaction.Rollback();
                ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "", "alert('" + ex.Message.Replace("'", "") + "')", true);
            }
            catch (Exception ex1)
            {
            }
        }
    }

}
1个回答

6

就像你将事务设置给你的第一个命令一样:

cmd.Transaction = transaction;

也将此操作应用于您的第二个命令:
cm.Transaction = transaction;

基本上,当你在事务的上下文中时,所有数据库交互都需要使用相同的事务。


完成这个操作后,我收到以下错误提示:“无法执行事务操作,因为有待处理的请求正在进行中。” - michael marmah
@michaelmarmah:在你更新的问题代码中,你把cm对象的创建移到了循环外面。为什么?现在你正在尝试重复使用同一个对象,而不是创建新的对象。错误似乎暗示着在事务仍然打开的情况下无法重复使用它。尝试将它移回到之前的位置。 - David
我已经撤消了之前的操作,但是出现了同样的错误:“由于仍有正在处理该事务的挂起请求,因此无法执行事务操作。” - michael marmah
我已经找到了一种让它对我起作用的方法,但我不知道是否是最好的方法。请告诉我是否可以。我已经更新了上面的代码。 - michael marmah
如果出现错误,您应该回滚事务。Try catch 应该包装您的数据库执行,并在出现错误时回滚。 - qlayer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接