【新人】更新的时候 当传递具有新行的 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();
一整天快被弄疯了
------解决思路----------------------
改成
SqlDataAdapter adapter = new SqlDataAdapter(sql,conn);
adapter.fill(ds,"table1");
然后再update,因为之前你个ds赋值,但是这个ds和dataadapter没什么关联,adapter认为这个ds之前是空的,后来新增了行,所以要执行insert语句。
------解决思路----------------------
以前回答别人更新DataGrideView时候写的代码,有部分是通过DataSet和Adapter更新的,供参考
代码在这里
从数据库里取出来数据到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();
------解决思路----------------------
改成
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;
}
}