电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 在线教程-> 数据库
应用数据库的唯一性约束并在asp中捕捉数据库的错误
作者:网友供稿 点击:10
  西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!虚拟主机可在线rar解压,自动数据恢复设置虚拟目录等.虚拟主机免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:[1] 
本文中所提到的asp页面,除特别声明外,均指<@page languege=”vbscript”>
写asp与数据库的结合的程序时,经常会遇到同一数据表中不允许存在重复值的问题,比如用户注册程序中不允许出现相同的用户id。这样的情况下,我以前采取的办法是读取数据库中的已存在值,然后与用户输入的值比较,如果有相同,则提示已被注册,须重新填写。这样做可以达到预期的目的,但是因为有一次额外的数据库存取操作,比较浪费资源。
我们都知道,数据表中的列可以设置唯一性约束,就是从数据库限制该字段不允许出现重复值,违反唯一性约束后,数据库将返回2627错误,提示“违反了 %1! 约束 %2!。不能在对象 %4! 中插入重复键”,这是数据库的输出,sql server 的所有错误都存储在系统表 master.dbo.sysmessages 中。用户定义的消息也可以存储在 sysmessages 中。在asp中调用存储过程的时候,由于存储过程没有容错处理,会返回该提示到页面,并终止语句的执行,@@error返回值为0。如果页面设置了容错,则不会出现错误提示,但因为错误是数据库中出现的,所以err.number不能得到其错误号。(也可能是我的数据库不熟的原因:-),还请大虾指点)。近日研究ado,找到了一种更加简便的方式实现该控制。
ado(activex data objects)被广泛的用于应用程序与数据库的连接,asp也可以通过他来实现对数据库的操作的。ado 2.1的connection对象中有一个error对象,通过它可以捕捉到来自数据库的错误,以在asp页面中控制。该对象常用的property有如下几个,均为只读:
description:字符型,返回来自数据库的错误描述
source:字符型,错误来源
sqlstate:字符型,odbc api(驱动程序管理器)错误,sql server 2000中对其有如下描述:
sqlstate 返回的字符串值由两个字符的类值后接三个字符的子类值组成。类值 01 表明是一种警告,后跟随 sql_success_with_info 的返回代码。只要类值不是 01(im 除外),则表明是一种错误,后跟随 sql_error 的返回代码。类 im 专门用于表明从 odbc 实现产生的警告和错误。任何类中子类值 000 均用于实现给定类中所定义条件。这种类值和子类值的分配方法由 sql-92 定义。
跑题了跑题了,回到刚才的话题~~~
number:返回与错误相关联的数字值,是一个 32 位的值。较高的 16 位字是设施代码,而较低的字才是真正的错误代码。
nativeerror:这就是我们今天要用到的,msdn对他的描述是:
the nativeerror property on a error(是不是m$的bug?我英语不及格:-))object indicates the provider-specific error code for a given error object. this property returns a a long value that indicates the error code.
还有helpfile和helpcontext,都是有关帮助的,这里就不详述了。
在这里我们用到了nativeerror,用它来捕捉来自数据库的错误,他返回了该错误的编号。源程序片断如下:
<%on error resume next vbscript的容错
set conn = server.createobject("adodb.connection")
set rs = server.createobject("adodb.recordset")

conn.open"dsn=bbii; uid=sa; pwd="
sql="exec ch_insnovel d,22,33,44,55"
sql = "insert into novel (name,author,yy,ee)values(nn,ee,jj)",与上句效果是一样的
rs.open sql,conn
if conn.errors.count = 0 then判断错误的个数
issucc = " 成功 "
else
select case conn.errors.item(0).nativeerror
case 2627
issucc = "ddddddd" 你可以根据需要,定义多个自己的错误返回值
end select
end if
response.write "<br>:::"&issucc
%>
注意select case…一句中的“conn.errors.item(0).nativeerror”,返回一组item中的第一个。在我们这个例子当中,伴随2627措促同时发生的是“语句已终止”(3621),严格来讲,他不是错误,而是一般性警告(严重级别=10)。所以我们需要用来判断的是第一个错误,当然,你可以定义i = i + 1来查看所有发生的错误。这样,我们就能够知道来自sql server的错误的具体内容,可以更容易的控制了。

