asp中的引号规则在asp中如何书写sql语句.docx_第1页
asp中的引号规则在asp中如何书写sql语句.docx_第2页
asp中的引号规则在asp中如何书写sql语句.docx_第3页
asp中的引号规则在asp中如何书写sql语句.docx_第4页
asp中的引号规则在asp中如何书写sql语句.docx_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在学习ASP.NET的过程中,很多同学在书写SQL字符串时都感到比较困难,总是发生各种各样的错误,并且对其中的双引号、单引号和连接运算符&感到非常难以掌握。本文就从头开始系统讲述一下如何书写正确的SQL字符串,并给出一个比较有效的调试方法。 1 双引号、单引号和连接运算符& 首先声明:这里说的符号是英文状态下的符号,也可以说是语法中用到的符号。 因为在书写SQL语句时,最常见的困惑就是对其中的双引号、单引号和连接运算符&的理解。下面就从基础讲起。 (1)关于双引号 在ASP中,用到字符串常数时两边要加上双引号 ,表示其中是一个字符串,如下面都是字符串常数: abcdefg 伟大的祖国 101 2003-10-5 大家可能会想,101是一个数字啊,2003-10-5是一个日期啊。但是,只要在两边加上了双引号,那么它就是一个字符串,不管其中的内容是数字还是英文字母还是中文。 (2)关于单引号 有同学可能会想了,你现在用双引号表示其中是一个字符串,但是假如在字符串中间也用到了双引号,那么岂不就会出现这样的情况: abcdefg 这样显然就会引起别人的误解,到底第一个双引号和第几个双引号配套呢?因为ASP规定,当出现双引号嵌套时,可以将内层的双引号转变为单引号 或者转变两个连续的双引号 。按照该规定,上面的字符串应该改写为如下形式: abcdefg abcdefg 说明: 1 绝大部分情况下,发生引号嵌套时,大家可以将内层引号改成单引号,即第一种形式。 2 特殊情况下,需要使用第二种形式。因为这两者有一定区别,在使用他们时,第1种形式中间就是一个单引号,而第二种形式中间其实是一个双引号,大家可以利用Response.Write 语句将它们输出到页面上比较结果。 不过,需要说明的是,这里说的引号嵌套都是针对英文状态下的字符说的,如果在字符串中间有中文状态下的引号,则不必替换。如下面的字符串都是合法的: 伟大的“祖国”万岁 伟大的“祖国万岁 这也提示我们,在处理客户提交的数据时,如果客户输入的都是中文字符,那么,不管输入了什么,都可以当作一个字符串。但是,如果客户输入的是英文,那么就可能会发生字符串嵌套的情况。 (3)连接运算符& 在使用字符串时,我们经常需要将两个或多个字符串连接成一个大的字符串,这时就需要用到连接运算符&(此时也可以用+,不过一般用&),如下: abcd & efg abcd & efg & hijk 对于上面两个表达式,执行连接运算后结果如下: abcdefg abcdefghijk 我们来看一下其中的连接运算原理,以第一个表达式为例,它实际上是先将两个双引号之间的内容abcd去出来,然后再将第二个字符串之中的内容efg取出来,将它们连到一起变成abcdefg。当然,它们的结果自然还是字符串常数,所以,仍然要在两边添加双引号,表示中间的是字符串常数,因此就变成了最后的abcdefg。 对于第二个表达式,本质上和上面一样,只不过是先将第一个字符串和第二个字符串连接成一个字符串,然后再将它们的结果和第三个字符串连接成最后的字符串。 说明: 1 有的同学想出了一个形式上的理解方法,说是将中间的 & 擦去,然后连到一起就行了。结果是一样的,不过真正的原理还是以上面为准。 2 对于abcd & efg,在ASP中也可以将&两边的空格去掉,成为abcd&efg。不过,推荐加上空格,这样程序会清楚些。 3 有时候,表达式中可能有更多的连接运算符。运算过程也是一样的,从左到右依次进行即可。 上面的例子比较简单,如果中间也有单引号,可能会变得复杂些。不过你只要记住,不管其中有无单引号,一个字符串两边的双引号之间的内容都是这个字符串的内容,连接时都要取出来,你只要将其中的单引号当成普通的字符即可。如下面的例子: abcdefg & hijklmn 执行连接运算后,结果如下: abcdefghijklmn 至于具体原理仿照上面的讲解即可。将第一个字符串中的内容abcdefg和第二个字符串中的内容hijklmn取出来连到一起,变成abcdefghijklmn,然后在两边加上双引号,表示这是一个字符串常数abcdefghijklmn。 好,现在相信大家对于双引号、单引号和连接运算符的概念已经比较清楚了,可能还有的同学会进一步提出,上面的例子(abcd & efg)好像意义不大啊,这个式子直接写成abcdefg,何苦要将其分成两部分,中间再加个连接符,这不多此一举吗? 这个想法其实是对的,在实际使用中,尽管有时也用&连接两个字符串常数,但是更多的时候是将一个字符串常数和一个字符串变量连接到一起,或者是将两个字符串变量连接到一起。如下: abcdefg & strTemp 大家可以注意到,上面的表达式中,第一项是一个字符串常数,第二项是一个字符串变量。那么它们是怎么执行连接运算呢?其实很简单: 假如strTemp=hijklmn,那么将其代入到上面表达式,那么上面的表达式就变成了 abcdefg & hijklmn 后面的运算原理和前面的讲述也就一样了,最后结果为abcdefghijklmn 还有人喜欢写成这样: strSql=abcdefg strSql=strSql & strTemp 这是两条语句,执行完毕后其实和上面的结果是一样的。它的过程是:在第一句中将abcdefg保存到变量strSql中,在第二句中从变量中取出字符串,再和字符串变量strTemp连接到一起,重新保存到变量strSql中。假如strTemp=hijklmn,那么执行完毕后变量strSql中的内容为abcdefghijklmn。 (4)一个常犯的错误:将字符串变量写到了字符串常数中 这里要特别强调一个常犯的错误,就是将字符串变量直接写到了字符串常数中,如对于上面的表达式,个别同学写成了 abcdefgstrTemp 他认为这就是将字符串常数abcdefg和字符串变量strTemp连接到一起了。可是,除了他自己,别人谁能看出strTemp是一个字符串变量呢? 其实在这个错误的写法中,strTemp这几个字符和前面的abcdefg字符没有任何本质区别。系统不会将其当作字符串变量,而只会把它们看作是这个大字符串的一部分内容。或者说,这就是一个字符串常数,其中的内容是abcdefgstrTemp。 因此,大家一定要记住,字符串变量不能直接写到字符串常数中。在希望将一个字符串常数和一个字符串变量连接到一起时,一定要使用&(或+)将它们连接到一起。如: abcdefg & strTemp 当然,如果希望将两个字符串变量连接到一起,也是一样的,如: strTemp1 & strTemp2 还有,有时会将几个字符串常数和几个字符串变量连接到一起,如: abcdefg & strTemp & hijklmn 它们的运算原理和过程都一样,将字符串变量的内容代入到表达式中,然后执行连接运算。 2 书写正确的SQL字符串 深刻掌握上面一节后,其实就可以比较容易的书写SQL字符串了。因为本质上,SQL字符串也就是一个普通的字符串,不管使用字符串常数还是字符串变量,总之最后你要将它们连接成一个符合一定格式要求的字符串而已。 首先强调:SQL语言有如下规定,在SQL字符串中 1 文本型、备注型字段对应的字段值两边要加引号。 2 数字、自动编号、布尔型两边什么都不用加。 3 日期字段对应的子段值两边要加 # 号,在SQL数据库中改用引号。 4 自动编号字段不用自己添加,数据库会自动添加。 下面举例讲解,要提前说明的是下面主要以Insert语句为主,其实Select、Update、Delete等语句也大同小异: 假如有一个数据库,其中有下面的数据表users,包含包含下面的字段,字段都是默认设置: 字段1 ID 自动编号(该字段实际不需要插入,系统自动插入) 字段2 username 文本型(也就是字符串型)(用户名) 字段3 age 数字型(年龄) 字段4 birthday 日期型(生日) 字段5 marry 布尔型(是否结婚,结婚为True,未结婚为False) 字段6 intro 备注型(简介) 2.1 在SQL字符串中插入文本型、备注型字段值 (1)一个最简单的SQL字符串 先来看一个很简单的SQL语句。 Insert Into users(username) values(小王) 大家来看一下,这是一个标准的SQL语句,因为username是文本型字段,所以字段值两边要加双引号,表示 小王 是一个字符串。 上面的SQL语句是可以直接在Access的查询中执行的。可是在ASP程序中,SQL语句是当作一个字符串来处理的,因此我们通常这样写 strSql=Insert Into users(username) values(小王) 此时,前后的双引号表示中间是一个字符串。而小王两边的单引号是因为发生了引号嵌套,所以内层引号改为了单引号。 (2)在SQL字符串中使用字符串变量 实际插入记录时,因为“小王”通常是从表单中获取的,如Request.Form(“username”),当然也可以将其保存到一个字符串变量myusername中。 不过前面第1节特别提到过,字符串变量不能直接写到字符串常数中,必须用&和字符串常数连接到一起,因此,上面的例子要改成下面的形式: strSql=Insert Into users(username) values( & myusername & ) 个别同学此时就糊涂了,为什么其中又有单引号,又有双引号,还有连接运算符啊?其实,仔细回忆一下上一节讲述的内容,就会发现并不复杂。 在这条语句等号右边的表达式中,其实包括如下三部分内容,两个字符串常数和一个字符串变量,它们之间用连接运算符连接到一起: 第一部分 字符串常数:Insert Into users(username) values( 第二部分 字符串变量:myusername 第三部分 字符串常数:) 这几部分容易引起糊涂的是,为什么第一部分后面是一个单引号和一个双引号啊?为什么第三部分开头是一个双引号和一个单引号啊。其实,对于第一部分来说,两边的双引号就表示中间的内容是一个字符串常数,其中的单引号和别的字符一样,只是这个字符串常数的内容而已。同理,对于第三部分,两边的双引号表示这是一个字符串常数,中间的单引号和括号)就是它的内容。 理解清楚每一部分的组成后,有同学可能会问,我现在知道这就是一个字符串常数连接一个字符串变量,再连接一个字符串常数,其中的单引号和双引号我也知道怎么回事了。可是你为什么要这样写呢?为什么我就想不到这样写。 其实,这要从我们的最终目标来看,假如用户输入的用户名(username字段)是“小王”,那么我们最后实际需要的就是如下的SQL字符串。 strSql=Insert Into users(username) values(小王) 因为客户输入的是“小王”,所以,字符串变量myusername = 小王,将它代入到下面的表达式中: strSql=Insert Into users(username) values( & myusername & ) 就变成了 strSql=Insert Into users(username) values( & 小王 & ) 依次执行两个连接运算符,将右边的三部分连接成一个字符串,最后结果如下。 strSql=Insert Into users(username) values(小王) 可以看到,这就是我们最终需要的SQL字符串。现在可以看清楚了,原来第一部分中的单引号和第三部分中的单引号就是现在 小王 两边的单引号,表示小王是一个字符串。 (3)使用两个字符串变量 上面的例子只有一个字段比较简单,下面给一个两个字段的例子。假如现在要插入两个字段值,username和intro(intro字段是备注型,字段值两边也要加引号)。 strSql=Insert Into users(username,intro) values( & myusername & , & myintro & ) 在这个表达式中,myusername和myintro都是字符串变量,分别保存用户名和用户简介信息。现在就来剖析这个表达式。 等号右边其实是如下五部分组成的: 第一部分 字符串常数:Insert Into users(username,intro) values( 第二部分 字符串变量:myusername 第三部分 字符串常数:, 第四部分 字符串变量:myintro 第五部分 字符串常数:) 现在还是将字符串变量代入后来理解。假如myusername=小王,myintro=一个好孩子,那么代入后就变成了 strSql=Insert Into users(username,intro) values( & 小王 & , & 一个好孩子 & ) 依次执行四个连接运算符,结果如下: strSql=Insert Into users(username,intro) values(小王,一个好孩子) 大家可以看到,这是一个正确的SQL字符串,因为这两个字段值两边都要加引号,所以原来的字符串常数中才有好几个单引号。其中第一部分和第三部分开头的单引号是小王两边的,第三部分后面和第五部分中的单引号是 一个好孩子 两边的。 如果添加更多的子段值,请大家依次类推。 2.2 在SQL字符串中插入数字型和布尔型字段值 前面提到过,在SQL字符串中,数字型和布尔型字段值两边什么都不用加,想对比较简单。 (1)插入数字型字段 假如插入一个年龄为12的记录,最终的SQL字符串应该如下: strsql=Insert into users(age) values(12) 如果现在年龄是一个变量myage,则应该为: strsql=Insert into users(age) values( & myage & ) 这里等号右边也是三部分,分别如下: 第一部分 字符串常数:Insert into users(age) values( 第二部分 数字变量:myage 第三部分 字符串常数:) 这里需要注意的是数字变量myage在这个表达式中会自动转换成字符串,假如myage=12,那么实际上代入为12,就变成了 strsql=Insert into users(age) values( & 12 & ) 继续执行连接运算符,就变成了如下我们需要的最终结果。 strsql=Insert into users(age) values(12) (2)插入布尔型字段 布尔型的解释和上面是一样的,只不过它只有两个值 True和False,如: strsql=“Insert into users(marry) values(True)” 如果换成布尔变量mymarry strsql=“Insert into users(marry) values(” & mymarry & “)” 2.3 在SQL字符串中插入日期型字段值 日期型和文本型类似,但是要将单撇号替换为#号。(不过,Access数据库中用单撇号也可以) strsql=“Insert into users(birthday) values(#2005-3-1#)” 如果换成日期变量mydate,则应该如下: strsql=“Insert into users(birthday) values(#” & mydate & “#)” 这里也要特别说明的是日期变量mydate会自动转换为字符串代入,如将mydate=#2005-3-1#代入后实际为: strsql=“Insert into users(birthday) values(#” & 2005-3-1 & “#)” 执行连接运算符,结果如下: strsql=“Insert into users(birthday) values(#2005-3-1#)” 需要特别注意的两点: (1)有很多人经常在这里使用日期函数Date()或Now(),你只要将其也看作变量就可以了。如: strsql=“Insert into users(birthday) values(#” & Date() & “#)” (2)在SQL数据库中,这里不能用#号,也要用单引号,就好比是一个文本型字段值。 2.4 综合示例 在上面的例子中,我们都值插入了几个字段,下面一次插入很多字段。 strSql=Insert Into users(username,intro,age,submit_date,marry) values( & myusername & , & myintro & , & myage & ,# & mysubmit_date & #, & mymarry & ) 假如myusername=小王,myintro=一个好孩子,myage=20,mysubmit_date=#2004-4-1#,mymarry=False代入其中,结果为: strSql=Insert Into users(username,intro,age,submit_date,marry) values( & 小王 & , & 一个好孩子 & , & 20 & ,# & 2004-4-1 & #, & True & ) 注意,这里的日期变量和数字变量的值已经自动转换为了字符串。依次执行连接运算,结果为: strSql=Insert Into users(username,intro,age,submit_date,marry) values(小王,一个好 孩子, 20,# 2004-4-1#,True) 这正是我们需要的正确的SQL字符串。 2.5 一个小技巧 下面是一个同学提出的写SQL字符串的小技巧,要把下面的语句题换成变量的写法: strsql=“Insert into users(username) values(张红)” 第一步:先把张红抹去,在原位置加两个引号 strsql=“Insert into users (username) values(” “)” 第二步:在中间添加两个连接符& strsql=“Insert into users (username) values(” & & “)” 第三步:把变量写在两个连接符之间 strsql=“Insert into users (username) values(” & thename & “)” 大家可以参考,但是一定要了解上面讲的根本原理。 3 如何向数据库中添加不完整的信息 在客户填写表单内容的时候,如果客户填写了所有内容,那么就按照2.4节中的综合示例,依次添加所有字段值即可。但是而实际开发时应该允许客户省略某些内容,否则如果项目太多,客户可能会填的发疯。 假如我们现在允许客户省略个人简介,仍然使用2.4节中给出的字符串: strSql=Insert Into users(username,intro,age,submit_date,marry) values( & myusername & , & myintro & , & myage & ,# & mysubmit_date & #, & mymarry & ) 现在几个变量值分别如下:myusername=小王,myintro=,myage=20,mysubmit_date=#2004-4-1#,mymarry=False。其中因为客户没有填写个人简介,所以myintro=,这是一个空字符串,也就是字符串长度为0的字符串。 将以上值代入上面表达式,则结果如下: strSql=Insert Into users(username,intro,age,submit_date,marry) values( 小王,20,# 2004-4-1#,True) 大家仔细看这个表达式,其中的intro字段对应的字段值变成了一个空字符串,而Access数据库默认是不允许插入空字符串的,所以执行这个式子就会发生错误。 那么该怎么办呢?两种办法:一种办法是修改数据库,使这个字段允许输入空字符串;另一种办法是修改程序,将这个字段从Insert语句中删除,就不让它出现在SQL字符串中。 下面依次讲解: 31 修改数据库的方法 打开数据库,进入users表的设计界面,选择字段intro,在下方“允许空字符串”栏选择“是”即可。修改数据库后,程序部分基本不用大修改。 32修改程序的方法 修改数据库固然简单,但是有时候不方便修改数据库,那么就只能修改程序了。假如客户填写了简介,就让intro字段出现在Insert语句中,假如客户没有填写简介,就不要让intro字段出现在Insert语句中。说起来容易,因为不知道客户到底会不会填写,所以具体写起来非常困难。 下面举一个不太恰当的例子,假如有5对夫妻,现在让他们排成下面一样的队列。 夫1 夫2 夫3 夫4 夫5 妻1 妻2 妻3 妻4 妻5 如果这5对夫妻都来排队,当然很容易。可是假如第5对夫妻有可能不来,那又该怎么办呢?我们可以采取下面的办法,让丈夫和妻子先分别排队,首先让肯定要来的前四对夫妻分别排好队,如下: 夫1 夫2 夫3夫4 妻1 妻2 妻3妻4 然后,假如第5对夫妻来了,就让他们分别站到两个队的末尾。最后,将两个队再组 合成一个队,如下: 夫1 夫2 夫3 . 妻1 妻2 妻3 . 在本示例中,因为intro字段可能出现,也可能不出现。所以仿照上面的道理,我们可以将Insert语句拆成前后两部分,前一部分是字段列表,后一部分是字段值列表,如果填写了个人简介,就在前一部分中加上intro字段,同时在后一部分中加上字段值。否则就都不加。书写Insert语句的具体代码如下: 下面定义5个变量,用来获取表单中的值 Dim username,age,birthday,marry,intro As String username=Request.Form(username) age=Request.Form(age) birthday=request.Form(birthday) marry=request.Form(marry) intro=request.Form(intro) 下面组织Insert语句,先将其分为前后两部分,分别完成 Dim sqla,sqlb,strSql As String sqla = Insert into users(username,age,birthday,marry sqlb = Values( & username & , & age & ,# & birthday & #, & marry If intro Then sqla = sqla & ,intro sqlb = sqlb & , & intro & End If 最后将前后两部分组合成一个完整的Insert语句 strSql = sqla & ) & sqlb & ) 说明: 这里获取变量值时都是当作字符串变量获取的。 上面的语句中的单引号和双引号的解释同前面各节中的解释。大家可以变换各种情 况,将变量的值代入查看最终结果。 假如客户没有填写简介,则最终结果类似于: strSql=Insert Into users(username,age,submit_date,marry) values(小王, 20,# 2005-3-1#,True) 假如客户只填写了简介,则最终结果类似于: strSql=Insert Into users(username,intro,age,submit_date,marry) values(小王,一个 好孩子, 20,# 2005-3-1#,True) 其它情况依次类推。 如果很难判断到底结果是什么,可以在strSql=.语句下面加上 Response.Write strSql Response.End 这样,就会在屏幕上输出生成的最终结果。 如果还有多个字段还可以省略,依此类推即可。最重要的是最后连接而成的SQL字 符串是标准的正确的SQL字符串。 4 常见错误 在调试过程中,经常发生各种错误,不外乎是以下几类: (1)数据库文件权限错误 这种错误常常提示“需要一个可更新的查询”。准确地说,这类错误跟SQL字符串没有关系,需要你正确设置数据库文件的权限。 (2)拼写错误 这也是常见错误,纯属拼写错误。一是要细心,二是可以用4节中的方法来调试发现错误。 (3)字段名称或表的名称不合法 系统中有一些保留字,如user、date等是不能用来做字段名称或表的名称的。 另外要说明,千万不要用数字当作表或字段的名称,如111、222,尽管在Access中可以,但是在SQL中会出错误。第一个字母最好要用字母。 如果一定要使用,也有办法,只要在用到的SQL 字符串中给他们两边加上中括号,如: strsql=“Insert into users(username) values(张红)” strsql=“Insert into users(11111111) values(张红)” (4)漏掉必填字段 假如你规定了必填字段,而在SQL中又漏掉了该字段,就会发生错误。如我们规定username是主键,那么就不能省略该字段。如下面的SQL字符串就会出错: strsql=“Insert into users(age,intro) values(12,一个好孩子)” (5)文本型或备注型字段两边忘记加引号 仔细看看下面的字符串,其中少了四个单引号: strSql=Insert Into users(username,intro) values( & myusername & , & myintro & ) 将变量代入,那么结果可能如下: strSql=Insert Into users(username,intro) values(小王,一个好孩子) 文本字段值两边少了引号,所以发生错误。 再如下面的例子,也是错误的: strSql=Select * From users Where username= & myusername 当然还有很多类似的错误,如日期字段两边少了#,数字两边多了引号等等。 (6)错误的添加了空字符串 如果没有按照3中的方法处理数据库或程序,又省略了某个表单项,就会出现如下的错误可能: strSql=Insert Into users(username,intro,age,submit_date,marry) values( 小王,20,# 2004-4-1#,True) 其中intro对应的值是空字符串 (7)少了空格 SQL字符串中不同的项目之间一般会用空格隔开,其中有的空格可以省略,有的千万不可以省略。大家仔细看看下面的两条语句,想一想有无错误? strSql= Select * From users strSql=strSql & Where username= & myusername & 这两句的意思是执行完毕后连接成一个完整的SQL字符串,粗粗看起来没有任何错误,不过依次执行完毕,结果就变成了如下内容: strSql= Select * From usersWhere username= & myusername & 大家仔细看,其中的users和Where中间少了一个空格,所以连到一起了,自然会发生错误。所以如果要用这种多条语句的方式组合字符串,一定要注意这个问题,要在第二句的Where前面留一个空格,如下: strSql= Select * From users strSql=strSql & Where username= & myusername & (8)少了双引号 这一类错误应该也属于拼写错误,如下面: strSql=Insert Into users(username,intro) values( & myusername & , & myintro & ) 仔细看,values(后面少了一个双引号。这样就不知道到底哪些是字符串常数了。 (9)少了连接运算符 仔细看下面的,myusername 前少了一个&。 strSql=Insert Into users(username,intro) values( myusername & , & myintro

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论