dataset 更新到数据库出错的问题

wweric 2004-08-31 05:45:28
我把一个自己构造的dataset(其中有一张与数据库中一张表一样的表格),使用sqldataadapter的方法update到数据库,当我在update之前调用dataset.AcceptChanges()时,程序运行时不会报错,但更新后数据库中根本没有数据(就是没反应);若在update之前不调用dataset.AcceptChanges(),则报错: 并发冲突:UpdateCommand影响0行记录。 请各位大侠指点一下,那里出问题了.我用dataset的writexml方法看过,dataset中有数据的。我的代码如下;

String connString= "Server=192.168.0.10;Database=GoogleTest;User ID=sa; Password=;Connect TimeOut =30;";
SqlConnection sqlConn = new SqlConnection(connString);
sqlConn.Open();
SqlCommand sqlCmd = new SqlCommand();
sqlCmd.Connection = sqlConn;

String strSql="select * from tablename";
sqlCmd.CommandText=strSql;

SqlDataAdapter sqlAdapter = new SqlDataAdapter(sqlCmd);
SqlCommandBuilder sqlCmdBuilder=new SqlCommandBuilder(sqlAdapter); sqlAdapter.DeleteCommand=sqlCmdBuilder.GetDeleteCommand();
sqlAdapter.InsertCommand=sqlCmdBuilder.GetInsertCommand();
sqlAdapter.UpdateCommand=sqlCmdBuilder.GetUpdateCommand();

//dataset.AcceptChanges();
sqlAdapter.Update(dataset,"Query");

sqlConn.Close();
...全文
153 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wweric 2004-08-31
  • 打赏
  • 举报
回复
我用了上面几位的方法,但仍旧报错
wweric 2004-08-31
  • 打赏
  • 举报
回复
string customErrorMessage;
customErrorMessage = "Concurrency violation\n";
customErrorMessage += ex.Row[0].ToString();

用这个运行出来,报错: Concurrency violation dvd

这是什么意思
Eddie005 2004-08-31
  • 打赏
  • 举报
回复
引起冲突的原因和可能是数据的冲突,例如有重复的主键等等
为了避免数据冲突,应该有sqlAdapter.FillSchema(dataset,...);
把表结构也读进来之后相应的一些冲突就会在改DataSet里的数据的时候就表露出来,
Firestone2003 2004-08-31
  • 打赏
  • 举报
回复
解决并发冲突

1.执行用于在 Try...Catch 块中更新数据库的命令。
2.如果引发异常,则检查 Catch 语句的 Row 属性,以确定导致冲突的原因。
3.根据您的应用程序业务规则添加代码来解决错误。

try
{
SqlDataAdapter1.Update(myDataset);
}
catch (DBConcurrencyException ex)
{
string customErrorMessage;
customErrorMessage = "Concurrency violation\n";
customErrorMessage += ex.Row[0].ToString();
// Replace the above code with appropriate business logic
// to resolve the concurrency violation.
}
Firestone2003 2004-08-31
  • 打赏
  • 举报
回复
//dataset.AcceptChanges();
sqlAdapter.Update(dataset,"Query"); 这个顺序改一下
这样写
sqlAdapter.Update(dataset,"Query");
dataset.AcceptChanges();

sqlAdapter.DeleteCommand=sqlCmdBuilder.GetDeleteCommand();
sqlAdapter.InsertCommand=sqlCmdBuilder.GetInsertCommand();
sqlAdapter.UpdateCommand=sqlCmdBuilder.GetUpdateCommand();
这三行并不需要的
vesky 2004-08-31
  • 打赏
  • 举报
