C# 为什么我的SQL';插入';语句执行两次?

C# 为什么我的SQL';插入';语句执行两次?,c#,asp.net,sql,sql-server,C#,Asp.net,Sql,Sql Server,我有下面的Insert命令,我需要获取作用域标识,以便稍后在应用程序中进行订单跟踪 SqlCommand cmd1 = new SqlCommand("INSERT INTO [pharm_OrderID](UserID, RequestType, CreateDate) values (@UserID, @RequestType, @CreateDate); Select SCOPE_IDENTITY();", conn1); cmd1.CommandT

我有下面的Insert命令,我需要获取作用域标识,以便稍后在应用程序中进行订单跟踪

SqlCommand cmd1 = new SqlCommand("INSERT INTO [pharm_OrderID](UserID, RequestType, CreateDate) values (@UserID, @RequestType, @CreateDate); Select SCOPE_IDENTITY();", conn1);
                    cmd1.CommandType = CommandType.Text;
                    conn1.Open();

                    string strUserID = txtEmpID.Text;
                    cmd1.Parameters.Add("@UserID", SqlDbType.NVarChar, 50);
                    cmd1.Parameters["@UserID"].Value = strUserID;

                    string strRequestType = ddlReturnType.SelectedValue;
                    cmd1.Parameters.Add("@RequestType", SqlDbType.NVarChar, 50);
                    cmd1.Parameters["@RequestType"].Value = strRequestType;

                    string strCreateDate = lblOrderAttemptTime.Text;
                    cmd1.Parameters.Add("@CreateDate", SqlDbType.NVarChar, 50);
                    cmd1.Parameters["@CreateDate"].Value = strCreateDate;

                    cmd1.ExecuteNonQuery();

                    string numScope = Convert.ToString(cmd1.ExecuteScalar());
                    lblOrderNum.Text = numScope;
                    cmd1.Dispose();
                    conn1.Close();
                    conn1.Dispose();

但是为什么要插入两次呢?

您要执行两次

  • cmd1.ExecuteNonQuery()
  • Convert.ToString(cmd1.ExecuteScalar())
  • 您只需插入并选择
    ExecuteScalar

    decimal newID = (decimal) cmd1.ExecuteScalar();
    

    因为你已经执行了两次;一次作为ExecuteOnQuery()执行,一次作为ExecuteScalar()。

    因为要执行两次:

       cmd1.ExecuteNonQuery(); //once
    
       string numScope = Convert.ToString(cmd1.ExecuteScalar()); //twice
    

    摆脱
    cmd1.ExecuteNonQuery()ExecuteScalar()

    查询执行两次的原因是您同时调用了ExecuteNonQuery

    和命令对象上的ExecuteScalar。

    这是因为您要执行它两次

    首先:

    cmd1.ExecuteNonQuery();
    
    那么这里:

    string numScope = Convert.ToString(cmd1.ExecuteScalar());
    

    删除第一个。执行两次

    cmd1.ExecuteNonQuery(); // 1st
    
    string numScope = Convert.ToString(cmd1.ExecuteScalar()); // 2nd
    

    删除其中一个。

    提示:您可能需要查看
    使用
    语句来处理连接和命令实例。