附:错误编号
<!—errlp.asp-->
<%on error resume next
set conn = server.createobject("adodb.connection")
conn.open "driver={sql server}; server=127.0.0.1; database=master; uid=sa; pwd="
set rs = server.createobject("adodb.recordset")
sql = "select * from sysmessages where msglangid = 2052 order by error"
rs.open sql,conn,3,2
page = clng(request("txtpage"))
rs.pagesize = 100
if page < 1 then page = 1
if page > rs.pagecount then page = rs.pagecount
rs.absolutepage = page
%>
<style>
td
{
font-family: verdana;
font-size: 10pt;
}
</style>
<div>
<form method="get">
<table width="100%" border="0" cellspacing="0" cellpadding="0" bgcolor="#999999">
<tr>
<td width="100">总计数:<%=rs.recordcount%></td>
<td width="80">总页数:<%=rs.pagecount%></td>
<td width="90">目前页次:<%=page%></td>
<td width="80">转到<input type="text" name="txtpage" size="2" style="font-family: verdana; font-size: 8pt; border-style: solid; border-width: 1">页</td>
<td width="60">
<%
if page <> 1 then
response.write"<a href=errorlp.asp?txtpage=1>第一页</a>"%> </td>
<td width="60">
<%response.write"<a href=errorlp.asp?txtpage="&(page - 1)&">上一页</a>"%> </td>
<%
end if

if page <>rs.pagecount then%>
<td width="60">
<%response.write"<a href=errorlp.asp?txtpage="&(page + 1)&">下一页</a>"%> </td>
<td width="70"><%response.write"<a href=errorlp.asp?txtpage="&rs.pagecount&">最后一页</a>"
end if
%>
</td>
<td> </td>
</tr>
</table>
</form>
</div>
<p>
<div>
<table cellspacing="0" cellpadding="0" border="1" width="100%" bordercolor="#999999">
<tr>
<td>错误号</td>
<td>严重级别</td>
<td>dlevel</td>
<td>信息</td>
</tr>

<%for ipage = 1 to rs.pagesize%>

<tr onmouseover="javascript:this.style.background=#dddddd;" onmouseout="javascript:this.style.background=;">
<td><%=rs("error")%></td>
<td><%=rs("severity")%></td>
<td><%=rs("dlevel")%></td>
<td><%=rs("description")%></td>
</tr>
<% rs.movenext
if rs.eof then exit for
next
set rs = nothing
set conn = nothing
%>
</table>
</div>
<!--corpright by cheery_ke-->
另:有关ado2.1与conn.errors的说明,请见ms-help://ms.msdnvs.2052/dnaxctrl/html/ado_objm.htm


文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·数据库开发个人总结(ADO.NET小结)-.NET教程,数据库应用
·怎么由DataSet将数据导入Excel?-.NET教程,数据库应用
·动态创建SQL Server数据库、表、存储过程-ASP教程,数据库相关
·Win32环境下动态链接库(DLL)编程原理-.NET教程,数据库应用
·封装的ADO.NET对数据库操作经典类-.NET教程,数据库应用
·在DataGridView中获得DataGridViewCheckBoxColumn的状态-ASP教程,数据库相关
·DataGrid使用心得(附大量代码)-ASP教程,数据库相关
·用代码创建DataGrid的多链接及checkbox事件响应-.NET教程,数据库应用
·ADO.NET 的最佳实践技巧-.NET教程,数据库应用
·转载: 用纯ASP代码实现图片上传并存入数据库中

最新文章
·根据数据表中数据,生成Powerpoint幻灯片-ASP教程,数据库相关
·DataGrid中的按钮反选事件与NamingContainer(命名容器)-downmoon-ASP教程,数据库相关
·使用用VB处理MYSQL数据库中二进制数据问题-.NET教程,VB.Net语言
·关于DataGridView中如何接收处于编辑状态下的当前信息-ASP教程,数据库相关
·在DataGridView中获得DataGridViewCheckBoxColumn的状态-ASP教程,数据库相关
·.net下访问Access数据库需要注意的问题-.NET教程,Asp.Net开发
·ActiveMQ4.1+Spring2.0的POJO JMS方案(上)-.NET教程,数据库应用
·ASP.NET 2.0中直接将Access数据库导入到Excel文件中-.NET教程,Asp.Net开发
·NET(C#)连接各类数据库-集锦-.NET教程,C#语言
·ASP.NET2.0连接SQL Server数据库详解-.NET教程,Asp.Net开发




版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号