一个让非常奇怪的问题,如果那位高手能解决这个问题我请他吃饭(200分)

  • 主题发起人 主题发起人 dqlove
  • 开始时间 开始时间
D

dqlove

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在用的是ADOCOMMAND控件实现一条插如入语句
mysql:= 'INSERT INTO temp ( cust_key, data, price ) '+
'SELECT detail.Custkey, Sum(detail.Shipqty) AS data, Sum(detail.Linetotal) AS price '+
'FROM detail WHERE (((detail.Commandkey) Like "O01*") AND ((detail.Shipdate) Between #1/1/2001# And #10/10/2001#)) '
+ 'GROUP BY detail.Custkey';
ADOCommand1.CommandText:=mysql;
ADOCommand1.Execute;
当程序执行时不会有任何问题,但执行后我的表里没有插入任何记录,而这条语句在ACCESS里
使用时结果完全正确.(上面的这条语句就是从ACCESS里提取,而且我用的数据库也是ACCESS)

 
有没有POST?[:D]
 
mysql:= 'INSERT INTO temp ( cust_key, data, price ) '+
'SELECT detail.Custkey, Sum(detail.Shipqty) AS data, Sum(detail.Linetotal) AS price '+
'FROM detail WHERE detail.Commandkey Like "O01%" AND detail.Shipdate Between (1/1/2001) And (10/10/2001) '
+ 'GROUP BY detail.Custkey';
ADOCommand1.CommandText:=mysql;
ADOCommand1.Execute;改成这样
 
snjat你好
你的语句和我的一样啊
kingdeezj你好
不用POST也可以因为我对前几个表的操作类似均可执行没有问题
如果把这条语句的GROUP BY去掉就可以,但在ACCESS里没有问题
 
#1/1/2001# 这个#号是ACCESS中专用来表示日期的,而在SQL中不支持
 
可以考虑一下SELECT语句部分,LIKE通配符及日期的#号与SQL的兼容情况.
 
呵呵,因为SQL只有一个基本的框架放在那儿,各个厂家对自己的数据库定义和操作语言都
进行不同的扩展,造成不再标准化。建议你先在DELPHI SQL explorer 里选择相应的数据驱
动先调试一下,能正常执行再写进程序里。
 
日期格式换成 yyyy-mm-dd 用单引号引上看看
 
改動一下:
ShortDateFormat:='yyyy/mm/dd';
DateSeparator:='/';
Adocommand1.close;
mysql:= 'INSERT INTO temp ( cust_key, data, price ) '+
'SELECT detail.Custkey, Sum(detail.Shipqty) AS data, Sum(detail.Linetotal) AS price '+
'FROM detail WHERE (((detail.Commandkey) Like "O01*") AND ((detail.Shipdate) Between ''2001/01/01'' And ''2001/10/10'')) '
+ 'GROUP BY detail.Custkey';
ADOCommand1.CommandText:=mysql;
ADOCommand1.Execute;

即將日期字符串改為常規的'yyyy/mm/dd'格式。
 
SQL有多个标准,即使是一家公司的产品,其标准也是不一样的。
我这里倒不是要去提这句话怎么写,而是要说一些在编程时如果去写一个
好的SQL语句,以保证最大可能的情况,在多个数据库中不会出问题:
我使用过的数据库包括:
SQL Server, FoxPro, Access, Oracle, DB2
以下是一些总结:
1。不要用",而是用'
也许有些数据库中使用"与使用'是一样的,但是,并不总是如此。所以,在编程时
一定要使用'而不是",这样省得有麻烦。
2。各种数据表达选择标准格式
这里的日期#..#的表达法,不是通用的。而应该用通用的'2002-03-12'的形式。
3。不要用Select * 而是选择所有的字段。
Select * 与将所有的字段列出来,其效果是一样的,不过,
在小型的数据库上,容易造成表的死锁。
4。不要用一些比较不常见的语句去实现一些特殊的功能。
很多人喜欢用一条复杂的SQL语句去实现一些功能,其实这样来做,你是有成就感的,
不过,这样做的不好的地方,就是这些不常用的Clause,在不同厂家的实现上,可能会有
很小的差别。
所以,较好的办法是分开写,可以在客户端,如果为了效率,也可以放到服务器端
即使用存储过程。
 
执行showmessage(mysql)看一下
 
mysql有很多不支持的东西,比如嵌套之类
 
后退
顶部