数据库事务方法插入、返回、执行

在这里插入图片描述

 /// <summary>
        /// 事务方法返回一个sqlscalar 注意查询字段必须唯一且只能为数字
        /// </summary>
        /// <param name="sqlstr">sql语句</param>
        /// <param name="transaction">数据库事务</param>
        /// <returns>返回obj可以强制转换为int</returns>
        public static object tranExecuteScalar(string sqlstr, SqlTransaction transaction)
        {
            SqlCommand cmd = transaction.Connection.CreateCommand();//通过transaction的连接Connection创建一个SqlCommand
            cmd.Transaction = transaction;//元数据分配事务 
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = sqlstr;
            object retval = cmd.ExecuteScalar();
            return retval;
        }

事务方法执行一条sql语句

在这里插入图片描述

/// <summary>
        /// 事务方法执行一条sql语句
        /// </summary>
        /// <param name="sqlstr">sql语句</param>
        /// <param name="transaction">事务</param>
        /// <returns></returns>
        public static int tranExecuteNonQuery(string sqlstr, SqlTransaction transaction)
        {
            SqlCommand cmd = transaction.Connection.CreateCommand();//通过transaction的连接Connection创建一个SqlCommand
            cmd.Transaction = transaction;//分配事务 
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = sqlstr;
            return cmd.ExecuteNonQuery();
        }

在这里插入图片描述
事务方法插入一条 返回int 插入的KeyId

/// <summary>
        /// 事务方法插入一条 返回int 插入的KeyId 
        /// </summary>
        /// <param name="o">object</param>
        /// <param name="transaction">事务</param>
        /// <returns></returns>
        public static int tranInsert(object o, SqlTransaction transaction)
        {
            SqlCommand cmd = transaction.Connection.CreateCommand();//通过transaction的连接Connection创建一个SqlCommand
            cmd.Transaction = transaction;//分配事务 
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "insert " + TableConvention.Resolve(o) + " ("
                .InjectFrom(new FieldsBy().IgnoreFields("keyid"), o) + ") values("
                .InjectFrom(new FieldsBy().IgnoreFields("keyid").SetFormat("@{0}"), o)
                + ") select @@identity";

            cmd.InjectFrom(new SetParamsValues().IgnoreFields("keyid"), o);
            return Convert.ToInt32(cmd.ExecuteScalar());
        }

