基于ASP.NET的数据库访问技术

基于ASP.NET的数据库访问技术,第1张

用户进行数据查询时通常有这样的情况,一个数据库查询将返回太多的行,一致不能在一页中显示。如果用户正在使用一个慢的链接,发送特别大的数据结果可能要花很长的时间。一旦获得了数据,用户可能发现它不包含正确的内容,或者查询范围太大,没有容易的办法检查完所有的结果来找到重要的信息。因此,对查询结果分页显示将为用户可管理的数据查询提供极大的方便。分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一,现在网站基本上都提供了分页显示信息的功能,但大部分还是基于ASP的,而.NET平台框架是针对各种各样的Web应用设计的,因此本文讨论了一种在ASP.NET框架下实现查询记录自定义分页显示的技术。

ASP.NET

.NET是通过平台独立的数据描述方法(通过XML)和通用的访问媒介Internet来简化用户访问和存储信息的过程。

ASP.NET是Microsoft.Net框架的核心元素,是一项基于服务器的强大技术,利用它,可以为WWW站点或企业内部网创建动态可以交互的HTML页面。ASP.NET 完全基于模块和组件,具有很好的可扩展性和可定制性。它主要包括WebForm和WebService两种编程模式。前者为用户提供功能强大、外观丰富的基于表单(Form)的可编程Web页面;后者通过对HTTP、XML、SOAP、WSDL等Internet标准的支持提供在异构网络环境下获取远程服务、链接远程设备、交互远程应用的编程界面。

通过ADO.NET链接、 *** 纵数据源

在Microsoft公司推出开放式数据库互连(ODBC)应用程序编程接口(API)以来,出现了各种各样的数据库访问技术,而直到ADO.NET出现,API才能实时地给出处理效果。ADO.NET是ASP.NET应用程序用来与数据库进行通信的技术,使你可以同关系数据库和其他数据源进行交互。断开的访问是ADO.NET最重要的特性,是对ADO最大的改变。ADO.NET创建一个到数据库的链接,用从数据库中提取的信息副本填充数据集。如果改变了数据集(DataSet)中的信息,数据库里相应表格中的信息不会改变。需要时,可以把DataSet连回最初的数据源并应用所有的改变。

SQL Server .NET Data Provider 连接字符串包含一个由一些属性名/值对组成的集合。每一个属性/值对都由分号隔开。

PropertyName1=Value1PropertyName2=Value2PropertyName3=Value3.....

同样,连接字符串必须包含SQL Server实例名称:

Data Source=ServerName

使用本地的SQL Server(localhost),如果想要使用远程服务器运行,应该在示例对象中把正确的服务器赋给Data Source 属性。此外,还必须指定所支持的两种身份验证方法(即Windows身份验证和SQL Server身份验证)中的其中一种。Windows身份验证使用Windows登录用户身份连接数据库,而SQL身份验证要求显式地指定SQL Server用户ID和密码。要想使用Windows身份验证,必须在连接字符串中包括 Integrated Security 属性:

Data Source=ServerNameIntegrated Security=True

默认情况下,Integrated Security 属性为 False ,这意味着将禁用Windows身份验证。如果没有显式地把这个属性的值设置为True,连接将使用SQL Server身份验证,因此,必须提供SQL Server用户ID和密码。Integrated Security属性还能识别的其他值只有SSPI(Security Support Provider Interface,安全性支持提供者接口).在所有的Windows NT *** 作系统上,其中包括Windows NT 4.0、2000、XP,都支持值SSPI。它是使用Windows身份验证时可以使用的惟一接口,相当于把Integrated Security 属性值设置为True。

在Windows身份验证模式中,SQL Server使用Windows的安全子系统对用户连接进行有效性验证。即使显示地指定用户ID和密码,SQL Server也不检查连接字符串中的用户ID和密码。因为只有Windows NT、2000、XP支持SSPI,因此如果正使用的是这些 *** 作系统,则只能使用Windows集成的安全策略去连接SQL Server。不论使用哪一个 *** 作系统,当使用SQL Server身份验证时,必须在连接字符串中指定用户ID和密码:

