Проблема с открытым DataReader, который должен быть закрыт первым - PullRequest
0 голосов
/ 24 мая 2019

Я получаю следующую ошибку в моем коде:

"Уже есть открытый 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 Ответ

1 голос
/ 24 мая 2019

Просто добавьте MultipleActiveResultSets=true в строку подключения.

...