现在的位置: 首页 > 综合 > 正文

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

2013年06月11日 ⁄ 综合 ⁄ 共 4141字 ⁄ 字号 评论关闭

最近在学习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>

 

这样问题就解决了...

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

抱歉!评论已关闭.