Data Source=ServerNameUser ID=donaldxPassword=unbreakable

默认情况下,SQL Server .NET Data Provider连接指定用户的默认数据库,当在数据库中创建用户时,可以设置用户的默认数据库。此外,也可以在任意时间更改用户的默认数据库。例如,系统管理员的默认数据库是master。如果想要连接不同的数据库,应该指定数据库的名称:

Data Source=ServerNameIntegrated Security=SSPIInitial Catalog=Northwind

每一种身份验证都有它的优点和缺点。Windows身份验证使用单一的用户信息库源,因此,不需要为数据库访问去分别配置用户。连接字符串不包含用户ID和密码,因此消除了把用户ID和密码暴露给未授权的用户的危险。可以在Active Directory中管理用户和他们的角色,而不必在SQL Server中显式地配置他们的属性。

Windows身份验证的缺点是,它要求客户通过Windows的安全子系统支持的安全通道去连接SQL Server。如果应用种序需要通过不安全的网络(例如Internet)连接SQL Server,Windows身份验证将不工作。此外,这种身份验证方法也部分地把管理数据库访问控制的责任从DBA身上转移到了系统管理员身上,这在确定的环境中也许是一个问题。

一般而言,在设计通用的应用程序时,为了使用Windows身份验证,将会对一些方面进行加强。大多数公司的数据库都驻留在比较健壮的Windows服务器 *** 作系统上,那些 *** 作系统都支持Windows身份验证。数据访问层和数据表示层的分离也促进了把数据访问代码封装在中间层组件思想的应用,中间层组件通常运行在具有数据库服务器的内部网络中。当这样设计时,就不需要通过不安全通道建立数据库连接。除此之外,Web服务也使直接连接不同域中数据库的需要大减少。

数据库的连接性已经发展成为应用程序开发的一个标准方面。数据库连接字符串现在已经成为每个项目的标准必备条件。我发现自己为了找到所需要的句法,经常要从另外一个应用程序中复制连接字符串或者进行一次搜索。这个在与SQL Server交互 *** 作时更是如此,因为它有太多的连接字符串选项。现在就让我们来研究一下连接字符串的众多方面。

连接字符串

在对象实例化或者建立期间,数据库连接字符串通过属性或方法被传递到必要的对象。连接字符串的格式是一个以分号为界,划分键/值参数对的列表。列表A中包括了一个C#中的例子,说明了怎样用创建SqlConnection对象的方法连接到SQL Server(实际的连接字符串是通过对象的ConnectionString属性分配的)。列表B中包括的是VB.NET的版本。

列表A

string cString = "Data Source=serverInitial Catalog=dbUser ID=testPassword=test"

SqlConnectionconn = new SqlConnection()

conn.ConnectionString = cString

conn.Open()

列表B

Dim cString As String

cString = "Data Source=serverInitial Catalog=dbUser ID=testPassword=test"

Dim conn As SqlConnection = New SqlConnection()

conn.ConnectionString = cString

conn.Open()

连接字符串会指定数据库服务器和数据库,以及访问数据库必需的用户名和密码。但是这种格式并不是对所有数据库交互都适用,它的确有许多可用的选项,其中很多选项都有同义词。

和Data Source(数据源)、Initial Catalog(初始编目)、User ID(用户ID)、和Password(密码)等元素一起,下面这些选项都是可用的:

Application Name(应用程序名称):应用程序的名称。如果没有被指定的话,它的值为.NET SqlClient Data Provider(数据提供程序).

AttachDBFilename/extended properties(扩展属性)/Initial File Name(初始文件名):可连接数据库的主要文件的名称,包括完整路径名称。数据库名称必须用关键字数据库指定。

Connect Timeout(连接超时)/Connection Timeout(连接超时):一个到服务器的连接在终止之前等待的时间长度(以秒计),缺省值为15。

Connection Lifetime(连接生存时间):当一个连接被返回到连接池时,它的创建时间会与当前时间进行对比。如果这个时间跨度超过了连接的有效期的话,连接就被取消。其缺省值为0。