###调用方法
在这里插入图片描述

 #endregion
    case "add"://开单
                    #region 数据库事务
                    SqlTransaction tran = SqlHelper.BeginTransaction(SqlEasy.connString);//取得一个事务
                    try
                    {
                        #region 先插入主表
                        int mainInsertedId = 0;//(主表公用)主表插入的ID
                        string edNumber = common.mjcommon.getedNumberJyd();
                        JydOrderModel mainModel = new JydOrderModel();
                        mainModel.InjectFrom(rpm.Entity);
                        mainModel.OrderID = edNumber;
                        //子表赋值给主表
                        mainModel.allyspmc = rpmA.Entity.yspmc;
                        mainModel.status = "0";//添加之后的默认,可在添加时写入
                        mainModel.FlowStatus = "0";
                        string[] arr = edNumber.Split('-');
                        // 子订单个数数组
                        mainModel.OrderInt = int.Parse(arr[3]);
                        mainModel.OrderYear = DateTime.Now.ToString("yyyy-MM-dd");
                        mainModel.jpm= Pinyin.GetCodstring(mainModel.comname).ToLower();//汉字转简拼并小写
                        mainModel.deptid = int.Parse(SysVisitor.Instance.cookiesUserDepId);



                        mainInsertedId = DbUtils.tranInsert(mainModel, tran);//往主表插入一条

                        #endregion


                        #region 再插入明细表
                        //JObject jo = JObject.Parse(detailJson);

                        JArray detailArr = JArray.Parse(detailJson);
                        for (int ii = 0; ii < detailArr.Count; ii++)//循环
                        {
                            var detailobj = JSONhelper.ConvertToObject<JydOrderDetailModel>(detailArr[ii]["d"].ToString());//根据模型把明细表转化为obj
                            JydOrderDetailModel detailModel = new JydOrderDetailModel();//初始化明细表模型
                            detailModel.InjectFrom(detailobj);//把obj插入模型
                            detailModel.orderid = mainModel.OrderID;//orderid关联
                            detailModel.omainid = mainInsertedId;
                            DbUtils.tranInsert(detailModel, tran);执行写入明细表
                        }

                        //生成二维码
                        string QRCodeUrl = QRCode.Generate(ConfigHelper.GetValue("website")+ "/JydModleOrder/QRCodeView.aspx?KeyID=" + mainInsertedId, @"JydModleOrder\img\gongch.png", DateTime.Now.ToString("yyyyMMdd"));
                        //每添加修改一条数据动态改变二维码
                        DbUtils.tranExecuteNonQuery("update JydOrder set order_img='" + QRCodeUrl + "' where KeyId=" + mainInsertedId, tran);


                        #endregion
                        tran.Commit();//提交事务
                        context.Response.Write(1);

                    }
                    catch (Exception e)
                    {
                        tran.Rollback();
                        WriteLogs.WriteLogsE("Logs", "Error >> GetQRCode", e.Message + " >>> " + e.StackTrace);
                        context.Response.Write(-1);
                    }
                    #endregion


                    //context.Response.Write(JydOrderBll.Instance.Add(rpm.Entity));
                    break;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在pymysql模块中,可以使用cursor对象的lastrowid属性来获取最后插入的行的id。例如: ``` import pymysql conn = pymysql.connect(host='localhost', user='root', password='123456', database='testdb') cursor = conn.cursor() sql = "INSERT INTO users (name, age) VALUES ('John', 25)" cursor.execute(sql) # 获取插入的id last_id = cursor.lastrowid print(last_id) conn.commit() cursor.close() conn.close() ``` 在上面的例子中,我们先执行了一条insert语句,然后通过cursor对象的lastrowid属性获取了插入的id。注意,获取插入id的前提是在执行insert语句之前开启了一个连接,并且在执行完insert语句后进行了commit操作。 ### 回答2: 在pymysql模块中,执行insert语句后,可以使用`lastrowid`属性来获取插入数据的id。 首先,我们需要建立数据库连接,并创建一个游标对象。然后,使用游标对象执行insert语句,例如: ```python # 导入pymysql模块 import pymysql # 建立数据库连接 conn = pymysql.connect(host='localhost', port=3306, user='root', password='password', db='test') # 创建游标对象 cursor = conn.cursor() # 执行insert语句 sql = "INSERT INTO table_name (column1, column2) VALUES ('value1', 'value2')" cursor.execute(sql) # 获取插入数据的id insert_id = cursor.lastrowid # 提交事务 conn.commit() # 关闭游标和数据库连接 cursor.close() conn.close() # 输出插入数据的id print("插入数据的id为:", insert_id) ``` 在执行`cursor.lastrowid`时,会返回最后插入数据的自增id。 需要注意的是,使用`cursor.lastrowid`方法只能在插入数据之后调用,如果在执行insert语句之前调用该方法,它将返回0。另外,使用`lastrowid`属性的前提是表中有自增id字段,且该字段的值为自增。如果表中没有自增id字段,则`lastrowid`方法返回0。 以上是通过pymysql模块执行insert后返回插入数据的id的方法。 ### 回答3: 在pymysql模块中,执行insert语句后获取插入数据的id可以通过两种方式实现。 第一种方式是使用"SELECT LAST_INSERT_ID()"语句查询最后插入的数据的id。具体步骤如下: 1. 执行insert语句,插入数据到数据库。 2. 使用cursor对象的execute()方法执行"SELECT LAST_INSERT_ID()"语句。 3. 使用cursor对象的fetchone()方法获取查询结果。 4. 最后插入数据的id就可以通过查询结果获得。 示例代码如下: ```python import pymysql # 连接数据库 conn = pymysql.connect(host='localhost', user='root', password='password', database='testdb') # 创建游标对象 cursor = conn.cursor() # 执行insert语句 cursor.execute("INSERT INTO table_name (column1, column2) VALUES (%s, %s)", ("value1", "value2")) # 查询最后插入数据的id cursor.execute("SELECT LAST_INSERT_ID()") result = cursor.fetchone() inserted_id = result[0] # 关闭游标和数据库连接 cursor.close() conn.close() # 输出插入数据的id print(inserted_id) ``` 第二种方式是使用pymysql的connection对象的insert_id属性获取最后插入的数据的id。具体步骤如下: 1. 执行insert语句,插入数据到数据库。 2. 使用connection对象的insert_id属性获取最后插入的数据的id。 示例代码如下: ```python import pymysql # 连接数据库 conn = pymysql.connect(host='localhost', user='root', password='password', database='testdb') # 创建游标对象 cursor = conn.cursor() # 执行insert语句 cursor.execute("INSERT INTO table_name (column1, column2) VALUES (%s, %s)", ("value1", "value2")) # 获取最后插入数据的id inserted_id = conn.insert_id() # 关闭游标和数据库连接 cursor.close() conn.close() # 输出插入数据的id print(inserted_id) ``` 无论使用哪种方式,都需要在执行insert语句之后立即获取插入数据的id,才能获得正确的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值