再问一次ADO的问题!(今天第三次)(300分)

  • 主题发起人 yanliangjr9702
  • 开始时间
Y

yanliangjr9702

Unregistered / Unconfirmed
GUEST, unregistred user!
把我要问的问题再写一遍(第三遍):
我要向SQL SERVER中的一个叫TEST表中插入数据。
TEST表中有两个字段NAME,PASSWORD,均为CHAR类型,长度20,可以为空。
我在FORM上建两个EDIT,用来接收数据的NAME,PASSWORD。
ADO连接正常。
我用的SQL语句为:
adoquery1.Close;
adoquery1.sql.clear;
adoquery1.sql.add('insert into test (name,password) values ("'+edit1.text+'","'+edit2.text+'")');
adoquery1.ExecSQL;
到插入的时候出错。
如果EDIT1为空,则出现如下的错误提示:
错误信息 :project project1.exe raised exception class EOleException with
message "不能使用空白的对象或者列名,如果必要,请使用一个空格。"process stopped. use step or run to continue.
请大家注意,我的数据库的字段设置可以为空,而且没有关键字段。
如果我在EDIT中输入'ASFD'(随便输的字母),则出现如下错误提示:
错误信息 :project project1.exe raised exception class EOleException with
message "在上下文中不允许使用'ASFD'。此处只允许使用常量、表达式或变量。不允许
用列名“。process stopped. use step or run to continue.
为什么会这样!!??
以前用QUERY的时候这样的语句用的不下百次,为什么这里会不队?
是不是ADO的插入操作不是这么写的?请问各位大侠那里有下载DELPHI中ADO操作书籍的网站?
如果我要在SQL SERVER库中存入类似"0硘|9瑚o"的值,数据库字段用什么?
 
你用参数吧:

adoquery1.Close;
adoquery1.sql.clear;
adoquery1.sql.add('insert into test (name,password) values :)vname,:vpsd);
adoquery1.parameters.parambyname('vname').value:=edit1.text;
adoquery1.parameters.parambyname('vpsd').value:=edit2.text;
adoquery1.ExecSQL;
应没有问题了
 
adoquery1.sql.add('insert into test (name,password) values ("'+edit1.text+'","'+edit2.text+'")');
请试一下改为:
adoquery1.sql.add('insert into test (name,password) values ('''+Edit1.Text+''','''+edit2.text+''')');
 
我不同意dongberlin的观点,好像
adoquery1.sql.add('insert into test (name,password) values ("'+edit1.text+'","'+edit2.text+'")');
应改为:
adoquery1.sql.add('insert into test (name,password) values ('"'+Edit1.Text+'"','"'+edit2.text+'"')');
 
要求的SQL语句为:
insert into test (name,password) values ('edit1.text','edit2.text')
所以在Edit1.text前的单引号应用双引号表示
 
快来讨论啊,我想知道是对是错。
 
to chshanghai:
你的这个语句好象有点问题,我考过来执行时出错了。
 
to chshanghai:
谢谢你的答案,你的方法是可以的。
但是,我想知道为什么用我的方法不行?
 
这应该是你的SQL写得有错误吧.遇到这种问题首先确保你的SQL是否有错.设个断点到那儿
检查.看看这句SQL是否正常.你可以将你截取到的这一笔放到SQL环境下去执行,若不能用,
说明你的SQL有问题.一般来说不会出现SQL没错而Delphi报错的问题,除非你的Delphi中检查
与SQL的相冲突,过不了Delphi那一关.但只要提取的SQL这个字串没有问题,应该在Delphi中
就可通过.对于这种情况,Delphi是只检查字符串有没有错,然后就通过BDE进行数据库变动,
也通过BDE得到错误返回值.
另外,你的"最好改为两个''单引号.实在不行,就用Param参数先解决再说,实际上参数也是
一个好办法,而且不易出错,又比较方便.
你上面这一句改成下面这样应该就不会出错了.
adoquery1.sql.add('insert into test (name,password) values ('+''''+edit1.text+''''+','+''''+edit2.text+''''+')');
 
我的这个SQL的写法真的用过不下百次。
用QUERY一点问题都没有,这点我敢打保票。
可能是这样的写法操作PARDOX可以,操作SQL SERVER 不行。
 
NULL值(空值)和 '' 是有区别的。

你可以改成这样:
adoquery1.sql.add('insert into test (name,password) values :)vname,:vpsd);
if edit1.text <> '' then
adoquery1.parameters.parambyname('vname').value:=edit1.text
else
adoquery1.parameters.parambyname('vname').value:=null;

if edit2.text <> '' then
adoquery1.parameters.parambyname('vpsd').value:=edit2.text
else
adoquery1.parameters.parambyname('vpsd').value:=null;
adoquery1.ExecSQL;
 
一定要用'' 代替 ".
 
是不是双引号?如果是,改成两个单引号;如果不是。。。再说。
 
你想想PARDOX和Delphi的关系就知道为什么可以用了,在SQL Server中或是Oracle中要用NULL
 
》可能是这样的写法操作PARDOX可以,操作SQL SERVER 不行
绝对有可能。
 
确实如rester所言,在SQL Server中只能用两个单引号代替双引号,在Access中则都可以
 
为什么要这样插入数据!
用"存储过程"啦!
 
我觉得用参数好,不容易出错,也不用争论什么单双引号了。
 
to 双流星:
怎样的“储存过程”才是最好的?
 
用参数最规范
 
顶部