C # Говорит, что мне нужно объявить скалярную переменную в другом SqlCommand? - PullRequest
1 голос
/ 17 мая 2019

У меня есть эта функция, когда я выполняю кучу вещей.Я завершаю «Шаг 1», но когда он попадает в cmd.ExecuteNonQuery ();на шаге 2 выдает ошибку:

System.Data.SqlClient.SqlException was unhandled
Message=Must declare the scalar variable "@SessionID".

Ниже моя функция:

private void txtConsolidate_Click(object sender, EventArgs e) {
        string sql, sqlUpdateQuery, sqlInsertQuery;
        string SourceLoc, TargetLoc, VendorID, SupplierID;

        foreach (DataGridViewRow row in gridDashboard.Rows) {
            if (row.Cells["Consolidate"].Value.ToString() != "" && Convert.ToBoolean(row.Cells["Approve"].EditedFormattedValue) == true) {
                SourceLoc = row.Cells["LocationID"].Value.ToString();
                TargetLoc = row.Cells["Consolidate"].Value.ToString();
                VendorID = row.Cells["VendorID"].Value.ToString();
                SupplierID = row.Cells["SupplierID"].Value.ToString();

                MessageBox.Show(SourceLoc + ", " + TargetLoc + ", " + VendorID + ", " + SupplierID);

                /**** Step 1: All items from the source location are added to the Process table to create Transfer Orders ****/

                // Query to Identify all items that need to be on Transfer Orders
                sqlInsertQuery = "INSERT INTO Process (SessionID, Date, Type, BuyerID, SourceLoc, VendorID, SupplierID, Item, UOM, Qty, TargetLoc, processFlag, computerName, userName) " +
                                 "   SELECT " +
                                 "      @SessionID, " +
                                 "      @Date, " +
                                 "      'TO', " +
                                 "      @BuyerID, " +
                                 "      @SourceLoc, " +
                                 "      @VendorID, " +
                                 "      @SupplierID, " +
                                 "      item_id, " +
                                 "      unit_of_measure, " +
                                 "      recommended_qty_to_order, " +
                                 "      @TargetLoc, " +
                                 "      1, " +
                                 "      @computerName, " +
                                 "      @userName " +
                                 "   FROM Reqs " +
                                 "   WHERE location_id = @SourceLoc AND vendor_id = @VendorID";

                // Creates Connection, Sets Variables in Connection and executes the Insert Query
                using (SqlConnection conn = new SqlConnection(Global.connString)) {
                    conn.Open();

                    using (SqlCommand sqlInsert = new SqlCommand(sqlInsertQuery, conn)) {
                        sqlInsert.Parameters.Add("@SessionID", SqlDbType.VarChar, 60).Value = hdnSessionID.Text;
                        sqlInsert.Parameters.Add("@Date", SqlDbType.VarChar, 60).Value = DateTime.Now.ToString();
                        sqlInsert.Parameters.Add("@BuyerID", SqlDbType.VarChar, 60).Value = lblBuyerID.Text;
                        sqlInsert.Parameters.Add("@SourceLoc", SqlDbType.VarChar, 40).Value = SourceLoc.ToString();
                        sqlInsert.Parameters.Add("@VendorID", SqlDbType.VarChar, 60).Value = VendorID.ToString();
                        sqlInsert.Parameters.Add("@SupplierID", SqlDbType.VarChar, 60).Value = SupplierID.ToString();
                        sqlInsert.Parameters.Add("@TargetLoc", SqlDbType.VarChar, 40).Value = TargetLoc.ToString();
                        sqlInsert.Parameters.Add("@processFlag", SqlDbType.Int).Value = 1;
                        sqlInsert.Parameters.Add("@computerName", SqlDbType.VarChar, 60).Value = hdnMachineName.Text;
                        sqlInsert.Parameters.Add("@userName", SqlDbType.VarChar, 60).Value = hdnUserName.Text;

                        sqlInsert.CommandType = CommandType.Text;
                        sqlInsert.ExecuteNonQuery();
                    }
                } /**** End Step 1 ****/


                /**** Step 2: Changes the location columns for the source items to the target location ****/

                // Query to Identify all items that need to have the locations changed
                sqlUpdateQuery = "UPDATE Reqs SET " +
                                 "    location_id = @TargetLoc, " +
                                 "    requirement_location_id = @TargetLoc, " +
                                 "    ship_to_location_id = @TargetLoc " +
                                 "  WHERE " +
                                 "    location_id = @SourceLoc AND " +
                                 "    vendor_id = @VendorID AND " +
                                 "    inv_mast_uid NOT IN (" +
                                 "        SELECT inv_mast_uid FROM Reqs WHERE location_id = @TargetLoc AND vendor_id = @VendorID" +
                                 "    )";

                // Creates Connection, Sets Variables in Connection and executes Update Query
                using (SqlConnection conn3 = new SqlConnection(Global.connString)) {
                    conn3.Open();

                    using (SqlCommand cmd = new SqlCommand(sqlInsertQuery, conn3)) {
                        cmd.Parameters.Add("@SourceLoc", SqlDbType.VarChar, 40).Value = SourceLoc.ToString();
                        cmd.Parameters.Add("@VendorID", SqlDbType.VarChar, 60).Value = VendorID.ToString();                            
                        cmd.Parameters.Add("@TargetLoc", SqlDbType.VarChar, 40).Value = TargetLoc.ToString();

                        //cmd.Parameters.Add("@SessionID", SqlDbType.VarChar, 60).Value = hdnSessionID.Text;

                        cmd.CommandType = CommandType.Text;
                        cmd.ExecuteNonQuery();
                    }
                } /**** End Step 2  ****/

                /**** Step 3: Adds the source quantity to the target 'AddlQty' for items that exist in both locations ****/

                // Query to Identify all items that need to be on Transfer Order
                sql = "SELECT inv_mast_id, recommended_qty_to_order from Reqs WHERE location_id = @SourceLoc and vendor_id = @VendorID and inv_mast_uid IN(select inv_mast_uid from Reqs WHERE location_id = @TargetLoc AND vendor_id = @VendorID)";

                // Creates Connection, Sets Variables in Connection and tries to load table
                using (SqlConnection conn4 = new SqlConnection(Global.connString)) {
                    conn4.Open();

                    using (SqlCommand cmd = new SqlCommand(sql, conn4)) {
                        cmd.Parameters.Add("@TargetLoc", SqlDbType.VarChar, 40).Value = TargetLoc.ToString();

                        using (SqlDataReader sqlDataReader = cmd.ExecuteReader()) {
                            // Adds items to Process table to create Transfer Orders
                            if (sqlDataReader.HasRows) {
                                while (sqlDataReader.Read()) {
                                    sqlUpdateQuery = "UPDATE Reqs SET AddlQty = (AddlQty + @SrcQty) WHERE location_id = @TargetLoc AND vendor_id = @VendorID AND inv_mast_uid = @InvMastUID";

                                    using (SqlConnection conn2 = new SqlConnection(Global.connString)) {
                                        conn2.Open();
                                        using (SqlCommand sqlUpdate = new SqlCommand(sqlUpdateQuery, conn2)) {
                                            sqlUpdate.Parameters.Add("@TargetLoc", SqlDbType.VarChar, 40).Value = TargetLoc.ToString();
                                            sqlUpdate.Parameters.Add("@VendorID", SqlDbType.VarChar, 60).Value = VendorID.ToString();
                                            sqlUpdate.Parameters.Add("@InvMastUID", SqlDbType.VarChar, 40).Value = sqlDataReader["inv_mast_uid"].ToString();
                                            sqlUpdate.Parameters.Add("@SrcQty", SqlDbType.VarChar, 40).Value = sqlDataReader["recommended_qty_to_order"].ToString();

                                            sqlUpdate.CommandType = CommandType.Text;
                                            sqlUpdate.ExecuteNonQuery();
                                        }
                                    }
                                }
                            }
                        }
                    }
                }  /**** End Step 3 ****/
            }
        }

Похоже, что SqlCommand на шаге 2 сталкивается с тем, что на шаге 1. ЕслиЯ добавляю cmd.Parameters.Add для @SessionID к шагу 2, затем он сообщает, что @Date не объявлен.Я еще даже не добрался до шага 3: (

Я думал, что с помощью «использования» SqlConnection и SqlCommand очищаются, как только он попадает в закрывающую скобку. Я дал им разные имена, чтобыв безопасности.

Я просто не понимаю, что происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...