精华内容
下载资源
问答
  • 在横行书写的文稿中,句号、问号、叹号、逗号、顿号、分号和冒号都占一个字位置,放在句末角。这七种符号通常不能放在一行开头,因为这些符号表示语气停顿,应该紧跟在一句话末尾。如果一行最后一...
    8cd4d48c6d84aff1eb17554dcdf48355.png

    01

    在方格稿纸上的书写格式

    1.在横行书写的文稿中,句号、问号、叹号、逗号、顿号、分号和冒号都占一个字的位置,放在句末的右下角。
    这七种符号通常不能放在一行的开头,因为这些符号表示语气的停顿,应该紧跟在一句话的末尾。
    如果一行的最后的一个格正好被文字占用了,那么这个标点就必须点标在紧靠文字的右下角。 
    2.引号、括号、书名号的前一半和后一半都各占一个字的位置,它们的前一半可以放在一行的开头,但不出现在一行的末尾,后一半不出现在一行的开头。 
    3.破折号和省略号都占两个字的位置,可以放在一行的开头,也可以放在一行的末尾,但不可以把一个符号分成两段。连接号和间隔号一般占一个字的位置。这四种符号的位置都写在行次中间。 
    4.着重号和专名号标在字的下边。

    02

    在长格稿纸上的书写格式  

    1.直行书写时,标点符号的格式是这样的:句号、问号、叹号、逗号、顿号、分号和冒号放在字的下方偏右,也占一个字的位置。 
    2.破折号、省略号、连接号和间隔号放在字下居中。 
    3.引号改用『』和「」。括号的两部分分别放在被标明词语的上下。 
    4.着重号标在字的右侧。专名号标在字的左侧。哪些符号不该放在一行的开头和末了,直行书写和横行书写的规则是一样的。

    709bcbe6d6ac50d4835d6519aad4fdce.png96e2ac5100b54e957997c7f1c7705f26.png7f3f5e4c3b15b1ae6a01b54a94b38cd0.png8a15c490cd0e0a6c0d1856f4dbb4afb9.png8ab9ef7cd380d0cbc73478ba9a68d143.png8936dcabc5fa42541d887f65da4897b3.png3f39754fd9a5fead728758740fd7e392.png0189b61f1060f006275515f66611a484.png

    沧州市东方学校中小学全科辅导

    中心校区:浮阳大道中路新闻大厦五楼

    电话:2019088   15303276196

    西校区:永安南大道香堤荣府S1三楼

    电话:2035090   13102705090

    24e568ecfcdba2f18167b6af71c49986.png

    扫码关注我们

    沧州市东方学校

    陪你一路前行

    展开全文
  • 本文就从头开始系统讲述一下如何书写正确的SQL字符串,并给出一个比较有效调试方法。 1 双引号、单引号和连接运算符& 首先声明:这里说符号是英文状态下的符号,也可以说是语法中用到符号。 因为在书写SQL...

    在学习ASP.NET的过程中,很多同学在书写SQL字符串时都感到比较困难,总是发生各种各样的错误,并且对其中的双引号、单引号和连接运算符&感到非常难以掌握。本文就从头开始系统讲述一下如何书写正确的SQL字符串,并给出一个比较有效的调试方法。
    1 双引号、单引号和连接运算符&

    首先声明:这里说的符号是英文状态下的符号,也可以说是语法中用到的符号。
    因为在书写SQL语句时,最常见的困惑就是对其中的双引号、单引号和连接运算符&的理解。下面就从基础讲起。
    (1)关于双引号

    在ASP中,用到字符串常数时两边要加上双引号 " ,表示其中是一个字符串,如下面都是字符串常数:
    "abcdefg"
    "伟大的祖国"
    "101"
    "2003-10-5"
    大家可能会想,101是一个数字啊,2003-10-5是一个日期啊。但是,只要在两边加上了双引号,那么它就是一个字符串,不管其中的内容是数字还是英文字母还是中文。
    (2)关于单引号

    有同学可能会想了,你现在用双引号表示其中是一个字符串,但是假如在字符串中间也用到了双引号,那么岂不就会出现这样的情况:
    "ab"cde"fg"
    这样显然就会引起别人的误解,到底第一个双引号和第几个双引号配套呢?因为ASP规定,当出现双引号嵌套时,可以将内层的双引号转变为单引号 ' 或者转变两个连续的双引号 ""。按照该规定,上面的字符串应该改写为如下形式:
    "ab'cde'fg"
    "ab""cde""fg"
    说明:

    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. 有时候,表达式中可能有更多的连接运算符。运算过程也是一样的,从左到右依次进行即可。
    上面的例子比较简单,如果中间也有单引号,可能会变得复杂些。不过你只要记住,不管其中有无单引号,一个字符串两边的双引号之间的内容都是这个字符串的内容,连接时都要取出来,你只要将其中的单引号当成普通的字符即可。如下面的例子:
    "ab'cd'efg" & "hi'jk'lmn"
    执行连接运算后,结果如下:
    "ab'cd'efghi'jk'lmn"
    至于具体原理仿照上面的讲解即可。将第一个字符串中的内容ab'cd'efg和第二个字符串中的内容hi'jk'lmn取出来连到一起,变成ab'cd'efghi'jk'lmn,然后在两边加上双引号,表示这是一个字符串常数"ab'cd'efghi'jk'lmn"。
    好,现在相信大家对于双引号、单引号和连接运算符的概念已经比较清楚了,可能还有的同学会进一步提出,上面的例子("abcd" & "efg")好像意义不大啊,这个式子直接写成"abcdefg",何苦要将其分成两部分,中间再加个连接符,这不多此一举吗?
    这个想法其实是对的,在实际使用中,尽管有时也用&连接两个字符串常数,但是更多的时候是将一个字符串常数和一个字符串变量连接到一起,或者是将两个字符串变量连接到一起。如下:
    "ab'cd'efg" & strTemp
    大家可以注意到,上面的表达式中,第一项是一个字符串常数,第二项是一个字符串变量。那么它们是怎么执行连接运算呢?其实很简单:
    假如strTemp="hi'jk'lmn",那么将其代入到上面表达式,那么上面的表达式就变成了
    "ab'cd'efg" & "hi'jk'lmn"
    后面的运算原理和前面的讲述也就一样了,最后结果为"ab'cd'efghi'jk'lmn"
    还有人喜欢写成这样:
    strSql="ab'cd'efg"
    strSql=strSql & strTemp
    这是两条语句,执行完毕后其实和上面的结果是一样的。它的过程是:在第一句中将"ab'cd'efg"保存到变量strSql中,在第二句中从变量中取出字符串,再和字符串变量strTemp连接到一起,重新保存到变量strSql中。假如strTemp="hi'jk'lmn",那么执行完毕后变量strSql中的内容为"ab'cd'efghi'jk'lmn"。
    (4)一个常犯的错误:将字符串变量写到了字符串常数中

    这里要特别强调一个常犯的错误,就是将字符串变量直接写到了字符串常数中,如对于上面的表达式,个别同学写成了
    "ab'cd'efgstrTemp"
    他认为这就是将字符串常数"ab'cd'efg"和字符串变量strTemp连接到一起了。可是,除了他自己,别人谁能看出strTemp是一个字符串变量呢?
    其实在这个错误的写法中,strTemp这几个字符和前面的ab'cd'efg字符没有任何本质区别。系统不会将其当作字符串变量,而只会把它们看作是这个大字符串的一部分内容。或者说,这就是一个字符串常数,其中的内容是ab'cd'efgstrTemp。
    因此,大家一定要记住,字符串变量不能直接写到字符串常数中。在希望将一个字符串常数和一个字符串变量连接到一起时,一定要使用&(或+)将它们连接到一起。如:
    "ab'cd'efg" & strTemp
    当然,如果希望将两个字符串变量连接到一起,也是一样的,如:
    strTemp1 & strTemp2
    还有,有时会将几个字符串常数和几个字符串变量连接到一起,如:
    "ab'cd'efg" & strTemp & "hi'jk'lmn"
    它们的运算原理和过程都一样,将字符串变量的内容代入到表达式中,然后执行连接运算。
    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字符串中。
    下面依次讲解:
    3.1 修改数据库的方法

    打开数据库,进入users表的设计界面,选择字段intro,在下方“允许空字符串”栏选择“是”即可。修改数据库后,程序部分基本不用大修改。
    3.2修改程序的方法

    修改数据库固然简单,但是有时候不方便修改数据库,那么就只能修改程序了。假如客户填写了简介,就让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 & "')"
    5 调试方法

    有人可能会说,上面的常见错误我确实经常发生,我也知道,可是很难发现啊,这里就> 告诉大家如何来调试,具体步骤如下:
    (1)首先确认是否是SQL字符串的错误

    错误有很多种,可能有很多原因,不一定是SQL字符串的原因。这就要根据错误提示信息来判断。
    另外,要说明的是,如果是SQL字符串的原因,错误不一定发生在strSql=..这一句,而是在db.Execute(strSql)才发生错误。
    (2)仔细检查SQL字符串

    如果确是SQL字符串的原因,先仔细从下面几方面检查:
    1. 有无明显的拼写错误?
    2. 有无明显的少双引号、&、空格的情况?
    3. 有无使用了非法的字段名称?
    4. 文本型字段值两边是否少了引号?
    5. 是否非法添加了空字符串?
     
    (3)将SQL字符串输出到页面上

    如果还是看不出错误,可以在strSql=..后暂时添加如下的语句,就会中断程序,并将SQL字符串输出到页面上,大家可以更加仔细的查看SQL字符串的最后结果:
    strSql="Insert Into users(username,intro,age,submit_date,marry) values('" & myusername & "','" & myintro & "'," & myage & ",#" & mysubmit_date & "#," & mymarry & ")"
    Response.Write(strSql)
    Response.End
    Db.Execute(strSql)
    因为这样输出的已经是完成的最终的SQL字符串,所以比较方便的可以看出错误。尤其是空字符串、少空格等错误。
    当然,这个方法针对可以输出的SQL字符串,也就是说,尽管SQL字符串无法正确执行,但是本身仍然是一个正确的字符串,只不过是不符合SQL要求的字符串。而如果少了引号和连接运算符,这一步都无法正确执行。也就是根本无法输出字符串。
    (4)将SQL字符串复制到Access的查询中去执行

    如果在(3)步看页面上的SQL字符串,仍然无法看出错误。那么可以打开Access数据库,在其中添加一个查询,并从页面上复制这个SQL字符串到查询中去执行,就很得到比较明确的错误提示信息。具体步骤如下:
    在Access主窗口左侧选择【查询】按钮,就可以显示对话框。此时大家不必自己添加表,直接单击【关闭】按钮,然后在主窗口中依次选择【视图】 →【SQL视图】菜单命令,就会出现如图5-3所示的SQL视图对话框。然后单击【保存】按钮即可,这里命名为select1。在图5-3中单击【运行】按钮就可以立即显示查询结果。
    此时,如果有错误的表或字段名称,就会立即弹出一个对话框,大家可以看出来。如果有其他错误,也会给出提示信息。
    如果一切无误,就会正确执行。不过要说明的是在Access中和ASP中极其个别情况下略有不同,在Access中可以,在ASP中就不行。
    6 对SQL Server数据库的说明

    以上是针对Access数据库说的,如果换成SQL数据库,只要注意两点:
    (1) 日期字段值两边不要用#号,用单引号。
    (2) 对于SQL数据库,要复制到“查询分析器”中执行。

    展开全文
  • 在横行书写的文稿中,句号、问号、叹号、逗号、顿号、分号和冒号都占一个字位置,放在句末角。这七种符号通常不能放在一行开头,因为这些符号表示语气停顿,应该紧跟在一句话末尾。如果一行最后一...
    f522de12ed6396a7bc0c5e36ed84da80.gif

    01

    一、在方格稿纸上的书写格式

    22c005e6e9cae44356c7fc6d1beca7f9.png

    1.在横行书写的文稿中,句号、问号、叹号、逗号、顿号、分号和冒号都占一个字的位置,放在句末的右下角。

    这七种符号通常不能放在一行的开头,因为这些符号表示语气的停顿,应该紧跟在一句话的末尾。

    如果一行的最后的一个格正好被文字占用了,那么这个标点就必须点标在紧靠文字的右下角。

    2.引号、括号、书名号的前一半和后一半都各占一个字的位置,它们的前一半可以放在一行的开头,但不出现在一行的末尾,后一半不出现在一行的开头。

    3.破折号和省略号都占两个字的位置,可以放在一行的开头,也可以放在一行的末尾,但不可以把一个符号分成两段。连接号和间隔号一般占一个字的位置。这四种符号的位置都写在行次中间。

    4.着重号和专名号标在字的下边。

    02

    二、在长格稿纸上的书写格式

    1.直行书写时,标点符号的格式是这样的:句号、问号、叹号、逗号、顿号、分号和冒号放在字的下方偏右,也占一个字的位置。

    2.破折号、省略号、连接号和间隔号放在字下居中

    3.引号改用『』和「」。括号的两部分分别放在被标明词语的上下。

    4.着重号标在字的右侧。专名号标在字的左侧。哪些符号不该放在一行的开头和末了,直行书写和横行书写的规则是一样的。

    03

    标点符号的书写格式

    c57233ba5e4e17eb9f19106603830329.png
    489c95e47f0b897236bf5d955837ac1e.png
    3d1ebe91e904c0867f90efa22f8de742.png
    b3717777bccf3d2897cb69dfb1a06e59.png
    d5a7782795fd8e39b549470b777b24e4.png
    60c5d017bb6013404e4f0b4ae6c24624.png
    8be4f3dc292bc1d93b047d01a171b123.png
    展开全文
  • 在ASP.NET中如何正确书写SQL字符串 在学习ASP.NET过程中,很多同学在书写SQL字符串时都感到比较困难,总是发生各种各样错误,并且对其中引号、单引号和连接运算符&amp;感到非常难以掌握。本文就从头...

    在ASP.NET中如何正确书写SQL字符串

    在学习ASP.NET的过程中,很多同学在书写SQL字符串时都感到比较困难,总是发生各种各样的错误,并且对其中的双引号、单引号和连接运算符&感到非常难以掌握。本文就从头开始系统讲述一下如何书写正确的SQL字符串,并给出一个比较有效的调试方法。

    1 双引号、单引号和连接运算符&

    首先声明:这里说的符号是英文状态下的符号,也可以说是语法中用到的符号。

    因为在书写SQL语句时,最常见的困惑就是对其中的双引号、单引号和连接运算符&的理解。下面就从基础讲起。

    (1)关于双引号

    在ASP中,用到字符串常数时两边要加上双引号 " ,表示其中是一个字符串,如下面都是字符串常数:

    "abcdefg"

    "伟大的祖国"

    "101"

    "2003-10-5"

    大家可能会想,101是一个数字啊,2003-10-5是一个日期啊。但是,只要在两边加上了双引号,那么它就是一个字符串,不管其中的内容是数字还是英文字母还是中文。

    (2)关于单引号

    有同学可能会想了,你现在用双引号表示其中是一个字符串,但是假如在字符串中间也用到了双引号,那么岂不就会出现这样的情况:

    "ab"cde"fg"

    这样显然就会引起别人的误解,到底第一个双引号和第几个双引号配套呢?因为ASP规定,当出现双引号嵌套时,可以将内层的双引号转变为单引号 ' 或者转变两个连续的双引号 ""。按照该规定,上面的字符串应该改写为如下形式:

    "ab'cde'fg"

    "ab""cde""fg"

    说明:

    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. 有时候,表达式中可能有更多的连接运算符。运算过程也是一样的,从左到右依次进行即可。

    上面的例子比较简单,如果中间也有单引号,可能会变得复杂些。不过你只要记住,不管其中有无单引号,一个字符串两边的双引号之间的内容都是这个字符串的内容,连接时都要取出来,你只要将其中的单引号当成普通的字符即可。如下面的例子:

    "ab'cd'efg" & "hi'jk'lmn"

    执行连接运算后,结果如下:

    "ab'cd'efghi'jk'lmn"

    至于具体原理仿照上面的讲解即可。将第一个字符串中的内容ab'cd'efg和第二个字符串中的内容hi'jk'lmn取出来连到一起,变成ab'cd'efghi'jk'lmn,然后在两边加上双引号,表示这是一个字符串常数"ab'cd'efghi'jk'lmn"。

    好,现在相信大家对于双引号、单引号和连接运算符的概念已经比较清楚了,可能还有的同学会进一步提出,上面的例子("abcd" & "efg")好像意义不大啊,这个式子直接写成"abcdefg",何苦要将其分成两部分,中间再加个连接符,这不多此一举吗?

    这个想法其实是对的,在实际使用中,尽管有时也用&连接两个字符串常数,但是更多的时候是将一个字符串常数和一个字符串变量连接到一起,或者是将两个字符串变量连接到一起。如下:

    "ab'cd'efg" & strTemp

    大家可以注意到,上面的表达式中,第一项是一个字符串常数,第二项是一个字符串变量。那么它们是怎么执行连接运算呢?其实很简单:

    假如strTemp="hi'jk'lmn",那么将其代入到上面表达式,那么上面的表达式就变成了

    "ab'cd'efg" & "hi'jk'lmn"

    后面的运算原理和前面的讲述也就一样了,最后结果为"ab'cd'efghi'jk'lmn"

    还有人喜欢写成这样:

    strSql="ab'cd'efg"

    strSql=strSql & strTemp

    这是两条语句,执行完毕后其实和上面的结果是一样的。它的过程是:在第一句中将"ab'cd'efg"保存到变量strSql中,在第二句中从变量 中取出字符串,再和字符串变量strTemp连接到一起,重新保存到变量strSql中。假如strTemp="hi'jk'lmn",那么执行完毕后变 量strSql中的内容为"ab'cd'efghi'jk'lmn"。

    (4)一个常犯的错误:将字符串变量写到了字符串常数中

    这里要特别强调一个常犯的错误,就是将字符串变量直接写到了字符串常数中,如对于上面的表达式,个别同学写成了

    "ab'cd'efgstrTemp"

    他认为这就是将字符串常数"ab'cd'efg"和字符串变量strTemp连接到一起了。可是,除了他自己,别人谁能看出strTemp是一个字符串变量呢?

    其实在这个错误的写法中,strTemp这几个字符和前面的ab'cd'efg字符没有任何本质区别。系统不会将其当作字符串变量,而只会把它们看作是这个大字符串的一部分内容。或者说,这就是一个字符串常数,其中的内容是ab'cd'efgstrTemp。

    因此,大家一定要记住,字符串变量不能直接写到字符串常数中。在希望将一个字符串常数和一个字符串变量连接到一起时,一定要使用&(或+)将它们连接到一起。如:

    "ab'cd'efg" & strTemp

    当然,如果希望将两个字符串变量连接到一起,也是一样的,如:

    strTemp1 & strTemp2

    还有,有时会将几个字符串常数和几个字符串变量连接到一起,如:

    "ab'cd'efg" & strTemp & "hi'jk'lmn"

    它们的运算原理和过程都一样,将字符串变量的内容代入到表达式中,然后执行连接运算。

    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字符串中。

    下面依次讲解:

    3.1 修改数据库的方法

    打开数据库,进入users表的设计界面,选择字段intro,在下方“允许空字符串”栏选择“是”即可。修改数据库后,程序部分基本不用大修改。

    3.2修改程序的方法

    修改数据库固然简单,但是有时候不方便修改数据库,那么就只能修改程序了。假如客户填写了简介,就让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 & "')"

    5 调试方法

    有人可能会说,上面的常见错误我确实经常发生,我也知道,可是很难发现啊,这里就> 告诉大家如何来调试,具体步骤如下:

    (1)首先确认是否是SQL字符串的错误

    错误有很多种,可能有很多原因,不一定是SQL字符串的原因。这就要根据错误提示信息来判断。

    另外,要说明的是,如果是SQL字符串的原因,错误不一定发生在strSql=..这一句,而是在db.Execute(strSql)才发生错误。

    (2)仔细检查SQL字符串

    如果确是SQL字符串的原因,先仔细从下面几方面检查:

    1. 有无明显的拼写错误?

    2. 有无明显的少双引号、&、空格的情况?

    3. 有无使用了非法的字段名称?

    4. 文本型字段值两边是否少了引号?

    5. 是否非法添加了空字符串?

     

    (3)将SQL字符串输出到页面上

    如果还是看不出错误,可以在strSql=..后暂时添加如下的语句,就会中断程序,并将SQL字符串输出到页面上,大家可以更加仔细的查看SQL字符串的最后结果:

    strSql="Insert Into users(username,intro,age,submit_date,marry) values('" & myusername & "','" & myintro & "'," & myage & ",#" & mysubmit_date & "#," & mymarry & ")"

    Response.Write(strSql)

    Response.End

    Db.Execute(strSql)

    因为这样输出的已经是完成的最终的SQL字符串,所以比较方便的可以看出错误。尤其是空字符串、少空格等错误。

    当然,这个方法针对可以输出的SQL字符串,也就是说,尽管SQL字符串无法正确执行,但是本身仍然是一个正确的字符串,只不过是不符合SQL要求的字符串。而如果少了引号和连接运算符,这一步都无法正确执行。也就是根本无法输出字符串。

    (4)将SQL字符串复制到Access的查询中去执行

    如果在(3)步看页面上的SQL字符串,仍然无法看出错误。那么可以打开Access数据库,在其中添加一个查询,并从页面上复制这个SQL字符串到查询中去执行,就很得到比较明确的错误提示信息。具体步骤如下:

    在Access主窗口左侧选择【查询】按钮,就可以显示对话框。此时大家不必自己添加表,直接单击【关闭】按钮,然后在主窗口中依次选择【视图】 →【SQL视图】菜单命令,就会出现如图5-3所示的SQL视图对话框。然后单击【保存】按钮即可,这里命名为select1。在图5-3中单击【运行】 按钮就可以立即显示查询结果。

    此时,如果有错误的表或字段名称,就会立即弹出一个对话框,大家可以看出来。如果有其他错误,也会给出提示信息。

    如果一切无误,就会正确执行。不过要说明的是在Access中和ASP中极其个别情况下略有不同,在Access中可以,在ASP中就不行。

    6 对SQL Server数据库的说明

    以上是针对Access数据库说的,如果换成SQL数据库,只要注意两点:

    (1) 日期字段值两边不要用#号,用单引号。

    (2) 对于SQL数据库,要复制到“查询分析器”中执行。

    展开全文
  • Oraclet中触发器

    2011-06-04 21:58:17
    触发事件:即在何种情况触发TRIGGER; 例如:INSERT, UPDATE, DELETE。 触发时间:即该TRIGGER 是在触发事件发生之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该TRIGGER 操作顺序。  触发器本身...
  • 你必须知道495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    *1.26 main的正确定义是什么?voidmain正确吗? 1.27 我的编译器总在报函数原型不匹配的错误,可我觉得没什么问题。这是为什么? 1.28 文件中的第一个声明就报出奇怪的语法错误,可我看没什么问题。这是为什么...
  • SQL语句编写注意点

    2016-04-18 23:00:28
    1、使用英文模式下的 “`” 注意此处不是单引号 正确格式: select`user_id`,`name`,`desc`from`prv_user` 错误格式: select'user_id','name','desc'from'prv_user'2、SQL语句书写,在SQL语句的引号前后留有空格,...
  • 《你必须知道495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    *1.26 main的正确定义是什么?void main正确吗? 15 1.27 我的编译器总在报函数原型不匹配的错误,可我觉得没什么问题。这是为什么? 15 1.28 文件中的第一个声明就报出奇怪的语法错误,可我看没什么问题。这是...
  • *1.26 main的正确定义是什么?void main正确吗? 15 1.27 我的编译器总在报函数原型不匹配的错误,可我觉得没什么问题。这是为什么? 15 1.28 文件中的第一个声明就报出奇怪的语法错误,可我看没什么问题。这是...
  • 2、使用正确的文档声明 3、元素名均使用小写,这样看起来更整洁,也更容易书写 4、所有元素都应当闭合 5、如果希望XML软件访问你页面,尽量将空元素也闭合 meta charset="utf-8" /> 6、属性名应当...
  • 如上例"A-G 123 -B 456",追加双引号后可书写为"A'-G 123' '-B 456'") 0.10 beta 06.9.25 正式更名为NT Locale Emulator Advance 增加具有图形界面外壳程序 增加跨进程跟踪功能 0.05 beta 06.9.24 修正了...
  • 该文件用来测试和展示书写README各种markdown语法。GitHubmarkdown语法在标准markdown语法基础上做了扩充,称之为GitHub Flavored Markdown。简称GFM,GFM在GitHub上有广泛应用,除了README文件外,issues和...
  • 该文件用来测试和展示书写README各种markdown语法。GitHubmarkdown语法在标准markdown语法基础上做了扩充,称之为GitHub Flavored Markdown。简称GFM,GFM在GitHub上有广泛应用,除了README文件外,issues和...
  • ExtAspNet_v2.3.2_dll

    2010-09-29 14:37:08
    -修正了弹出菜单位置在Firefox正确的BUG(feedback:eroach)。 -为TriggerBox和TwinTriggerBox增加EnableEdit属性。 -使用Hidden来显示隐藏ExtAspNet控件,而不是使用Visible属性(Visible目前设置为只读属性...
  • -修正了弹出菜单位置在Firefox正确的BUG(feedback:eroach)。 -为TriggerBox和TwinTriggerBox增加EnableEdit属性。 -使用Hidden来显示隐藏ExtAspNet控件,而不是使用Visible属性(Visible目前设置为只读属性...
  • DIVCSS布局大全笔记

    2010-06-12 15:34:00
    一、XHTMLcss+div布局总结 1、为页面添加正确的DOCTYPE,建议使用严格型; 2、设定一个名字空间,; 3、声明编码语言,建议用utf-8; 4、用小写字母书写所有标签; 5、为图片添加alt属性; 6、给所有属性...
  • 表列出了Turbo C中各类整型量所分配内存字节数及数表示范围。 类型说明符 数范围 分配字节数 int -32768~32767 ■■ short int -32768~32767 ■■ signed int -32768~32767 ■■ unsigned int 0~65535 ■...
  • 在这里就混淆了字符常量与字符串常量,字符常量是由一对单引号括起来单个字符,字符串常量是一对双引号括起来字符序列。C规定以“\”作字符串结束标志,它是由系统自动加上,所以字符串“a”实际上包含两个...
  • 用typedef定义数组、指针、结构等类型将带来很大方便,不仅使程序书写简单而且使意义更为明确,因而增强了可读性。例如: typedef char NAME[20]; 表示NAME是字符数组类型,数组长度为20。 然后可用NAME 说明变量...
  • Java题目求完整解答

    2020-12-22 10:16:40
    margin-right:0pt">则关于i的正确说法是____D____。 ; margin-right:0pt">  ; margin-right:0pt">A.i能被同一个包中的其他类或对象访问 ; margin-right:0pt">B.i不能被同一个类中所有对象访问 ; margin-right:...

空空如也

空空如也

1 2
收藏数 24
精华内容 9
关键字:

下引号的正确书写