#c# #asp.net #sql #sql-server-2005 #gridview
#c# #asp.net #sql #sql-server-2005 #просмотр сетки
Вопрос:
Я обрабатываю элементы, выбранные пользователями из gridview, и выполняю операцию вставки электронной почты и базы данных.
Когда пользователь нажимает кнопку, приведенный ниже код извлекает информацию из gridview, создает новый порядок в таблице заказов и создает новые записи в таблице транзакций.
Как я могу получить последний вставленный идентификатор, если я использую этот метод вставки записи? Не могли бы вы порекомендовать другой подход к этой простой проблеме?
protected void btnOrder_Click(object sender, EventArgs e)
{
double Total = 0;
string MailFrom = "webadmin@domain.com";
string MailTo = "purchasing@domain.com";
string MailSubject = "Online Order";
string MailCC = "";
string MailBCC = "";
string MailReplyTo = "";
string MailBody = "";
TextBox ItmCostCode = (TextBox)form1.FindControl("txtCostCode");
foreach (GridViewRow gvr in GridView1.Rows)
{
CheckBox cb = (CheckBox)gvr.FindControl("ItemSelect");
Label ItmTotal = (Label)gvr.FindControl("ItmTotal");
Label ItmPrice = (Label)gvr.FindControl("ItmPrice");
Label ItmName = (Label)gvr.FindControl("lblName");
TextBox ItmQty = (TextBox)gvr.FindControl("ItmQty");
TextBox ItmID = (TextBox)gvr.FindControl("lblItemID");
//Add entry to Order Table
SqlDataSource2.InsertParameters.Add("OrderDate", DateTime.Now.ToString("MMMM dd, yyyy"));
SqlDataSource2.InsertParameters.Add("OrderTotal", "0");
SqlDataSource2.InsertParameters.Add("OrderAccount", "name");
SqlDataSource2.InsertParameters.Add("OrderCostCentre", ItmCostCode.Text);
SqlDataSource2.Insert();
//TODO: GET ORDERID HERE TO USE BELOW:
if (cb.Checked)
{
double Price = Convert.ToDouble(ItmPrice.Text);
double Qty = Convert.ToDouble(ItmQty.Text);
Total = Price * Qty;
OrderTotal = OrderTotal Total;
MailBody = MailBody "Item: " ItmName.Text " Quantity: " ItmQty.Text " Total: " ItmTotal.Text "nr";
//Add entry to Transaction Table
SqlDataSource3.InsertParameters.Add("ItemID", ItmID.Text);
SqlDataSource3.InsertParameters.Add("OrderID", );
SqlDataSource3.InsertParameters.Add("Price", ItmPrice.Text);
SqlDataSource3.Insert();
}
//TODO: Update Order table with OrderTotal
}
string strOrderTotal = OrderTotal.ToString();
MailBody = MailBody "Order Total: " strOrderTotal "nr";
MailBody = MailBody "Cost Code: " ItmCostCode.Text;
MailService.Service1 Mailer = new MailService.Service1();
Mailer.SendMail("Text", MailFrom, MailTo, MailCC, MailBCC, MailSubject, MailBody, MailReplyTo);
}
Ответ №1:
используйте идентификатор области в конце вашего запроса insert, и он вернет вставленный идентификатор, подобный…
INSERT INTO table (ColumnName) VALUES ();
GO
SELECT SCOPE_IDENTITY();
Редактировать: для вашей помощи вот несколько статей, которые могут помочь вам реализовать
http://msdn.microsoft.com/en-us/library/z72eefad.aspx
http://www.mikesdotnetting.com/Article/54/Getting-the-identity-of-the-most-recently-added-record
http://www.objectreference.net/post/SCOPE_IDENTITY ()-возвращает идентификатор из базы данных при вставке.aspx
Комментарии:
1. Это то, что я читал, но я не уверен, как напрямую создать свой собственный оператор insert : S
2. 1 за ссылки, хотя я хотел бы дать вам больше :^)
3. К вашему сведению, если вы перейдете по второй ссылке, его пример не будет работать с использованием
SCOPE_IDENTITY()
в запросе без использования хранимой процедуры и приведения ее кint
в коде. Это не возвращает целое число. Вы можете исправить это,SELECT CONVERT(int, SCOPE_IDENTITY())
вместо этого приведя результатыExecuteScalar
кint
.
Ответ №2:
Основываясь на том, что сказал @Muhammad Akhtar, вы могли бы вернуть идентификатор в конце вашей вставки, а затем передать скаляр обратно на вызывающий уровень / функцию вашей базы данных. Я часто использовал это как проверку, чтобы увидеть, прошла ли вставка нормально, возвращает -1 или что-то еще, что указывает на сбой. Затем вы можете использовать это как способ передачи пользователю сообщения о том, что это так.
Я бы также структурировал ваш код по-другому и создал объект Order с элементами OrderItems. Это создается из gridview и передается на ваш уровень доступа к данным (DAL). Затем DAL может выполнить вставки и вернуть объект Order и последующие элементы ORDER, также обновленные с идентификатором, если это необходимо.