asp.net数据库访问学习心得

 asp.net数据库访问学习心得1(Oracle访问)

在asp.net中通过ADO.NET访问数据库很方便,介绍这方面代码的文章也数不胜数,在这里我只说一下自己的心得还有遇到的问题及解决办法。
            asp.net访问SQL Server数据库使用SqlClient,访问其他数据使用OleDb,访问Oracle还可以用OracleClient,但是要自己添加引用。
            OleDb是最通用的,可以访问多种数据源,包括SQL Server和Oracle,通用也就意味着针对性不强,功能也不强。因为实验室的下一个项目是要用Oracle的,老板让我们自己学一下然后挑几个人去,所以最近主要学习了对Oracle的访问。
            下面的代码是通过OracleClient访问Oracle数据库的片段:
string connStr = "data source = ora;user id=sa; password=sa";
string sql = "insert into test values('001','001')";
OracleConnection myConn = new OracleConnection(connStr);
OracleCommand myCommand = new OracleCommand(sql,myConn);
try
{
      myConn.Open();
      myCommand.ExecuteNonQuery();
      Response.Write("<script>alert('执行成功!');</script>");
}
catch(Exception ex)
{
      Response.Write("<script>alert('"+ex.Message+"');</script>");
}
finally
{
      myConn.Close();
}
            可见通过OracleClient访问Oracle数据库很灵活很方便。若想用OleDb完成对Oracle的访问,只需把上面代码中所有的"Oracle"改为"OleDb",并把连接字符串改为"Provider=oraOLEDB.oracle.1;user id=sa; password=sa"即可。

asp.net数据库访问学习心得2(DataGrid分页问题)

          ASP.NET提供了一个DataGrid控件可以比以前的ASP方便地创建创建数据列表,DataGrid控件除了内建的数据表现和方法之外,还允许用户自己定义表现形式。分页技术为用户可管理的数据查找提供方便。DataGrid内建的分页技术很容易实现,但数据量很大时,它的方便性是以牺牲性能为代价的。下面,我们就看看如何通过自定义的分页方法来实现快速处理大量数据的结果集的办法。我们这里讨论的方法比DataGrid的默认分页方法是快速和更加有效的,这是因为每次请求不需要把全部的数据结果发送到Web服务器。相反,它只需要发送每个页面需要的那些数据集。例如:如果一个用户只要求100个页面中每页显示25条记录的第4页的结果集,服务器只需要发送第75-100行的数据即可,而不是1-1000行的完全数据。

          DataGrid的内建分页方法是效率不高的,每次请求都必须把整个查询结果发送给Web服务器,Web服务器再把数据分成相应的页面。利用DataGrid的内建的分页方法尽管是很简单的,但是,由于Web应用的无序性特征,一个用户每次从一个页面转向另外一个页面时,DataGrid对象都被销毁并重新创建,这就意味着数据库服务器每次都必须发送全部的结果集。

          DataGrid的AllowPaging、AllowCustomPaging、PageStyle属性有助于避免我们编写自己的代码来跟踪记录浏览者目前在哪一个页面访问和都请求过哪些页面。我们应当设定AllowCustomPaging为True,否则,在你使用DataReader或者SQLDataReader绑定到DataGrid对象会遇到麻烦。在任何可能的情况下,应当尽量使用SQLDataReader而不要使用DataSet来装载DataGrid对象。据性能测试表明:在构建列表显示数据时,使用SQLDataReader比使用DataSet要快两倍以上。不要设定AllowPaging和PageStyle的值,这是因为,如果使用这两个属性,你必须在viewstate中维护DataGrid,但为了追求性能最佳化,我们必须设定DataGrid的EnableViewState属性为false,尽管这样我们自己必须编写一点代码来实现我们的分页,但是性能会有所提高的,因为在每次与Web服务器打交道时不必再在viewstate中存储内容了。

           一旦我们关闭了DataGrid自己在viewstate中保存的能力,我们就必须自己编写代码来实现用户从一页导航到另一页。DataGrid如果自己不在viewstate中进行保存,那么它也不再跟踪记录“前一页”和“下一页”是哪些页面了。我们自己添加导航按钮来帮助浏览者进行导航。最简单的办法是在页面上增加两个按钮:“上一个”和“下一页”。要进入到下一页,我们在“下一页”按钮上增加click事件,通过我们的自定义分页存储过程请求相应的记录。

          以上的文字参考了孟子e章的文章,下面谈一下自己的认识:

          分页存储过程(Oracle)传入几个参数,分别是要执行查询的sql语句,每页记录数,当前页码,同时把记录总数和对应页码的记录集通过出参数带出来。存储过程应该定义成如下形式:

create or replace package PackageWF
as
TYPE T_CURSOR IS REF CURSOR;
procedure PagerWF(
          PageSize number,            --每页记录数
          PageNo number,              --当前页码,从 1 开始
          SqlSelect varchar2,      --查询语句,含排序部分
          OutRecordCount out number,--返回总记录数
          myCursor out T_CURSOR);
end PackageWF;

        然后在页面程序中通过传参数获得对应页面的记录集,绑定到DataGrid,而且要自己维护上一页、下一页等链接。这样效率会高很多,也减少了网络传输,减轻了服务器压力。


接下来着重说一下遇到的一些问题。

1.使用OracleClient调用Oracle存储过程的参数名称问题。
            刚开始使用OleDb访问存储过程,很顺利,后来学习使用OracleClient访问存储过程的时候,发现几乎一样的代码,却总是无法正确执行。经过多方研究也没发现什么,后来在网上查了半天才发现:OracleClient调用存储过程时要求参数名和过程的参数名完全一致,真是晕倒,微软这个做得也太差了.....

2.使用OracleClient调用存储过程取得返回值的问题。
            我习惯让存储过程返回一个整数来说明执行的成功与否或者遇到什么问题。使用OleDb的时候,可以通过(int)myCommand.Parameters["ret"].Value取得返回值,但是换成OracleClient以后,这招就行不通了,总是提示错误。后来改成用Int32.Parse(myCommand.Parameters["ret"].Value.ToString())就可以了。

3.通过存储过程返回记录集的问题。
            使用OracleClient调用存储过程时,有个参数类型是OracleType.Cursor,通过它可以返回一个记录集。在存储过程中它是个Ref Cursor,返回给程序就读入一个OracleDataReader中备用。OleDb没有这个Cursor类型,也不知道怎么通过OleDb返回记录集。进一步,可以通过分页的存储过程实现手工分页,提高DataGrid等的性能。

4.关于异常的问题。
            OleDb可以抛出所有的数据库异常,比如表或视图不存在啊,不满足唯一性约束等异常,但是OracleClient好像不会抛出这些异常,只是网页左下方提示"网页上有错误",现在还不知道该怎么解决。。。。

5.关于返回DataReader的问题
            由于DataReader必须在连接打开的时候才可用,所以如果要通过一个函数返回DataReader,则对应的连接不能关闭。可以在打开DataReader时这样:DR = myCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection);参数System.Data.CommandBehavior.CloseConnection说明当DataReader关闭时对应的连接也关闭,那么只要接收到这个DataReader的代码负责关闭DataReader就可以了。

6.关于DataGrid绑定事件丢失的问题

        DataGrid的事件,如ItemCommand,EditCommand等事件很容易丢失,具体的表现是在InitializeComponent()函数中那些绑定函数的语句无缘无故地不见,需要手动添加,如果不添加,则不响应相应的事件,无法完成正常的逻辑。比较好的办法是把这些事件绑定的语句写到一个自己的函数里,再在InitializeComponent()中调用这个函数,就省去了一遍又一遍手动添加的烦恼。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值