回复
gz
自己写的C#常用类库,使用时请先添加引用:UsrCustomFun.dll、DevComponents.DotNetBar2.dll,压缩包内的其他文件请与UsrCustomFun.dll放置同一目录,然后在程序中引用命名空间:using UsrCustomFun;包括: 1.自定义MessageBox,消息内容与错误代码分开,使用了6个重载方式。调用方法例子: UserMessageBox.UsrShow("执行SQL查询出错!", "数据库错误", ec.Message.ToString()); 2.等待提示窗口,使用了3个重载方法。 打开:UserWaitBox.UsrShow("等待信息"); 关闭:UserWaitBox.UsrClose(); 3.打印DataGridView,使用了9个重载方式,可自定义标题与打印样式: DataGridViewPrint.PrintDgv(dataGridView); 4.DataTable导出为Excel,3个重载方式: DataTableToExcel.DtToExcel(DataTable); 5.DataTable生成Pdf文件,6个重载方式: UsrExport.ExPdf(dataTable); 6.XML文件操作,可根据XML文件节点、路径来读取、修改、写入XML: UserXml.ReadXml(string XML的路径); UserXml.ReadXmlElement(string XML的路径,节点名称); UserXml.WriteXmlElement(XML路径,节点名称,内容); 7.数据库操作,目前有Access、SqlServer、Oracel (7.1)先配置数据库连接字符串: UsrCustomFun.SqlConn.SqlParameters下根据数据库类型返回一个数据库连接字符串。 (7.2)再执行数据库操作: (7.2.1)UsrCustomFun.SqlConn.SqlConnAccess下为Access的数据库操作,可根据SQL返回int型、string型、DataTable、DataReader、DataSet及无返回操作。 (7.2.2)UsrCustomFun.SqlConn.SqlConnOracle,操作类型同7.2.1 (7.2.3)UsrCustomFun.SqlConn.SqlConnSqlServer,操作类型同7.2.1
快速查询控件2.0 -----------------------打造中国快捷,明了,直观,易查,易用的查询控件 一。创作初衷: 在创作此控件时,作者曾用万能查询控件开发之各类ERP及通讯用软件,但客户普遍反应此控件难查,难学,难用。绝大多数客户反应他们仅仅只要一个简单的查询就行了,不要求太多的功能。但要快捷,明了,直观,易查,易用。为了满足客户的需求,遂起综合以前所写的各类查询方法,集合而成为本控件--快速查询控件。 二。控件优势: 1:快速查询控件2.0发布了。此快速查询控件,综合各查询控件的优势,取其精华弃其糟粕。 2.本控件生成的查询界面快捷,明了,直观,易查,易用。 3.本快速查询控件,在运行时不与数据库发生交付查询访问,即与数据一点联系都没有,消除了与数据库的访问负荷。用户可用sql profiler查看证实。而因不与数据库发生关系,故也与数据库连接接驱动程序无关。 4.本控件由于与数据库无关,则可应用于三层结构客户端的查询用。 5.可保存前一次查询条件以及在需要时进行多条件查询,使用方便,功能强大。 三。安装方法: 1.双击d6或d7文件夹下的ZQComponent打开组件包,在组件包面板上点compile,再点Install则安装完毕。安装完毕后会在delphi的组件面板里看到ZQSoft面板,第一个组件即fastSearch. 2.设置组件库目录。点delphi菜单tools-->Environment options-->library页-->点library path -->点右边...按钮则弹出directories窗口--->点...按钮选择安装组件包的路径--->确定-->Add-->Ok-OK则正确设置了组件路径。如果组件路径设置错误则运时会提示找不到dcu文件的错误。 四。使用方法。 具体见我的demo。简述如下: 1.拖曳FastSearch控件到你的Form上。设置DatabaseType属性即你所用的数据库类型,默认为SQL Server。 2.可设置DataSet属性或不设置DataSet属性 2.1设置DataSet属性,此方法简单常用,此DataSet即你用来访问数据库的数据集组件。设完DataSet后,则本控件会自动把DataSet里的fields里所有的字段域拿过来到DataFields里去,省去重新输入字段域的麻烦,用户也可在里面自行修改或删除字段域。如果用户DataSet里没设固定的列对象则控件在运行时会自动用默认域。如demo1. 2.2不设置DataSet属性。则直接设置DataFields里添加各项内容。在没有设置DataSet时,注意设置DataFields里的各项的AutoCheckType设为false。AutoCheckType为True时,控件在运行时会自动到DataSet里检查DataFields里各项的数据类型。如demo2. 3.运用FastSearch的Search方法执行查询。返回成功后从QueryCondition取得查询所得到的SQL 条件语句。也可用QuerySql方法,此方法会自动分析sql语句然后把查询后的条件插入到正确的位置,则当QuerySql返回结果不为空时,即是结果SQL语句,此方法对长SQL语句很简单。 4.是不是很简单,哈哈,FastSearch查询设计就这么简单的哦。 联系方式: Email:qzxit@126.com QQ:1282329592 五、历史版本: 1.2.02 解决了在oracle8i下日期数据查询出错的BUG。 2. 2.01 解决了在多条件下不选择任何条时出错提示信息压于查询框下面看不到的BUG. 3. 2.0 加入DataFields编辑器,解决多表关联的同名字段查询问题,并可完全脱离DataSet进行查询,使查询控件更独立。 4. v1.21 修改非模试窗口在顶部时压于底层看不见。并对使界面更友好。 5. v1.2 加入多条件查询,并修正了1.0的一些bug 六、注意 1.目录中demo1与demo2为在delphi7下编译通过的例子。 2.D2005中的控件仍为2.0版本的,因我没有delphi2005,有朋友须要时可联系我。D6与D7为2.02版本的控件。
这是一个比较复杂的数据库 包含图书管理 借书还书 学生管理 老师管理 和数据连接的相关应用 代码有详细的解释 压缩包里面也有 数据库的文件 代码里设置的数据库 用户是 sa 密码是 123456 请使用的时候做相关的修改 下面给出 一部分的代码 请继续关注本资源的发布 会后面有很多实用的代码上传 using System.Windows.Forms; namespace LibraryMis { public class DatabaseAccess { /* 声明成员变量,这样这个类中的所有方法就可是使用这些变量了 */ private SqlConnection myConnection; private SqlCommand myCommand; private SqlDataAdapter myDataAdapter; private DataSet mySet = new DataSet(); /* 写该类的构造方法,该方法名要跟类名相同,无返回值 * 当new这个类时就会执行这个构造方法 */ public DatabaseAccess() { /* 获得保存连接字符串的文件名及路径 */ //获得应用程序路径 string exePath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase; //根据路径和文件名构建FileInfo对象 string fileName = exePath + "connectionString.txt"; //建立FileInfo对象 FileInfo f = new FileInfo(fileName); //判断该文件是否存在 if (f.Exists)//文件存在 { //获得文件内容即存在文件中的连接字符串 //打开文件,获得读文件的数据流对象 StreamReader sr = f.OpenText(); //读文件到变量中 string connectionString = sr.ReadToEnd(); //关闭流 sr.Close(); //由读出的连接字符串创建Connection对象 myConnection = new SqlConnection(connectionString); //由Connection对象创建Command对象 myCommand = myConnection.CreateCommand(); //创建DataAdapter对象 myDataAdapter = new SqlDataAdapter(); myDataAdapter.SelectCommand = myCommand; //创建CommandBuilder对象 SqlCommandBuilder cb = new SqlCommandBuilder(myDataAdapter); //尝试是否能够打开连接 try { myConnection.Open(); } catch (Exception ex) //打开连接出错,可能是连接字符串有问题,这里调用数据库访问设置窗体来重新设置服务器名和数据库名 { MessageBox.Show("连接不到数据库LibraryMis,请在“数据库访问设置窗体中对数据库访问进行正确的设置”" + ",取消登录后重新启动图书馆管理系统!","警告",MessageBoxButtons.OK,MessageBoxIcon.Warning ); //创建 数据库访问设置窗体,并显示 FormSetDatabase fmsd = new FormSetDatabase(); fmsd.ShowDialog(); } finally { try { myConnection.Close(); } catch (Exception ex) { } } return; } else //文件不存在 { //设置默认的连接字符串 string connectionString = "server=.;database=LibraryMis;uid=sa;pwd=123456"; //把这个字符串写入文件 StreamWriter sw = new StreamWriter(fileName); sw.Write(connectionString); sw.Close(); MessageBox.Show("文件" + fileName + "不存在,已创建该文件,请重新启动图书馆管理系统","警告",MessageBoxButtons.OK, MessageBoxIcon.Information); return; } } /*创建查询的方法,返回数据集对象DataSet,参数SelectString表示查询的Sql语句,TableName表示要查询的表名*/ public DataSet FillDataSet(string SelectString, string TableName) { myDataAdapter.SelectCommand.CommandText = SelectString;//设置查询的Sql语句 myDataAdapter.Fill(mySet,TableName); return mySet; } /*执行插入,更新,修改的操作,参数CommandString表示Sql语句*/ public void ExeCommand(string CommandString) { myCommand.CommandText = CommandString; myConnection.Open(); try { myCommand.ExecuteNonQuery(); } catch (Exception ex) { MessageBox.Show(ex.ToString(),"警告",MessageBoxButtons.OK,MessageBoxIcon.Warning); } finally { myConnection.Close(); } } /*执行存储过程的方法,参数为Command对象*/ public void ExeStoreProcedure(SqlCommand command) { command.Connection = myConnection; myCommand = command; myConnection.Open(); try { myCommand.ExecuteNonQuery(); } catch (Exception ex) { MessageBox.Show(ex.ToString(), "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); } finally { myConnection.Close(); } }

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