数据库的操作总是很烦锁,于是JAVA里面出来Hibernate,使我们从烦锁的数据库操作中解放出来了,于是有人提出了要将NHibernate用到NET中来,我试了一下,感觉并不是很好,特别是配置文件不好写,其实面对一般的数据库操作,我们只要用数据集(type DataSet)就可以搞定了,通过ObjectDataSource还可以轻松地与GridView对接起来,实示显示,删除,修改的功能.
我们使用的数据库是MSSQL2000,为了实验效果更加明显,我们新建一个数据库test,然后再分别建两个表table1,table2,SQL脚本如下:
create table Table1 (
id int not null,
username nvarchar(30) not null,
password nvarchar(30) not null,
email nvarchar(30) null,
address nvarchar(30) null,
constraint PK_TABLE1 primary key (id)
)
go
/*==============================================================*/
/* Table: Table2 */
/*==============================================================*/
create table Table2 (
id int identity,
username nvarchar(30) not null,
password nvarchar(30) not null,
email nvarchar(30) null,
address nvarchar(30) null,
constraint PK_TABLE2 primary key (id)
)
Go
//Table2会在文章2中使用到.
表建完之后,我们随便加入一些数据,以便测试用.
打开VS2005,新建一个网站,命名为DataSetTest,右击网站项目,添加新项,选择”数据集”,命名为”DataSet1.xsd”,确定之后它会出现一个向导,我们先建一个新的数据库连接,指向数据库Test, 如图:
之后按着它的提示一步步来,命令类型选择使用SQL命令,然后下一步,窗口”输入SQL命令”输入命令:
SELECT Table1.*
FROM Table1
再点击左下角的高级选项,勾选每一项,第二,第三项不要选(这些选项后面的示例会讲到),然后再下一步,使用默认的选项不变.它会自动生成添加,删除,修改的方法,完成之后,我们按下F6, 让其生成一个所需的类.OK!
新建一个页面table1.aspx,从工具栏里面拖动一个GridView和一个ObjectDataSource到页面上,点击ObjectDataSource上的三角小标志,点配置数据源,选择业务对象,点击下拉框,选中唯一的一个类
一直点击下一步,全部使用默认的方法,直至完成.然后将GridView的数据源指定为ObjectDataSource1,按F5,我们就可以看到GridView将table里的数据全读出来了.
之后再在GridView上面添加删除,编辑列,按F5运行后,我们会发现点编辑更新后会出错,这到底是什么原因呢?报错提示如下:
ObjectDataSource“ObjectDataSource 1” 未能找到带参数的非泛型方法“Update”: username, password, email, address, original_id。
也就是说我们的方法跟它所传我的参数并不相配,好的,我们看一下ObjectDataSource的代码
<UpdateParameters>
<asp:Parameter Name="id" Type="Int32" />
<asp:Parameter Name="username" Type="String" />
<asp:Parameter Name="password" Type="String" />
<asp:Parameter Name="email" Type="String" />
<asp:Parameter Name="address" Type="String" />
<asp:Parameter Name="Original_id" Type="Int32" />
</UpdateParameters>
ObjectDataSource的代码,id也是在更新之列的,一般情况下我们的ID是不需要更新(99%),那我们该怎么办呢,我们用XML编辑器打开DataSet1.xsd,找到更新语句
<CommandText>UPDATE [Table1] SET [id] = @id, [username] = @username, [password] = @password, [email] = @email, [address] = @address WHERE (([id] = @Original_id))</CommandText>
将[id] = @id,删掉并删掉对应的@id语句
<Parameter AllowDbNull="False" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@id" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="id" SourceColumnNullMapping="False" SourceVersion="Current">
</Parameter>
我们重新生成一下(F6),然后点击ObjectDataSouce中的刷新框架,让它重新产生一些代码.
之后按F5,我们可以发现再编辑已经没问题了
解决方法2,顺着我们的思路,我们可以让ID可以更新(那个更新的语句不做修改,跟原来的一样)
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="id"
DataSourceID="ObjectDataSource1">
<Columns>
<asp:BoundField DataField="id" HeaderText="id" ReadOnly="True" SortExpression="id" />
将GridView代码里的
ReadOnly="True"去掉,这样的话同样可以达到更新,删除的目的,这就对应了我们现实中的主键是自动生成与手动指定两种情况, 在文章2里面将有示例说明一下有并发控制的DataSet如何跟GridView一起连动.夜深了,先休息了,呵呵.