Connection Reset(连接重置):表示一个连接在从连接池中被移除时是否被重置。一个伪的有效在获得一个连接的时候就无需再进行一个额外的服务器来回运作,其缺省值为真。

Current Language(当前语言):SQL Server语言记录的名称。

Data Source(数据源)/Server(服务器)/Address(地址)/Addr(地址)/Network Address(网络地址):SQL Server实例的名称或网络地址。

Encrypt(加密):当值为真时,如果服务器安装了授权证书,SQL Server就会对所有在客户和服务器之间传输的数据使用SSL加密。被接受的值有true(真)、false(伪)、yes(是)和no(否)。

Enlist(登记):表示连接池程序是否会自动登记创建线程的当前事务语境中的连接,其缺省值为真。

Database(数据库)/Initial Catalog(初始编目):数据库的名称。

Integrated Security(集成安全)/Trusted Connection(受信连接):表示Windows认证是否被用来连接数据库。它可以被设置成真、伪或者是和真对等的sspi,其缺省值为伪。

Max Pool Size(连接池的最大容量):连接池允许的连接数的最大值,其缺省值为100。

Min Pool Size(连接池的最小容量):连接池允许的连接数的最小值,其缺省值为0。

Network Library(网络库)/Net(网络):用来建立到一个SQL Server实例的连接的网络库。支持的值包括: dbnmpntw (Named Pipes)、dbmsrpcn (Multiprotocol/RPC)、dbmsvinn(Banyan Vines)、dbmsspxn (IPX/SPX)和dbmssocn (TCP/IP)。协议的动态链接库必须被安装到适当的连接,其缺省值为TCP/IP。

Packet Size(数据包大小):用来和数据库通信的网络数据包的大小。其缺省值为8192。

Password(密码)/Pwd:与帐户名相对应的密码。

Persist Security Info(保持安全信息):用来确定一旦连接建立了以后安全信息是否可用。如果值为真的话,说明像用户名和密码这样对安全性比较敏感的数据可用,而如果值为伪则不可用。重置连接字符串将重新配置包括密码在内的所有连接字符串的值。其缺省值为伪。

Pooling(池):确定是否使用连接池。如果值为真的话,连接就要从适当的连接池中获得,或者,如果需要的话,连接将被创建,然后被加入合适的连接池中。其缺省值为真。

User ID(用户ID):用来登陆数据库的帐户名。

Workstation ID(工作站ID):连接到SQL Server的工作站的名称。其缺省值为本地计算机的名称。

解决SQL Server 连接时的一些基本问题后的若干初浅心得

学生做了一个题库系统,用C#写的ASP应用程序,数据库用SQL Server2000,交给我看看。放到服务器上后,出现问题。反复调整后发现了解决的方法,其实很简单。回过头去看了看,发现是自己对SQL Server的连接语句和用户权限的认识不足所造成的。下面将我的一些心得以及网上查到的有关资料汇集一下,以为后来者借鉴,当然很肤浅。

1、SQL Server的连接方式

以本地服务器(LocalHost),数据库(Northwind)为例,可以有以下一些连接方式

SqlConnection conn=new SqlConnection( "Server=LocalHostIntegrated Security=SSPIDatabase=Northwind")

SqlConnection conn = new SqlConnection("Data Source=LocalHostIntegrated Security=SSPIInitial Catalog=Northwind")

SqlConnection conn = new SqlConnection(" Data Source=LocalHostInitial Catalog=NorthwindIntegrated Security=SSPIPersist Security Info=FalseWorkstation Id=XURUIPacket Size=4096")

SqlConnection myConn = new SqlConnection("Persist Security Info=FalseIntegrated Security=SSPIDatabase=northwindServer=LocalHost")

SqlConnection conn = new SqlConnection(" Uid=saPwd=***Initial Catalog=NorthwindData Source=LocalHostConnect Timeout=900")

心得:

a.Server和Database,Data Source和Initial Catalog配对使用的,可以互相替换(见笑)

b.Integrated Security默认值是False,此时需要提供Uid和Pwd,即将以Sql Server 用户身份登陆数据库;如果设置为True,Yes 或 SSPI,这不能出现Uid和Pwd,将以Windows用户省份登陆数据库。强烈推荐用后一种形式,安全性更高。

