access数据库中有表students,结构如下:
StudentNo ,字符,PK
StudentName,字符
Sex,是/否
Birthday,日期时间
Native,字符
Address,字符分别绑定了textBox1,textBox2,radioButton1,dateTimePicker1,textBox3,textBox4
此外与dataGrid1绑定,Form_Load事件中加上:
oleDbDataAdapter1.Fill(dataSet11);运行时如果表中没有数据则出现异常(DataBinding未能在适合所有绑定的列表中找到行),有数据则正常.在没有数据的时候,去掉radioButton和dateTimePicker的数据绑定也不会有异常,究竟是什么原因,如何处理?************** 异常文本 **************
System.Exception: DataBinding 未能在适合所有绑定的列表中找到行
at System.Windows.Forms.DataGrid.AddNewRow()
at System.Windows.Forms.DataGridAddNewRow.OnEdit()
at System.Windows.Forms.DataGrid.Edit(String instantText)
at System.Windows.Forms.DataGrid.Edit()
at System.Windows.Forms.DataGrid.OnEnter(EventArgs e)
at System.Windows.Forms.Control.NotifyEnter()
at System.Windows.Forms.ContainerControl.UpdateFocusedControl()
StudentNo ,字符,PK
StudentName,字符
Sex,是/否
Birthday,日期时间
Native,字符
Address,字符分别绑定了textBox1,textBox2,radioButton1,dateTimePicker1,textBox3,textBox4
此外与dataGrid1绑定,Form_Load事件中加上:
oleDbDataAdapter1.Fill(dataSet11);运行时如果表中没有数据则出现异常(DataBinding未能在适合所有绑定的列表中找到行),有数据则正常.在没有数据的时候,去掉radioButton和dateTimePicker的数据绑定也不会有异常,究竟是什么原因,如何处理?************** 异常文本 **************
System.Exception: DataBinding 未能在适合所有绑定的列表中找到行
at System.Windows.Forms.DataGrid.AddNewRow()
at System.Windows.Forms.DataGridAddNewRow.OnEdit()
at System.Windows.Forms.DataGrid.Edit(String instantText)
at System.Windows.Forms.DataGrid.Edit()
at System.Windows.Forms.DataGrid.OnEnter(EventArgs e)
at System.Windows.Forms.Control.NotifyEnter()
at System.Windows.Forms.ContainerControl.UpdateFocusedControl()
如果将dateTimePicker的绑定从Value改为Text则该异常消失,而出现radioButton的异常:
列"StudentNo"不允许空值..************** 异常文本 **************
System.Data.NoNullAllowedException: 列“StudentNo”不允许空值。
at System.Windows.Forms.DataGrid.AddNewRow()
at System.Windows.Forms.DataGridAddNewRow.OnEdit()
at System.Windows.Forms.DataGrid.Edit(String instantText)
at System.Windows.Forms.DataGrid.Edit()
at System.Windows.Forms.DataGrid.OnEnter(EventArgs e)
at System.Windows.Forms.Control.NotifyEnter()
at System.Windows.Forms.ContainerControl.UpdateFocusedControl()
try
{
//-----------数据库操作------------
}
cath(System.IndexOutOfRangeException ex)
{
Console.WriteLine(ex.Message);
}finally
{ //------------------关闭数据库连接-----------------//
}
在delphi或BCB的数据库开发中也没说对空的数据表不能显示,得自己判断吧.而且,绑定是在VS.NET 的IDE环境属性编辑器内指定的,如果还需要手工处理,那ADO.NET全部用手工代码实现算了,还用IDE干嘛呢?
偶的这个只是按帮助来书上的介绍做的最简单的例子,偶刚接触C#和.NET,不知道大家在实际开发数据库应用时是否使用这样的架构?
如果需要大量编码来补这个架构的漏洞,那倒不如直接用DataCommand来操作数据了.
但是radioButton只能绑定Checked属性啊,一绑定就异常说StudentNo不能为空,不绑定这个控件就不会异常,或者把绑定改为Text属性就没事,为什么呢?也就是说所有的绑件如果绑定Text属性就没事,可是原因是什么呢?
是不是要自己处理Binding的事件?
之前要加个方法对用户输入值进行判断,Update只能将正确格式数据更新到DataBase中
当然可以另设一个ID自动递增字段就主键,但我不相信上面的情况就没撤了.
而且我的目的是学习,不是要实现这个系统,希望有人能解释其中的原理,特别是绑定对不同属性的处理机制.
其实这个问题很容易再现,
按上面的表结构建一个access库,用向导生成OleDbDataAdapter,DataSet,绑定到textbox的Text属性,radiobutton的Checked属性和datatimepicker控件的Value属性,在Form_Load事件中加入Fill一行,运行即发生错误,这个异常不是在Form_Load中发生的,应该是在绑定的某个时刻.
异常出现在程序一启动的Form_Load运行之后,表中无数据,用户还没有机会输入数据呢.
(这个可以为你的Birthday列增加1个默认值,如果不增加1默认值,你新增加1条,dateTimePicker显示是今天的日期,如果你不去改变dateTimePicker,那直接保存进数据库的是System.DBNull)而出现radioButton的异常:
(这个可能也是新增没值的原因)列"StudentNo"不允许空值..(这个异常不应该是radioButton的问题),可能是你在endedit的时候
textBox1没有值。
应该是ADO.NET处理绑定时发生的错误.本以为用数据绑定应该是ADO.NET的标准用法,然后再编代码处理一些特别的需求,这也是RAD的意义,否则设计这个干嘛?如果大家做正式开发都不用这个,那只能算是失败的设计了.
非常感谢你的热心!!!
我再试试看.
只是不知道为什么刚启动的时候ADO.NET在后台就会新增记录呢?
把dataGrid1的绑定去除就没问题了,看来dataGrid控件在空表时会自动增加一条记录...
oleDbDataAdapter1.Fill(dataSet11);
居然程序都启动不了.
希望兄弟找到好的解决方法,很晚了,我要回家了,有时间再交流,88
不添代码怎么从数据库取数据呢?难道要先用一个Command对检查有没有数据,有就Fill没有就不Fill?受不了了.想知道怎么才能调试到ADO.NET框架内部啊?在Delphi中可以调试到VCL源码中,这样对框架的了解就很容易了.
SqlConnection sqlconDBEmptyCheck=new SqlConnection("server=.;uid=sa;pwd=sa");//打开数据库连接
DataSet dsDBCreate=new DataSet();
SqlDataAdapter sqlDADBCreate=new SqlDataAdapter("SELECT * FROM master..sysdatabases WHERE name ='ADDSYSTEMMANAGE'",sqlconDBEmptyCheck);
sqlDADBCreate.Fill(dsDBCreate,"dbCheck");
dgDisPlay.DataSource=dsDIS.Tables["tbDLLMANAGE"].DefaultView;帮定datagrid
放在某个事件里面datagrid将在每次触发时自动显示数据,
http://www.xtra-ucd.com/databinding.jpg
按这种理解,一个"标准"的ADO.NET应用程序应该是按ADO.NET的设计者的思路,用绑定对象管理器对各种绑定进行管理,从而简化GUI方面的编程.可为什么连这种基础的应用都出错呢,应该如何处理?总结一下偶的问题:access数据库中有表students,结构如下:
StudentNo ,字符,PK
StudentName,字符
Sex,是/否
Birthday,日期时间
Native,字符
Address,字符在VS 2003.NET IDE中建立一个windows Form应用,建立数据库连接,加一个OleDbDataAdapter,在向导中直接生成四个Command对象,再生成数据集dataSet11,在Form_Load事件中加上:
oleDbDataAdapter1.Fill(dataSet11);在窗体中加入一个dataGrid1并进行绑定,以及若干textBox绑定StudentNo,StudentName,Native,Address,加入dateTimePicker绑定Birthday,加入一个radioButton绑定Sex除了oleDbDataAdapter1.Fill(dataSet11);这句没有自己写代码.问题:
==========================
1.当Students表不为空时,不会有任何问题.2.当Students表为空时,有以下结果:2.1不绑定dataGrid时,也不会有任何问题2.2绑定dataGrid时,有以下结果2.2.1所有非dataGrid的绑定属性为Text时,也不会有任何问题2.2.2在以上情况下,如果dataTimePicker1绑定的是value属性,程序启动时会产生异常:
DataBinding未能在适合所有绑定的列表中找到行.
************** 异常文本 **************
System.Exception: DataBinding 未能在适合所有绑定的列表中找到行
at System.Windows.Forms.DataGrid.AddNewRow()
at System.Windows.Forms.DataGridAddNewRow.OnEdit()
at System.Windows.Forms.DataGrid.Edit(String instantText)
at System.Windows.Forms.DataGrid.Edit()
at System.Windows.Forms.DataGrid.OnEnter(EventArgs e)
at System.Windows.Forms.Control.NotifyEnter()
at System.Windows.Forms.ContainerControl.UpdateFocusedControl()
改为绑定Text后该异常消失2.2.3如果radioButton1绑定的是Checked属性,程序启动时会产生异常:列StudentNo不能为空,改为绑定Text属性则异常消失(不过绑定Text属性没有意义)我的理解:当Studetns表为空时,绑定dataGrid,dataGrid会自动加入一个新行,而这个新行的初始值都是NULL,造成与控件绑定时产生问题.想知道该怎么解决?在哪里处理?
以前学delphi时,拖放几个控件就能完成基本的数据库增删改,不用一行代码,怎么ADO.NET编程的模型这么复杂?本以为只要写这一句代码,
oleDbDataAdapter1.Fill(dataSet11);
真是打击啊.哪位高手帮助解释一下数据绑定的内部机制.在delphi中可以支持调试VCL源码,所以有什么问题可以自己来查,不知道.NET上开发想了解内部机制的时候怎么办?出了错也不知道所以然...