C# Adapter.update(Datatable)的适当配置是什么?

C# Adapter.update(Datatable)的适当配置是什么?,c#,asp.net,sql-server,dataadapter,sqldataadapter,C#,Asp.net,Sql Server,Dataadapter,Sqldataadapter,我有一个存储过程,可以插入一些记录,然后更新它 CREATE PROCEDURE [dbo].[InsertSponsors] @Someparameters nvarchar(100), @Anotherparameter int, AS Begin DECLARE @ID int, @RowCount int insert into Clients (Name,Photo,PolicyID,BirthDay, Gender,Title,Nationalit

我有一个存储过程,可以插入一些记录,然后更新它

CREATE PROCEDURE [dbo].[InsertSponsors]
@Someparameters  nvarchar(100),
@Anotherparameter int,
AS
    
Begin

DECLARE @ID int,

 @RowCount int

    insert into Clients (Name,Photo,PolicyID,BirthDay,
    Gender,Title,Nationality,Relationship,ClassID,HRID,Active,
    StartingDate,EndingDate,AddingDate,CreationOwner,UniqueID,PassportNo)
    values (@Name,@Photo,@PolicyID,@Birthday,@Gendar,@Title,@Nationality,@RelationShip,
    @ClassID,@HRID,@Active,@StartingDate,@EndingDate,@AddingDate,@CreationOwner,@UniqueID,@PassportNo)

    SELECT @RowCount = @@ROWCOUNT;

    Select @ID=SCOPE_IDENTITY();
    update Clients set SponsorID=@ID where ID=@ID;

     
End
我从DataAdapter调用这个存储过程,如下所示

注意:我已经尝试了所有注释过的代码,但没有成功

internal static int UpdateInsertAdapter(string query,DataTable dt, SqlParameter[] sqlParameters, bool SP)
    {
        using (SqlCommand cmd = new SqlCommand())
        {
            cmd.Connection = openConnection();
            cmd.CommandText = query;
            if (SP)
            {
                cmd.CommandType = CommandType.StoredProcedure;
            }
            cmd.UpdatedRowSource = UpdateRowSource.None;
            foreach (SqlParameter parameter in sqlParameters)
            {
                cmd.Parameters.Add(parameter);
            }
            
            SqlDataAdapter adpt = new SqlDataAdapter();
            //adpt.AcceptChangesDuringFill = true;
            //adpt.AcceptChangesDuringUpdate = true;  
            //SqlCommandBuilder cmdb = new SqlCommandBuilder(adpt);
            //adpt.InsertCommand = cmdb.GetInsertCommand();
            adpt.InsertCommand = cmd;

            **//////Should i've select command to select the @RowCount**

            adpt.UpdateBatchSize = 10;

            int recordsInserted = adpt.Update(dt);
            return recordsInserted;
        }
注意:

这个数据表在我使用ExcelDataReader读取时被修改,然后我向该数据表添加了两个数据列

问题

如何批量插入Datatable并选择插入的行

在本文中,作者编写了一个存储过程来插入我可以插入然后更新吗

错误:

1.当传递带有修改行的DataRow集合时,更新需要有效的UpdateCommand

2.需要初始化DataAdapter.SelectCommand属性

更新

根据帮助,我找出了错误#1的原因,并通过用户使用SqlCommandBuilder找到了解决方案

            SqlCommandBuilder cmdb = new SqlCommandBuilder(adpt);
            adpt.InsertCommand = cmd;
            adpt.UpdateCommand = new SqlCommandBuilder(adpt).GetUpdateCommand();

但是当我使用这些行时,会发生错误#2。

如果您解释一下执行代码时实际发生的情况,我们可以更容易地缩小问题的范围。如果出现异常,则会出现一条错误消息,用于诊断目的。如果您想让我们诊断问题,逻辑要求您提供该信息。@jmcilhinney很抱歉,我没有把错误消息放进去。。我已经编辑了我的帖子。。。不管怎样,谢谢你的评论:)现在我们知道了错误消息,问题就变得显而易见了。在第一个示例中,这表示
数据表
包含
RowState
Modified
的行。如果您打算插入记录,那么您的行需要添加
行状态
。当您创建一行,然后将其添加到
数据表的
集合中时,
RowState`默认设置为
Added
。如果编辑现有行,
RowState
设置为
Modified
。关于第二条错误消息,在调用
Update
时,还是在调用
Fill
时,实际发生了该错误消息?除非您想通过调用
Fill
来检索数据,否则不需要使用
SelectCommand
。当您保存更改时,这是不相关的,您可以通过调用
Update
@jmcilhinney来执行此操作。谢谢您的回复。我已经理解了问题1,但我可以在修改后更改行状态吗。对于问题2,我不会在任何地方调用Fill()。我已经更改了存储过程,删除了更新和选择部分,并创建了一个触发器来执行此任务。我的SP现在只插入了第二个错误,它仍然存在