VS2005 AccessDataSource+DetailView关于自增字段的添加问题

最近在学习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声明式代码:

< asp:AccessDataSource  ID ="AccessDataSource1"  runat ="server"  ConflictDetection ="CompareAllValues"
            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的声明式代码:

         < asp:SqlDataSource  ID ="SqlDataSource2"  runat ="server"  ConflictDetection ="CompareAllValues"
            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代码:

             < InsertParameters >
                
< asp:Parameter  Name ="id"  Type ="Int32"   />
                
< asp:Parameter  Name ="name"  Type ="String"   />
            
</ InsertParameters >
SqlDataSource代码:
             < InsertParameters >
                
< asp:Parameter  Name ="name"  Type ="String"   />
            
</ InsertParameters >

这两句提供给insert语句参数,因为改后的insert语句只需要一个参数,所以把id去掉就好了

             < InsertParameters >
                
< asp:Parameter  Name ="name"  Type ="String"   />
            
</ InsertParameters >

 

这样问题就解决了...

小弟刚刚学习,如有不对的地方,请高手指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值