日期:2014-05-18  浏览次数:20486 次

取出存取过程插入记录后返回的ID 遇到的奇怪问题
这是存储过程:(直接在存储过程中置信没有问题)

ALTER   PROCEDURE   dbo.orderProc  
@orderUser   nvarchar(20)
AS
INSERT   INTO   myOrder   (orderUser)   VALUES   (@orderUser)
Select   @@IDENTITY   as   orderId
RETURN


事件代码c#:

protected   void   BtnCartOk_Click(object   sender,   EventArgs   e)
        {
                IDbConnection   conn   =   null;
                string   orderUser   =   "hh ";
                //string   orderUser   =   Session[ "userName "];
                try
                {
                        ConnectionStringSettings   connSet   =   ConfigurationManager.ConnectionStrings[ "MYConnectionString "];
                        conn   =   new   SqlConnection(connSet.ConnectionString);
                        conn.Open();
                        string   sql   =   string.Format( "exec   orderProc   {0} ",   orderUser);
                        SqlCommand   com   =   new   SqlCommand(sql,   (SqlConnection)conn);
                        com.ExecuteNonQuery();

                        int   x   =   Convert.ToInt32(com.ExecuteScalar());//这行取出存取过程返回的记录ID,   怎么有了这行之后,就每次都会插入两条数据.而注释掉后就正常插入了?

                      Response.Write(x);
                      conn.Close();
                        Context.Server.Transfer(Request.CurrentExecutionFilePath);

                }

------解决方案--------------------
1。
怎么有了这行之后,就每次都会插入两条数据.而注释掉后就正常插入了?

=======

因为实际上,你调用了两次同一个存储过程!!!

com.ExecuteNonQuery();

int x = Convert.ToInt32(com.ExecuteScalar());

各执行了一次

注释调 com.ExecuteNonQuery(); 即可

2。
事实上,对于此情形,最佳方式使用 输出参数 来返回 @@IDENTITY