【发布时间】:2014-09-01 15:13:17
【问题描述】:
我需要知道已将哪个订单号写入数据库。为此,我使用 SQL 表达式 EXECUTESCOLAR。
我调试了程序并监控了数据库。当我执行第二个命令时,该记录被写入数据库一次,它第二次写入相同的记录。你能帮我弄清楚我需要改变什么,这样它就不会写 2 条记录并且我会取回我的订单号吗?
这是我的代码:
public static int CreateDocumentNumber(string userId, string todaysDate, decimal docprice, decimal docpaid, int packageId, int orderstatus)
{
int orderId = 0; //return value order Id
//create order
string connectionString = ConfigurationManager.ConnectionStrings["conString"].ConnectionString;
string insertSql = "INSERT INTO [dbo].[LD_Orders](TD_OrdUserID, TD_OrdDate, TD_OrdCost, TD_OrdPaid, TD_OrdPackage, TD_OrdStatus)" +
" VALUES (@UserId, @Date, @Cost, @Paid, @Package, @Status);SELECT SCOPE_IDENTITY()";
using (SqlConnection myConnection = new SqlConnection(connectionString))
{
myConnection.Open();
SqlCommand myCommand = new SqlCommand(insertSql, myConnection);
myCommand.Parameters.Add("@UserId", SqlDbType.VarChar).Value = userId;
myCommand.Parameters.Add("@Date", SqlDbType.Date).Value = todaysDate;
myCommand.Parameters.Add("@Cost", SqlDbType.Decimal).Value = docprice;
myCommand.Parameters.Add("@Paid", SqlDbType.Decimal).Value = docpaid;
myCommand.Parameters.Add("@Package", SqlDbType.Int).Value = packageId;
myCommand.Parameters.Add("@Status", SqlDbType.Int).Value = orderstatus;
myCommand.ExecuteNonQuery(); <---- FIRST RECORD WRITTEN
// time to collect the last order id
orderId = Convert.ToInt32(myCommand.ExecuteScalar()); <---- SECOND RECORD WRITTEN
myConnection.Close();
}
return orderId;
}
【问题讨论】:
-
每个
Execute*调用都会触发一个insert语句,所以这个函数不需要两个 -
谢谢 Zruty,所以我只删除了我的第一个 excecuteNonQuery,然后一切都会好起来的
-
那么请把下面的答案标记为正确
-
这可能是重复的,因为我觉得 Rene 的要求在这里存在。 stackoverflow.com/questions/14246744/…
-
您执行了两次
INSERT- 那么为什么插入两行会让您感到惊讶?!?!?!?!
标签: c# sql executescalar scope-identity