Open DataReader出现问题,必须先关闭

时间:2019-05-24 07:25:55

标签: c# winforms sqldatareader sqlconnection sqlcommand

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

  

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

我有两个SqlDataReaders,并确保在加载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);
    }

1 个答案:

答案 0 :(得分:1)

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