繁体   English   中英

获取 controller 中的标识值以进行 INSERT(执行插入命令并在 Sql 中返回插入的 Id)

[英]Get an identity value in a controller for INSERT (Execute Insert command and return inserted Id in Sql)

目前,我正在使用 MVC 创建项目。 现在我想在 INSERT 语句中插入一个身份 ID 值。

在我的 controller 中:

string payment = @"INSERT INTO Payment(Payment_Method,Currency_Type,Total_Amount) 
                         VALUES('{0}','{1}',{2})";
        int pay = DBUtl.ExecSQL(payment, "Cash", currency,total);
        if (pay == 1)
        {
            string pid = "SELECT TOP 1 Payment_id FROM Payment ORDER BY Payment_id DESC";
            int paymentid = DBUtl.ExecSQL(pid);
        if (cart.Count() != 0)
        {
            string order = @"INSERT INTO [Order](Order_Name,Order_Description,Order_Quantity,Payment_Id) 
                     VALUES('{0}','{1}',{2},{3})";

现在,我想要已经插入到作为第一条语句的payment表中的 payment_id 并检索 payment_id 并将其用于Order表的 INSERT 语句

我怎样才能做到这一点?

请帮忙

谢谢

实际上, DBUtil代码包括:

public static int ExecSQL(string sql, params object[] list)
{
    List<String> escParams = new List<String>();

    foreach (object o in list)
    {
        if (o == null)
            escParams.Add("");
        else
            escParams.Add(EscQuote(o.ToString()));
    }

    DB_SQL = String.Format(sql, escParams.ToArray());

    int rowsAffected = 0;

    using (SqlConnection dbConn = new SqlConnection(DB_CONNECTION))
    using (SqlCommand dbCmd = dbConn.CreateCommand())
    {
         try
         {
              dbConn.Open();
              dbCmd.CommandText = DB_SQL;
              rowsAffected = dbCmd.ExecuteNonQuery();
         }
         catch (System.Exception ex)
         {
              DB_Message = ex.Message;
              rowsAffected = -1;
         }
     }

     return rowsAffected;
}

如您所知, ExecuteNonQuery表示影响行的数字

因此,您可以执行以下操作:

适用于 SQL SERVER 2005 及更高版本

   using (SqlConnection con=new SqlConnection(@"Your connectionString"))
    {
        using(SqlCommand cmd=new SqlCommand("INSERT INTO Payment(Payment_Method,Currency_Type,Total_Amount) output INSERTED.Payment_id VALUES(@Payment_Method,@Currency_Type,@Total_Amount)",con))
        {
            cmd.Parameters.AddWithValue("@Payment_Method", "Cash");
            cmd.Parameters.AddWithValue("@Currency_Type", currency);
            cmd.Parameters.AddWithValue("@Total_Amount", total);
            con.Open();
        
            int payment_id =Convert.ToInt32(cmd.ExecuteScalar());
        
            if (con.State == System.Data.ConnectionState.Open) 
                con.Close();
        
            return payment_id ;
        }
}

此外,您可以将查询更改为:

"INSERT INTO Payment(Payment_Method,Currency_Type,Total_Amount) VALUES(@Payment_Method,@Currency_Type,@Total_Amount)"; SELECT SCOPE_IDENTITY()" 

现在,我尝试了这样的事情:

public IActionResult SaveDetail(List<Cart_Has_Services> cart,double total,string currency)
    {
        string payment = @"INSERT INTO Payment(Payment_Method,Currency_Type,Total_Amount) 
                         VALUES('{0}','{1}',{2});";
        int pay = DBUtl.ExecSQL(payment, "Cash", currency,total);
        if (pay == 1)
        {
            object pid = DBUtl.GetList("SELECT Payment_id FROM Payment");
            int paymentid = Convert.ToInt32(pid);

                if (cart.Count() != 0)
        {
            string order = @"INSERT INTO [Order](Order_Name,Order_Description,Order_Quantity,Payment_Id) 
                     VALUES('{0}','{1}',{2},{3})";
            foreach (var item in cart)
            {
                    int ord = DBUtl.ExecSQL(order, item.Cart_Service, item.Additional_Notes, item.Quantity,paymentid);

就目前而言,代码将通过将值插入支付表来运行。 之后,我想获得下一个插入的 payment_id,即订单表。

我尝试获取 payment_id 的方法不起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM