У меня есть эта функция, когда я выполняю кучу вещей.Я завершаю «Шаг 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 очищаются, как только он попадает в закрывающую скобку. Я дал им разные имена, чтобыв безопасности.
Я просто не понимаю, что происходит.