C# SqlDataAdapter 批量修改数据问题

时间:2021-08-13 07:34:56
代码:
string connstr = System.Configuration.ConfigurationSettings.AppSettings["ConnStr"].ToString();
            sqlconn = new SqlConnection(connstr);
            SqlDataAdapter sd = new SqlDataAdapter("select top(1) * from " + tablename, sqlconn);

            //SqlCommandBuilder scb = new SqlCommandBuilder(sd);
            string sql ="update " + tablename + " set FEndTime = @FEndTime,FEndState = @FEndState,FCanReason = @FCanReason,FRC2Ver=@FRC2Ver,FPorcessflag = @FPorcessflag where FOrderNo =@FOrderNo";
            SqlCommand sqlcmd = new SqlCommand(sql,sqlconn);
           
            
            sqlcmd.Parameters.Add("@FCanReason", SqlDbType.NVarChar, 200, "FCanReason");
            sqlcmd.Parameters.Add("@FEndTime", SqlDbType.NVarChar, 20, "FEndTime");
            sqlcmd.Parameters.Add("@FRC2Ver", SqlDbType.NVarChar, 50, "FRC2Ver");
            sqlcmd.Parameters.Add("@FPorcessflag", SqlDbType.Int, 4, "FPorcessflag");
            sqlcmd.Parameters.Add("@FEndState", SqlDbType.Int, 4, "FEndState");
            sqlcmd.Parameters.Add("@FOrderNo", SqlDbType.NVarChar, 50, "FOrderNo");

            sqlcmd.UpdatedRowSource = UpdateRowSource.OutputParameters;


            sd.UpdateCommand = sqlcmd;

            sd.UpdateBatchSize = 100;
          
            try
            {
              int f=  sd.Update(UpdateDataTable); //执行到该行跳出

              int t = f;     // 执行不到这一行
            }
            catch (InvalidOperationException e)
            {
            }

11 个解决方案

#1


你Catch(Exception ex),看是什么错误

#2


楼主  为什么我的不能实例化Excel.Application对象 ?

#3


引用 2 楼 wenjie11533 的回复:
楼主 为什么我的不能实例化Excel.Application对象 ?



 错了!  郁闷   不好意思

#4


 string sql = "if exists (select FOrderNo from " + tablename + " where FOrderNo =@FOrderNo) update " + tablename + " set FCanReason = @FCanReason,FEndTime = @FEndTime,FRC2Ver=@FRC2Ver,FPorcessflag = @FPorcessflag, FEndState = @FEndState where FOrderNo =@FOrderNo";
            SqlCommand sqlcmd = new SqlCommand(sql,sqlconn);

修改了SQL语句,错误提示有新行,需要insertcommand
上述语句能否实现datatable中的数据在数据表中存在就修改,不存在不修改。

#5


Catch(Exception ex)看message

#6


错误提示: datatable中有新的datarow, 需要Insertcommand命令。。

#7


错误为:当传递具有新行的 DataRow 集合时,更新要求有效的 InsertCommand
因为只需要更新操作,不需要插入,所以 sql:
string sql = "if exists (select FOrderNo from " + tablename + " where FOrderNo =@FOrderNo) update " + tablename + " set FCanReason = @FCanReason,FEndTime = @FEndTime,FRC2Ver=@FRC2Ver,FPorcessflag = @FPorcessflag, FEndState = @FEndState where FOrderNo =@FOrderNo";
  SqlCommand sqlcmd = new SqlCommand(sql,sqlconn);

试图避免修改时发现新的数据,但是这样的方法还是报错,请高手指教!!

#8


你只提供了UpdateCommand,并没有提供InsertCommand,
除非你用SqlCommandBuilder scb = new SqlCommandBuilder(sd)才能根据SelectCommand推导出Insert与Update

#9


可是有Insertcommand 后,datatable有新行后,他会自动插入啊,我datatable中是手动构造的,只保存了需要修改的字段。,如果自动构建insertcommand后,会因为某些字段为空而报错。
我现在只需要修改数据,datatable中和数据库中都有的修改,datatable中有,数据表中没有的,不用修改。

在线等,分不够,加

#10


  DataTable dt = new DataTable();
          DataTable dtUpdateOnly =  dt.GetChanges(DataRowState.Modified);
sd.Update(dtUpdateOnly );

#11


datatable存储的数据不是有原数据修改得到的,而是修改后的数据添加进去的。只包括修改的字段和主键。
现在把这些修改该的数据批量写到数据库中,数据库有的修改,没有的不修改。 
楼上(ufo20020427)的方法不行。

#1


你Catch(Exception ex),看是什么错误

#2


楼主  为什么我的不能实例化Excel.Application对象 ?

#3


引用 2 楼 wenjie11533 的回复:
楼主 为什么我的不能实例化Excel.Application对象 ?



 错了!  郁闷   不好意思

#4


 string sql = "if exists (select FOrderNo from " + tablename + " where FOrderNo =@FOrderNo) update " + tablename + " set FCanReason = @FCanReason,FEndTime = @FEndTime,FRC2Ver=@FRC2Ver,FPorcessflag = @FPorcessflag, FEndState = @FEndState where FOrderNo =@FOrderNo";
            SqlCommand sqlcmd = new SqlCommand(sql,sqlconn);

修改了SQL语句,错误提示有新行,需要insertcommand
上述语句能否实现datatable中的数据在数据表中存在就修改,不存在不修改。

#5


Catch(Exception ex)看message

#6


错误提示: datatable中有新的datarow, 需要Insertcommand命令。。

#7


错误为:当传递具有新行的 DataRow 集合时,更新要求有效的 InsertCommand
因为只需要更新操作,不需要插入,所以 sql:
string sql = "if exists (select FOrderNo from " + tablename + " where FOrderNo =@FOrderNo) update " + tablename + " set FCanReason = @FCanReason,FEndTime = @FEndTime,FRC2Ver=@FRC2Ver,FPorcessflag = @FPorcessflag, FEndState = @FEndState where FOrderNo =@FOrderNo";
  SqlCommand sqlcmd = new SqlCommand(sql,sqlconn);

试图避免修改时发现新的数据,但是这样的方法还是报错,请高手指教!!

#8


你只提供了UpdateCommand,并没有提供InsertCommand,
除非你用SqlCommandBuilder scb = new SqlCommandBuilder(sd)才能根据SelectCommand推导出Insert与Update

#9


可是有Insertcommand 后,datatable有新行后,他会自动插入啊,我datatable中是手动构造的,只保存了需要修改的字段。,如果自动构建insertcommand后,会因为某些字段为空而报错。
我现在只需要修改数据,datatable中和数据库中都有的修改,datatable中有,数据表中没有的,不用修改。

在线等,分不够,加

#10


  DataTable dt = new DataTable();
          DataTable dtUpdateOnly =  dt.GetChanges(DataRowState.Modified);
sd.Update(dtUpdateOnly );

#11


datatable存储的数据不是有原数据修改得到的,而是修改后的数据添加进去的。只包括修改的字段和主键。
现在把这些修改该的数据批量写到数据库中,数据库有的修改,没有的不修改。 
楼上(ufo20020427)的方法不行。