最近在学习GridView,昨天看QQ群里的朋友间 讨论了一个关于DetailView的问题,看到挺感兴趣,拿来也研究研究....
问题如下:
AccessDataSource+DetailView关于Access中自动编号字段的添加会出现null字段的异常.
问题出现:
1.新建一个test.mdb数据库放在网站目录下,数据库中建立一个表T_TEST,字段两个;一个id 自动编号,另一个 name 字符.
2.新添加一个webform(test.aspx),拖入一个DetailView和AccessDataSource(连接的是Access数据库),将AccessDataSource配置好,注意要启动 "自动生成添加删除更新的SQL语句" 的功能(在第二步 配置select语句的那个窗体右下角 选高级).
3.把DetailView的数据源配置为刚配置的AccessDataSource.
4.编辑DetailView的字段,添加一个CommendField(新建 插入 取消)
ok,保存,运行网页.试试添加的功能.
会出现null字段...之类的异常.
解决办法:
我想这应该是AccessDataSource设计上的一个小bug,(sqlDataSource则没有以上的问题).
把test.aspx切换到源代码视图(不是CodeBehind),看下test.aspx的页面代码.
注意这里把AccessDataSource的声明式代码与SqlDataSource声明式代码比较下,您就知道问题所在了.
AccessDataSource声明式代码:
DataFile ="~/TEST/test.mdb" DeleteCommand ="DELETE FROM [T_TEST] WHERE [id] = ? AND [name] = ?"
InsertCommand ="INSERT INTO [T_TEST] ([id], [name]) VALUES (?, ?)" OldValuesParameterFormatString ="original_{0}"
SelectCommand ="SELECT [id], [name] FROM [T_TEST]" UpdateCommand ="UPDATE [T_TEST] SET [name] = ? WHERE [id] = ? AND [name] = ?" >
< DeleteParameters >
< asp:Parameter Name ="original_id" Type ="Int32" />
< asp:Parameter Name ="original_name" Type ="String" />
</ DeleteParameters >
< UpdateParameters >
< asp:Parameter Name ="name" Type ="String" />
< asp:Parameter Name ="original_id" Type ="Int32" />
< asp:Parameter Name ="original_name" Type ="String" />
</ UpdateParameters >
< InsertParameters >
< asp:Parameter Name ="id" Type ="Int32" />
< asp:Parameter Name ="name" Type ="String" />
</ InsertParameters >
</ asp:AccessDataSource >
SqlDataSource的声明式代码:
ConnectionString ="Data Source=EVERETT_J2EESQLEXPRESS;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=mssqlfs"
DeleteCommand ="DELETE FROM [FSTest] WHERE [id] = @original_id AND [name] = @original_name"
InsertCommand ="INSERT INTO [FSTest] ([name]) VALUES (@name)" OldValuesParameterFormatString ="original_{0}"
ProviderName ="System.Data.SqlClient" SelectCommand ="SELECT [id], [name] FROM [FSTest]"
UpdateCommand ="UPDATE [FSTest] SET [name] = @name WHERE [id] = @original_id AND [name] = @original_name" >
< DeleteParameters >
< asp:Parameter Name ="original_id" Type ="Int32" />
< asp:Parameter Name ="original_name" Type ="String" />
</ DeleteParameters >
< UpdateParameters >
< asp:Parameter Name ="name" Type ="String" />
< asp:Parameter Name ="original_id" Type ="Int32" />
< asp:Parameter Name ="original_name" Type ="String" />
</ UpdateParameters >
< InsertParameters >
< asp:Parameter Name ="name" Type ="String" />
</ InsertParameters >
</ asp:SqlDataSource >
我想首先您会发现InsertCommend属性有些(性质上)不同.
SqlDataSource的InsertCommend如下:
InsertCommand="INSERT INTO [FSTest] ([name]) VALUES (@name)" OldValuesParameterFormatString="original_{0}"
而AccessDataSource的InsertCommend如下:
InsertCommand="INSERT INTO [T_TEST] ([id], [name]) VALUES (?, ?)" OldValuesParameterFormatString="original_{0}"
AccessDataSource的Insert语句把自动编号当作参数传递了,因此会出现异常.(运行test.aspx的话,点击插入,自动编号是不会让用户填写的,这样id就为null了).
因此我们把AccessDataSource的InsertCommend改成InsertCommand="INSERT INTO [T_TEST] ([name]) VALUES (?)" OldValuesParameterFormatString="original_{0}" 就可以了.(但是,继续)
再看,您还会发现
AccessDataSource代码:
< asp:Parameter Name ="id" Type ="Int32" />
< asp:Parameter Name ="name" Type ="String" />
</ InsertParameters >
< asp:Parameter Name ="name" Type ="String" />
</ InsertParameters >
这两句提供给insert语句参数,因为改后的insert语句只需要一个参数,所以把id去掉就好了
< asp:Parameter Name ="name" Type ="String" />
</ InsertParameters >
这样问题就解决了...
小弟刚刚学习,如有不对的地方,请高手指正!