c.Integrated Security和Persist Security Info同时出现,后者设置为False,可保证信息安全。

更多字符串连接说明请看MSDN:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemDataSqlClientSqlConnectionClassConnectionStringTopic.asp

连接字符串的书写应该熟练后应该没有什么问题,我是再看别人的程序,说实话有些东东还真不清楚。但连接不上的问题出现后,得解决呀。所以必须要弄懂这些关键字的意义,修改后再测试。

2、SQL Server的用户设置

问题一、采用连接字符串

SqlConnection conn = new SqlConnection(" Uid=saPwd=***Initial Catalog=NorthwindData Source=LocalHostConnect Timeout=900")

错误:

用户"sa"登陆失败,没有可信任的Sql Server连接

查资料后找到解决方法:

原因:Sql Server的验证方式需要设置为Sql Server验证和Windows集成验证的混合方式,如果仅设置为后一种方式,就会出像上述问题

解决:运行Sql Server的企业管理器,点击服务器,在右键菜单中选择属性,选安全性,更改验证方式即可

问题二、采用连接字符串

SqlConnection conn = new SqlConnection("Data Source=LocalHostIntegrated Security=SSPIInitial Catalog=Northwind")

错误:

用户"computername\IWAM_servername"登陆失败

原因:SQL Server的登陆用户中不包括IWAM_servername

解决方法:运行Sql Server的企业管理器,点击服务器,选安全性,选登陆,新建登陆中加入IWAM_servername,并配备相应的权限,如只能访问Northwind数据库,数据库的角色设置为public和db_owner。

3、关于连接的安全性

最好使用SSPI的集成安全方式连接数据库,而sa用户的方式连接会存在安全隐患,我认为主要是因为在安装SQL Server时,经常会为了访问的方便设置sa的密码为空,黑客一旦让sa成为管理员,就可以获得对系统的所有访问权限。所以为了数据库的安全,可以设置 SQL server的访问用户只能经过windows集成验证,设置sa的安全密码,加强数据库的安全性。当然设置为windows集成验证后,数据库的性能和访问的灵活性势必会受到影响,管理员可以针对每一个数据库设置不同的验证方式,而不必对SQL server设置成统一的方式。

数据层还需要函数,否则你这个结构就不叫三层结构了,你这个函数应该是在数据访问层里到,数据访问层返回给逻辑层的数据不应该是SqlDataReader对象,你可以选择返回String[],List<....>,HashTable等。

数据访问层:

给你几个我的函数吧:

public

static

void

Open()

{

if

(con.State

==

ConnectionState.Closed)

{

con.Open()

}

}

public

static

void

Close()

{

if

(con.State

==

ConnectionState.Open)

{

con.Close()

}

}

public

static

SqlCommand

CreateCommand(string

sql)

{

return

new

SqlCommand(sql,

con)

}

public

static

List<string>

RunSQLReturnList(string

sql)

{

List<string>

info

=

new

List<string>()

SqlCommand

cmd

=

CreateCommand(sql)

Open()

SqlDataReader

sdr

=

cmd.ExecuteReader()

while

(sdr.Read())

{

for

(int

i

=

0

i

<

sdr.FieldCount

i++)

{

info.Add(sdr.GetName(i).ToString())

info.Add(sdr.GetValue(i).ToString())

}

}

Close()

return

info

}

public

static

Hashtable

RunSQLReturnHashTable(string

sql)

{

List<string>

lt

=

RunSQLReturnList(sql)

Hashtable

ht

=

new

Hashtable()

for

(int

i

=

0

i

<

lt.Count

i

+=

2)

{

ht[lt[i]]

=

lt[i

+

1]

}

return

ht

}

数据访问层返回给逻辑层HashTable对象hashTable1:

user.username=hashTable1["Name"].ToString()

.........

逻辑层返回给表示层实体对象user

label1.text

=

user.UserName


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6829430.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-28
下一篇 2023-03-28

发表评论

登录后才能评论

评论列表(0条)

保存