【问题标题】:How to work with autoincrement keys and SqlDataAdapters to add new rows do database如何使用自动增量键和 SqlDataAdapter 添加新行做数据库
【发布时间】:2014-08-04 14:59:06
【问题描述】:

所以,我有这个我必须维护的内部数据访问框架,我要向它添加事务。我在放入一个包时遇到问题:事务、SqlDataAdapters、SqlCommandBuilders 和主键定义为自动增量的表。

这是我目前所拥有的

 public int PutEntity(DaoContext ctx, bool useTransaction=false)
        {
            int returnValue=ErrorCodes.ERR_SUCCESS;            
            {
                try
                {   
                    using (ctx.Connection = DBUtil.GetSqlConnection(ctx.AppCode, this.DBName))
                    {
                        SqlDataAdapter adapter = new SqlDataAdapter(BuildSelect(), ctx.Connection);
                        adapter.FillSchema(ctx.Data.Tables[MainTableName], SchemaType.Source);
                        adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;

                        SqlCommandBuilder sqlBuilder = new SqlCommandBuilder(adapter);

                        if (!useTransaction & ctx.Transaction == null) {
                            sqlBuilder.GetUpdateCommand();
                            ctx.Transaction = ctx.Connection.BeginTransaction();
                            IsTransactionOwner = true;
                        }

                        sqlBuilder.GetInsertCommand().Transaction = ctx.Transaction;
                        sqlBuilder.GetUpdateCommand().Transaction = ctx.Transaction;
                        sqlBuilder.GetDeleteCommand().Transaction = ctx.Transaction;

                        adapter.Update(ctx.Data, MainTableName);

                        ctx.ErrorCode = ErrorCodes.ERR_SUCCESS;

                        if (!useTransaction & IsTransactionOwner)
                        {
                            ctx.Transaction.Commit();                    
                        }
                        return ctx.ErrorCode; //-->                
                    }
                }
                catch (Exception ex)
                {
                    if (!useTransaction & IsTransactionOwner)
                    {
                        ctx.Transaction.Rollback();                    
                    }
                    ex = ErrorHandler.OnError("Error saving data. Record changed while in edit.", ex,
                            ErrorCodes.ErrorConsequence.None,
                            ErrorCodes.ERR_DBEXE_PUT_CONCURRENCY,
                            Thread.CurrentThread.ManagedThreadId,
                            "application : " + ctx.AppCode,
                            "on database: " + this.DBName,
                            ErrorCodes.ERR_DBEXE_PUT_CONCURRENCY_MSG,
                            "Frw.Common.BizEntity",
                            "PutEntity()"
                            );
                }
                //finally{
                //    if (!useTransaction & IsTransactionOwner)
                //    {
                //        ctx.Transaction.Dispose();
                //        ctx.Transaction=null;
                //    }
                //}    
            }            
        }

我的问题是,当我尝试插入数据时,它永远不会被插入,而当我检查数据集时,它们永远不会有新的自动增量键。我添加的新记录总是在 1

【问题讨论】:

    标签: c# mysql dataset sqldataadapter sqlcommandbuilder


    【解决方案1】:

    我找到了问题的解决方案。它涉及从 SqlCommandBuilder 中提取 SqlCommands 并更改它们,类似于

                    SqlDataAdapter daAutoNum = new SqlDataAdapter();
    
                    using (ctx.Connection = DBUtil.GetSqlConnection(ctx.AppCode, this.DBName))
                    {
                        SqlDataAdapter adapter = new SqlDataAdapter(BuildSelect(), ctx.Connection);
                        SqlCommandBuilder sqlBuilder = new SqlCommandBuilder(adapter);
                        adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
    
    
                        adapter.UpdateCommand = sqlBuilder.GetUpdateCommand();
                        adapter.InsertCommand = sqlBuilder.GetInsertCommand();
    
                        string scope_id = string.Format(" ; select {0} from {1} where {0} = SCOPE_IDENTITY();", PrimaryKeyName, MainTableName);
                        adapter.InsertCommand.CommandText += scope_id;
    
                        adapter.DeleteCommand = sqlBuilder.GetDeleteCommand();
    
                        SqlParameter identParam = new SqlParameter("@Identity", PrimaryKeyType, 0, PrimaryKeyName);
                        identParam.Direction = ParameterDirection.Output;
                        adapter.InsertCommand.Parameters.Add(identParam);
                        adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord;
    
                        daAutoNum.DeleteCommand = adapter.DeleteCommand;
                        daAutoNum.InsertCommand = adapter.InsertCommand;
                        daAutoNum.UpdateCommand = adapter.UpdateCommand;
    
                        daAutoNum.InsertCommand.Transaction = ctx.Transaction;
                        daAutoNum.DeleteCommand.Transaction = ctx.Transaction;
                        daAutoNum.UpdateCommand.Transaction = ctx.Transaction;
    
                        daAutoNum.Update(ctx.Data, MainTableName);
    
                    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-22
      • 2012-03-19
      • 2013-10-26
      • 2021-12-21
      • 2020-01-29
      • 2017-02-16
      • 2017-07-20
      • 1970-01-01
      相关资源
      最近更新 更多