【问题标题】:Issue with Open DataReader which must be closed first必须先关闭的 Open DataReader 问题
【发布时间】:2019-05-24 07:25:55
【问题描述】:

我的代码中出现以下错误:

"已经有一个打开的 DataReader 与此命令关联 必须先关闭。”

我有两个 SqlDataReader,我确保在加载 DataViewGrid 后关闭了第一个。

下面是给我这个问题的函数。我标记了引发错误的行。我尝试了“try”和“using”的变体,我尝试重命名 diff SqlConnections、SqlDataReaders 和 SqlCommands。我在这里不知所措。

我不能在一个连接上同时打开一个打开的 SqlDataReader 和 SqlCommand 吗?

private void ApprovedTransferAction(int rowNum) {
            bool foundFlag = false;
            //int XferQty = (int)gridData.Rows[rowNum].Cells["FinalQty"].Value;
            string PorgID = "";

        using (SqlConnection conn = new SqlConnection(Global.connString)) {
            conn.Open();

            // Locate id in PorgReqs
            string sqlSelectQuery = "SELECT id FROM PorgReqs WHERE location_id = @NewLocationID AND vendor_id = @VendorID AND item_id = @Item";

            using (SqlCommand sqlSelect = new SqlCommand(sqlSelectQuery, conn)) {
                sqlSelect.Parameters.Add("@NewLocationID", SqlDbType.VarChar, 60).Value = gridData.Rows[rowNum].Cells["NewLocation"].Value;
                sqlSelect.Parameters.Add("@VendorID", SqlDbType.VarChar, 60).Value = gridData.Rows[rowNum].Cells["Vendor"].Value;
                sqlSelect.Parameters.Add("@Item", SqlDbType.VarChar, 60).Value = gridData.Rows[rowNum].Cells["Item"].Value;

                using (SqlDataReader sqlDataReader2 = sqlSelect.ExecuteReader()) {


                    // If Item is found at Target Location;  FinalQty of Source Added to AddlQty of Target
                    if (sqlDataReader2.HasRows) {

                        sqlDataReader2.Read();

                        PorgID = Convert.ToString(sqlDataReader2["id"]);
                        MessageBox.Show("Found ID: " + PorgID);

                        string sqlUpdateQuery = "UPDATE PorgReqs SET AddlQty += @XferQty WHERE id = @ID";
                        using (SqlCommand sqlUpdate = new SqlCommand(sqlUpdateQuery, conn)) {
                            sqlUpdate.Parameters.Add("@XferQty", SqlDbType.Int).Value = (int)gridData.Rows[rowNum].Cells["FinalQty"].Value;
                            sqlUpdate.Parameters.Add("@ID", SqlDbType.Int).Value = sqlDataReader2["id"];

                            sqlUpdate.CommandType = CommandType.Text;
                            sqlUpdate.ExecuteNonQuery();
                        } // End sqlUpdate Command
                    } else { // Item was not found at Target location

                        string sqlUpdateQuery = "UPDATE PorgReqs SET " +
                                 "    location_id = @TargetLoc, " +
                                 "    requirement_location_id = @TargetLoc, " +
                                 "    ship_to_location_id = @TargetLoc " +
                                 "  WHERE " +
                                 "    location_id = @SourceLoc AND " +
                                 "    vendor_id = @VendorID AND " +
                                 "    item_id = @Item";

                        using (SqlCommand sqlUpdate = new SqlCommand(sqlUpdateQuery, conn)) {
                            sqlUpdate.Parameters.Add("@TargetLoc", SqlDbType.Int).Value = gridData.Rows[rowNum].Cells["NewLocation"].Value;
                            sqlUpdate.Parameters.Add("@SourceLoc", SqlDbType.Int).Value = gridData.Rows[rowNum].Cells["Location"].Value;
                            sqlUpdate.Parameters.Add("@VendorID", SqlDbType.Int).Value = gridData.Rows[rowNum].Cells["Vendor"].Value;
                            sqlUpdate.Parameters.Add("@Item", SqlDbType.VarChar, 60).Value = gridData.Rows[rowNum].Cells["Item"].Value;

                            sqlUpdate.CommandType = CommandType.Text;
                            sqlUpdate.ExecuteNonQuery();  // ERROR HERE
                        } // End sqlUpdate Command
                    } // End Else
                    sqlDataReader2.Close();
                }
                /*} catch (Exception ex) {
                    Console.WriteLine(ex.Message);
                    MessageBox.Show("Try SQLReader: " + ex.Message);
                } */
            } // End sqlSelect Command
        } // End SQL Connection


        // See if id exists in grid
        MessageBox.Show("Checking Grid");

        foreach (DataGridViewRow row in gridData.Rows) {
            if (foundFlag == true)
                break;
            else if (row.Cells["id"].Value.ToString() == PorgID) {
                // Update grid
                row.Cells["AddlQty"].Value = Convert.ToInt32(gridData.Rows[rowNum].Cells["FinalQty"].Value) + Convert.ToInt32(row.Cells["AddlQty"].Value);
                row.Cells["FinalQty"].Value = Convert.ToInt32(row.Cells["RecQty"].Value) + Convert.ToInt32(row.Cells["AddlQty"].Value);



                foundFlag = true;
                MessageBox.Show("Found: " + foundFlag);
            } // End If
        } // End ForEach

        // Remove the Row from the Grid
        gridData.Rows.RemoveAt(rowNum);
    }

【问题讨论】:

    标签: c# winforms sqldatareader sqlconnection sqlcommand


    【解决方案1】:

    只需将MultipleActiveResultSets=true 添加到您的连接字符串即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      • 2013-03-19
      • 2013-09-10
      相关资源
      最近更新 更多