ASP.NET数据库编程之Access连接失败
在讨论实际命令之前,我们需要了解的是accessdatasource控件派生于sqldatasource控件。在大多数情况下,这只是一个背景问题。但是当处理异常的时候,就必须使用实际上存在于(从而以之命名的)sql数据源对象之中的对象。
软着陆的技术使用的代码将在accessdatasource控件经历onselected event时被触发。当gridview从数据源控件请求数据时,这个事件将会在内部触发。 处理连接错误的代码就会检查到从数据源控件传递过来的异常参数。accessdatasource控件没有关于这个参数的自己的名称,所以只能使用名称sqldatasourcestatus- eventarguments。如果异常参数为空,那么表示什么事情都没有发生。如果异常参数有一个值,那么将检查这个值。如果参数是oledb exception类型的,那么页面上的警告标签的文本将会有提示信息。再次提醒您注意术语的使用。如果有一个accessexception类型,那将更明了,可惜实际上没有这种类型。可以使用更加普通的oledbexception对象并以处理异常的命令结束脚本。这样将允许gridview继续呈现,虽然没有数据,并防止出现浅褐色背景的常规asp.net 2.0失败页面。因为gridview没有得到任何数据,所以它将会显示一个替换表格,表格中只有一个在其emptydatatext属性中显示消息的单元格。
如果您在进行这些步骤中遇到困难,千万不要感到悲观;下一个练习将会进行示范。而现在,只需将代码剪切并粘贴到页面之中。在本书的后面,我将会讨论如何创建一个用于连接失败情况下的gridview的替换页面以及处理错误事件的详细内容。
试一试#4—— 处理accessdatasource连接失败
(1) 在ch02文件夹中,创建一个名为tio-4-connectionfailure-cs.aspx的文件。在design视图中,添加一个指向northwind 的accessdatasource控件至页面,该控件从表中选择了所有列。
(2) 添加gridview用来显示数据源控件中的信息。同样,添加一个标签控件,并将其命名为“message”。
(3) 现在切换至source视图并对标记作一些修改,如下突出显示代码所示。如果其中有<columns>标记部分,则将其删除。留下的代码应当如下所示:
<head id="headl" runat="server">
<title>chapter 2 tio #4 connection failure to access in c#</title>
</head>
<body>
<h3>chapter 2 tio #4 connection failure to access in c#</h3>
<form id="forml" runat="server">
<asp:label id="message" runat="server"/><br/><br/>
<asp:gridview id="gridviewl" runat="server"
datasourceid="accessdatasourcel"
autogeneratecolumns="true"
emptydatatext="no data records were returned" />
<asp:accessdatasource id="accessdatasourcel" runat="server"
selectcommand="select * from products"
datafile="~/app_data/northwind.mdb"
onselected="accessdatasourcel_selected"
/>
</form>
</body></html>
(4) 检查页面;在查看由northwind售出的产品的时候,不应该出现问题。
(5) 现在将添加代码来处理连接问题了。转到页面的顶部并进入如下脚本。第一个示例用c#编写,第二个示例用vb编写。进入其中之一即可。
<script runat="server">
void accessdatasourcel_selected(object sender, sqldatasourcestatuseventargs e)
{
if (e.exception != null)
{
if(e.exception.gettype()==typeof(system.data.oledb.oledbexception))
{
message.text = "there was a problem opening a connection to the
database. please contact the system administrator for this site.";
//optionally set gridviewl.visible = false;
e.exceptionhandled = true;
}
}
}
</script>
<html> ...
以下是用vb编写的脚本。
<!doctype html public "-//w3c//dtd xhtml 1.1//en"
"http://www.w3.org/tr/xhtmlll/dtd/xhtmlll.dtd">
<script runat="server">
sub accessdatasourcel_selected(byval sender as object, byval e as
sqldatasourcestatuseventargs)
if (not e.exception is nothing) then
if typeof e.exception is system.data.oledb.oledbexception then
message. text = "there was a problem opening a connection to the database. please contact the system administrator for this site."
' optionally set gridviewl.visible = false
e.exceptionhandled = true
end if
end if
end sub
</script>
<html> ...
(6) 保存并运行页面。因为我们实际的连接还保持完好,所以现在还没有任何问题。关闭浏览器。
(7) 现在将northwind的mdb文件从\app_data移动至c:\temp文件夹中,这样连接将会失败。或者,可以修改代码来尝试连接southwind.mdb。运行页面并注意浏览器将显示一个得体的失败信息。
(8) 如果移动了northwind.mdb,那么将其再移动回c:\begaspnetdb\ app_ data文件夹中。
示例说明#4—— 处理accessdatasource连接失败
首先,请回想一下accessdatasource控件是sqldatasource的派生物,并且使用了应用于oledb数据源的一系列异常,所以当引用了带有sql或者oledb名称而不是access名称的对象时,请不要惊讶。
请观察在页面上进行的处理连接失败的三个修改。第一,添加了gridview数据源控件的一个属性,该属性在gridview没有从数据源控件中获得任何数据时将会显示一条消息。第二,添加了数据源控件的一个属性,该属性在onselected事件发生时调用data_selected事件处理程序。请注意这处于datasource事件中。虽然用户没有直接选择 accessdatasource控件(也没有向用户呈现),但是当gridview向数据源控件请求数据时,选择还是在内部发生了。第三,您编写了这段脚本。
该脚本将会接收到几个参数,其中之一就是异常。这里没有名为accessdatasourcestatuseventargs的对象。但是,可以获得一个内部派生出 access- datasource 的基本对象:sql datasource。sqldatasource对象具有可以提交至accessdatasource控件的状态参数。如果没有问题,则异常列表为空。如果有一个异常,那么代码将会进行测试来查看抛出的异常是什么类型。同样地,也没有像access exception一样的对象。但是,accessdatasource将异常放入更加普通的称为oledb exception的对象中。假定在这个集合中的所有异常都是由连接失败造成的。我们的代码将作出反应,反馈一些友好的失败通告到名为message的标签上。
这段代码中的最大的窍门就是始终让对象使用了三个不同的名称。使用了一个access文件(mdb)作为数据源并使用accessdatasource控件。但是使用了底层的sqldatasource作为事件参数。最后,使用了普通的oledb异常集。很多错误都源于在所有的情况下都使用名为access的asp.net 2.0对象。
推荐阅读
-
ASP.NET数据库编程之Access连接失败
-
IIS7下使用ASP.NET连接ACCESS数据库时提示如下错误的解决方法
-
PHP ODBC连接ACCESS数据库失败
-
asp.net 连接access与mssql server数据库方法
-
asp.net连接Access数据库相对路径写法
-
数据库连接失败:mysql_error:Access denied for user 'root'@'localhost'解决思路
-
数据库连接失败:mysql_error:Access denied for user 'root'@'localhost'解决思路
-
asp.net 连接access与mssql server数据库方法
-
PHP ODBC连接ACCESS数据库失败解决方案
-
数据库连接失败:mysql_error:Access denied for user 'root'@'localhost'