【新人】更新的时候 当传递具有新行的 DataRow 集合时,Update 要求有效的 InsertComman

【新人求救】更新的时候 当传递具有新行的 DataRow 集合时,Update 要求有效的 InsertComman
代码在这里
从数据库里取出来数据到datatabl里修改再更新回数据库里,然后就提示当传递具有新行的 DataRow 集合时,Update 要求有效的 InsertComman 这是怎么回事
string strconn = "Data Source=(local);Initial Catalog=hem09;User ID=sa;Password=123456 ";
            string sql = "select * from admintable"; 
            DataSet ds = new DataSet();
             using (SqlConnection conn = new SqlConnection(strconn))
            {
                using (SqlCommand comm = new SqlCommand(sql, conn))
                {
                    conn.Open();

                    //临时表
                    DataTable dt = new DataTable();

                    SqlDataReader reader = comm.ExecuteReader();
                    for (int i = 0; i < reader.FieldCount; i++)
                    {
                        //获得列名
                        DataColumn dc = new DataColumn(reader.GetName(i));
                        //获得类型
                        dc.DataType = reader.GetFieldType(i);
                        dt.Columns.Add(dc);
                    }
                    //行
                    while (reader.Read())
                    {
                        DataRow dr = dt.NewRow();
                        for (int i = 0; i < reader.FieldCount; i++)
                        {

                            dr[i] = reader[i];
                            Console.WriteLine(dr[i]);
                        }
                        dt.Rows.Add(dr);
                    }
                 ds.Tables.Add(dt);
                }
            }
            Console.WriteLine("更新的名字");
            string name = Console.ReadLine();
            Console.WriteLine("更新的密码");
            string password = Console.ReadLine();
            Console.WriteLine("更新哪一行");
            string id = Console.ReadLine();
            int num = Convert.ToInt32(id);
            
            ds.Tables[0].Rows[num - 1]["lname"] = name;
            ds.Tables[0].Rows[num - 1]["lpassword"] = password;

             string sql1 = "update admintable set lname=@lname,lpassword=@lpassword where lid=@lid";
            
            if (ds.Tables[0] != null)
            {
                using (SqlConnection conn = new SqlConnection(strconn)) {
                    
                    SqlDataAdapter adapter = new SqlDataAdapter();
                     SqlCommand comm = new SqlCommand(sql1, conn);
                    SqlParameter p1 = new SqlParameter("@lid", SqlDbType.Int, 4, "lid");
                    comm.Parameters.Add(p1);
                    SqlParameter p2 = new SqlParameter("@lname", SqlDbType.NVarChar, 20, "lname");
                    comm.Parameters.Add(p2);
                    SqlParameter p3 = new SqlParameter("@lpassword", SqlDbType.NVarChar, 20, "lpassword");
                    comm.Parameters.Add(p3);
                    adapter.UpdateCommand = comm;
                    conn.Open();
                    adapter.Update(ds.Tables[0]);
                    Console.WriteLine("ok");
                }

            }
            Console.ReadKey();
【新人】更新的时候 当传递具有新行的 DataRow 集合时,Update 要求有效的 InsertComman一整天快被弄疯了
------解决思路----------------------
改成
SqlDataAdapter adapter = new SqlDataAdapter(sql,conn);
adapter.fill(ds,"table1");
然后再update,因为之前你个ds赋值,但是这个ds和dataadapter没什么关联,adapter认为这个ds之前是空的,后来新增了行,所以要执行insert语句。

------解决思路----------------------
以前回答别人更新DataGrideView时候写的代码,有部分是通过DataSet和Adapter更新的,供参考

public static DataSet getDataSet(string connStr, string sql, string name)
{
SqlConnection conn = null;
DataSet ds = null;
try
{
conn = new SqlConnection(connStr);
ds = new DataSet();
conn.Open();

SqlDataAdapter cmd = new SqlDataAdapter(sql, conn);
cmd.Fill(ds, name);
}
catch
{
}
finally
{
if (conn != null)
conn.Close();
}
return ds;
}

public void UpdateDB()
{
try {

DsCustomer = new DataSet();
DsCustomer = getDataSet(connstr, "select * from Customer", "Customer");
//DsCustomer = dbManage.getDataSet("select * from Customer", "Customer");//自定义的一个过程,返回DataSet

SqlConnection conn = new SqlConnection(connstr);
conn.Open();

SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Customer", conn);

SqlCommandBuilder commandBuilder = new SqlCommandBuilder(adapter);

adapter.UpdateCommand = commandBuilder.GetUpdateCommand();
adapter.InsertCommand = commandBuilder.GetInsertCommand();

adapter.Fill(DsCustomer);

BsCustomer = new BindingSource();
BsCustomer.DataSource = DsCustomer.Tables["Customer"];
System.Diagnostics.Debug.Print("DS1 Rows:" + DsCustomer.Tables[0].Rows.Count.ToString());
dataGridView1.DataSource = BsCustomer;//这里把dataGridView1的DataSource指向BindingSource

DataRowView drv = BsCustomer.AddNew() as DataRowView;//如果是添加新记录的话
drv.BeginEdit();//开始修改
drv["Name"] = "fish";//该行item属性为“fish”
drv["type"] = "2";//该行item属性为“fish”
drv.EndEdit();
//结束BindigSource编辑
BsCustomer.EndEdit();
//获取修改过的记录来只更新有改变的数据
//DsCustomer.GetChanges();
//System.Diagnostics.Debug.Print("DS1 Rows:" + DsCustomer.Tables[0].Rows.Count.ToString());
//System.Diagnostics.Debug.Print("Changed: " + DsCustomer.HasChanges().ToString());

adapter.Update(DsCustomer, "Customer");
//真正更新到数据库
//DsCustomer.AcceptChanges();
} catch (Exception) {

throw;
}
}

引用:
我想更新现有行