解决方案 »
- winform中printDocument如何分页打印问题,在线等!
- 一个很简单的属性继承问题(100分不够在加)
- 控件继承错误,不成功便成仁.高手点点错
- vs 2005做windows程序,Form上的控件为什么丢失
- 困惑问题:mdi窗体,父窗体控件如何调用子窗体内的控件的事件处理程序
- 关于label,或者有其他的方式实现的请进
- streamreader 中文显示问题
- web程序如何访问winfrom 程序
- C#的Web Form:有没有哪位知道怎么在DataGrid中插入图片,而且是根据不同的数据插入不同的图片
- 文本框中怎么换行,\n好像不起作用阿!
- System.NullReferenceException 中第一次偶然出现的“GetproductCode.exe”类型的异常求解,谢谢
- http 发送指令
否则数据库中没有相应记录,你往哪里UPDATE
我这是从批量修改datagridview 后返回来的Dataset 我怎么判断哪些数据是修改后的 哪些是新行 和删除的
是的 我现在不知道怎么判断哪些是新行 哪些是删除行
循环DataSet中某表的所有行,添加如下的判断
dr.RowState == DataRowState.Added; // 新增
dr.RowState == DataRowState.Modified; // 修改
是的 我现在不知道怎么判断哪些是新行 哪些是删除行
循环DataSet中某表的所有行,添加如下的判断
dr.RowState == DataRowState.Added; // 新增
dr.RowState == DataRowState.Modified; // 修改
正解.
你原来的代码就应该判断数据有修改才提交,而不是不管数据有没有修改都提交所有数据
如果数据有1万行,我只修改了1行,你提交10000次?那执行效率多慢.
if (con.State.Equals(ConnectionState.Closed))
{
con.Open();
}
SqlDataAdapter myAdapter = new SqlDataAdapter("SELECT * FROM " + table, con);
//直接使用上面的myAdapter重载方法赋值SELECT命令,所以注释下面两行
//SqlCommand myCommand = new SqlCommand("SELECT * FROM " + table, con);
//myAdapter.SelectCommand = myCommand; SqlTransaction myTrans = con.BeginTransaction();//添加一个事务
//因为没有新建myCommand,而使用myAdapter.SelectCommand,所以注释并替换下面一行
//myCommand.Transaction = myTrans;
myAdapter.SelectCommand.Transaction = myTrans;
SqlCommandBuilder SCB = new SqlCommandBuilder(myAdapter);
//添加下面两行来指定UpdateCommand和InsertCommand命令
myAdapter.UpdateCommand = SCB.GetUpdateCommand();
myAdapter.InsertCommand = SCB.GetInsertCommand();
myAdapter.Fill(ds, table); try
{
myAdapter.Update(ds, table);
ds.AcceptChanges();
myTrans.Commit(); //事务正常提交
return true;
}
catch (SqlException ex)
{
try
{
myTrans.Rollback(); //事务回滚
throw new Exception("SQL数据库连接失败,操作数据库产生错误: " + ex.Message);
}
catch (SqlException ey) //回滚失败
{
if (myTrans.Connection != null)
{
throw new Exception("数据回滚事务遇到一个异常类型 : " + ey.GetType());
}
}
return false;
}
finally
{
con.Close();
}
{
if (MessageBox.Show("确认保存吗 ", "提示", MessageBoxButtons.OKCancel) == DialogResult.OK)
{
try
{
dt_table = mis.ExecSqlReturnDataTable("select * from qx_mk").Tables[0]; //查询修改前数据库中的表 ds_users.Tables[0].PrimaryKey = new DataColumn[] { ds_users.Tables[0].Columns["id"] };//这里主键的列名
ds_users.Tables[0].Merge(dt_table);
ds_users.Tables[0].TableName = "qx_mk";
if (mis.UpdateSqlReturn(ds_users, "qx_mk"))
{
MessageBox.Show("保存成功! ");
}
else
{
MessageBox.Show("保存出错! ");
} }
catch (System.Exception ex)
{
MessageBox.Show(ex.ToString());
return;
} }
}
你的ds_users这个数据是什么?你需要批量获取很多数据,然后批量插入吗?不然是不是用table.Rows.Add(row);这样就可以添加到dt_table里面了,不用单独在通过ds_users.Tables[0]这样的方法来合并两个DataTable。
还有你下面的代码和你第一次问题时候的代码完全不一样的吗?我阅读起来有点跳跃。
我把查询修改前的数据表 和合并的那两行注销了。仍然提示所说的问题。
这个程序我是想通过批量插入修改 DatagridView 然后批量更新数据库中的表,这个问题困扰了我几天了。
System.Data.SqlClient.SqlCommand insertCommand =new System.Data.SqlClient.SqlCommand("insert into .....");
myAdapter.InsertCommand = insertCommand;
这样当表中有新增加的数据行时就自动执行这条语句了。
if (con.State.Equals(ConnectionState.Closed))
{
con.Open();
}
SqlDataAdapter myAdapter = new SqlDataAdapter("SELECT * FROM " + table, con);
SqlTransaction myTrans = con.BeginTransaction();//添加一个事务
myAdapter.SelectCommand.Transaction = myTrans;
SqlCommandBuilder SCB = new SqlCommandBuilder(myAdapter); foreach (DataRow dr in ds.Tables[0].Rows)
{
if (dr.RowState == DataRowState.Added)
{
System.Data.SqlClient.SqlCommand insertCommand = new System.Data.SqlClient.SqlCommand();
insertCommand.CommandText = "insert into qx_mk(id,mkmc,zmkmc,gnmc,winmc,dwomc,wintype) values('" +dr["id"]
+ "','" + dr["mkmc"] + "','" + dr["zmkmc"] + "','" + dr["gnmc"] + "','" + dr["winmc"] + "','" + dr["dwomc"] + "'," + dr["wintype"] + ")";
myAdapter.InsertCommand = insertCommand;
}
}
myAdapter.UpdateCommand = SCB.GetUpdateCommand();
myAdapter.DeleteCommand = SCB.GetDeleteCommand();
myAdapter.Fill(ds,table);
try
{
MessageBox.Show(myAdapter.InsertCommand.CommandText.ToString());
//da.Update(ds, table);
//ds.AcceptChanges();
myTrans.Commit(); //事务正常提交
return true;
}
catch (SqlException ex)
{
try
{
myTrans.Rollback(); //事务回滚
throw new Exception("SQL数据库连接失败,操作数据库产生错误: " + ex.Message);
}
catch (SqlException ey) //回滚失败
{
if (myTrans.Connection != null)
{
throw new Exception("数据回滚事务遇到一个异常类型 : " + ey.GetType());
}
}
return false;
}
finally
{
con.Close();
}