ACCESS中使用SQL语句的一个奇怪的问题
写的SQL语句中有用到round函数,Access中使用新建查询语句,可以执行。后来相同的语句在vb中使用Microsoft.Jet.OLEDB.4.0的方式连接数据库执行,却提示出错:error为:
“表达式中 'round' 函数未定义。”请问是不是程序连接数据库时有什么替代“round”函数。这个问题有点类似 在access中符号“%”不能用,“*”却能用,在模糊查询时。
问题点数:100、回复次数:12Top
1 楼wangtiecheng(不知不为过,不学就是错!)回复于 2006-11-21 12:41:36 得分 0
参考版主文章:为什么老出现XXX函数未定义错误?
http://access911.net/fixhtm/77FAB51E14DC.htm?tt=为什么老出现XXX函数未定义错误?《函数》Top
2 楼wangtiecheng(不知不为过,不学就是错!)回复于 2006-11-21 12:46:20 得分 0
Access使用的是Jet-SQL。
JET SQL 帮助(jet4 access2000)下载地址
http://www.access911.net/index.asp?board=8&recordid=75FAB71E&tt=
Top
3 楼wangtiecheng(不知不为过,不学就是错!)回复于 2006-11-21 12:47:08 得分 0
看看jet-SQL的保留字:
A
ABSOLUTE ANY
ADD ARE
ADMINDB AS
ALL ASC
Alphanumeric — See TEXT ASSERTION
ALTER AUTHORIZATION
ALTER TABLE AUTOINCREMENT — See COUNTER
And Avg
AS
B-C
BEGIN COLLATION
Between COLUMN
BINARY COMMIT
BIT COMP, COMPRESSION
BIT_LENGTH CONNECT
BOOLEAN — See BIT CONNECTION
BOTH CONSTRAINT, CONSTRAINTS
BY CONTAINER
BYTE CONTAINS
CASCADE CONVERT
CATALOG Count
CHAR, CHARACTER — See TEXT COUNTER
CHAR_LENGTH CREATE
CHARACTER_LENGTH CURRENCY
CHECK CURRENT_DATE
CLOSE CURRENT_TIME
CLUSTERED CURRENT_TIMESTAMP
COALESCE CURRENT_USER
COLLATE CURSOR
D
DATABASE DISALLOW
DATE — See DATETIME DISCONNECT
DATETIME DISTINCT
DAY DISTINCTROW
DEC, DECIMAL DOMAIN
DECLARE DOUBLE
DELETE DROP
DESC
E-H
Eqv FOREIGN
EXCLUSIVECONNECT FROM
EXEC, EXECUTE FROM 子句
EXISTS GENERAL — See LONGBINARY
EXTRACT GRANT
FALSE GROUP
FETCH GUID
FIRST HAVING
FLOAT,FLOAT8 — 参阅 DOUBLE HOUR
FLOAT4 — See SINGLE
I
IDENTITY INPUT
IEEEDOUBLE — See DOUBLE INSENSITIVE
IEEESINGLE — See SINGLE INSERT
IGNORE INSERT INTO
IMAGE INT,INTEGER,INTEGER4 — 参阅 LONG
Imp INTEGER1 — 参阅 BYTE
In INTEGER2 — 参阅 SHORT
IN INTERVAL
INDEX INTO
INDEXCREATEDB Is
INNER ISOLATION
J-M
JOIN LONGTEXT
KEY LOWER
LANGUAGE MATCH
LAST Max
LEFT MEMO — 参阅 LONGTEXT
Level* Min
Like MINUTE
LOGICAL,LOGICAL1 — 参阅 BIT Mod
LONG MONEY — 参阅 CURRENCY
LONGBINARY MONTH
LONGCHAR
N-P
NATIONAL Outer*
NCHAR OUTPUT
NONCLUSTERED OWNERACCESS
Not PAD
NTEXT PARAMETERS
NULL PARTIAL
NUMBER — See DOUBLE PASSWORD
NUMERIC — See DECIMAL PERCENT
NVARCHAR PIVOT
OCTET_LENGTH POSITION
OLEOBJECT — See LONGBINARY PRECISION
ON PREPARE
OPEN PRIMARY
OPTION PRIVILEGES
Or PROC, PROCEDURE
ORDER PUBLIC
Q-S
REAL — See SINGLE SMALLDATETIME
REFERENCES SMALLINT — See SHORT
RESTRICT SMALLMONEY
REVOKE SOME
RIGHT SPACE
ROLLBACK SQL
SCHEMA SQLCODE, SQLERROR, SQLSTATE
SECOND StDev
SELECT StDevP
SELECTSCHEMA STRING — See TEXT
SELECTSECURITY SUBSTRING
SET Sum
SHORT SYSNAME
SINGLE SYSTEM_USER
SIZE
T-Z
TABLE UPDATEOWNER
TableID* UPDATESECURITY
TEMPORARY UPPER
TEXT USAGE
TIME — See DATETIME USER
TIMESTAMP USING
TIMEZONE_HOUR VALUE
TIMEZONE_MINUTE VALUES
TINYINT Var
TO VARBINARY — 参阅 BINARY
TOP VARCHAR — 参阅 TEXT
TRAILING VarP
TRANSACTION VARYING
TRANSFORM VIEW
TRANSLATE WHEN
TRANSLATION WHENEVER
TRIM WHERE
TRUE WITH
UNION WORK
UNIQUE Xor
UNIQUEIDENTIFIER YEAR
UNKNOWN YESNO — See BIT
UPDATE ZONE
UPDATEIDENTITY
Top
4 楼wangtiecheng(不知不为过,不学就是错!)回复于 2006-11-21 12:47:33 得分 0
Round()是Access的函数,不是jet-SQL函数。Top
5 楼wwwwb()回复于 2006-11-21 12:49:22 得分 0
ROUND是VBA函数,不是JET SQL 函数Top
6 楼wwwwb()回复于 2006-11-22 15:46:46 得分 0
这个问题有点类似 在access中符号“%”不能用,“*”却能用,在模糊查询时。
ado:*
access:*
用SELECT format(1.245,'####.##')代替
Top
7 楼wangtiecheng(不知不为过,不学就是错!)回复于 2006-11-22 17:48:28 得分 0
如果要在SQL中处理,就用format(1.23456,'###0.####')。
如果允许,也可以在前台表格控件中设置格式。
Top
8 楼wwwwb()回复于 2006-11-22 17:50:42 得分 0
这个问题有点类似 在access中符号“%”不能用,“*”却能用,在模糊查询时。
ado:%
access:*
用SELECT format(1.245,'####.##')代替
Top
9 楼changechange(http://access911.net 是我的个人网站,欢迎光临)回复于 2006-11-23 11:38:29 得分 0
为什么老出现XXX函数未定义错误?
作者:cg1 摘自:access911.net 编辑:cg1 更新日期:2003-7-16 浏览人次:2133
专题地址:
http://access911.net/?kbid;77FAB51E14DC
简述:
为什么老出现XXX函数未定义错误?《函数》
阅读前需掌握:
难度等级:
等级未评定
问题:
1、为什么以前运行正常的Access数据库,搬到另一台电脑上老出现XXXX函数未定义错误?
2、为什么我在Access中调试通过的sql语句,在VB/ASP/JSP/PHP/VB.NET/SQL SERVER中调用却老是出现XXX函数未定义错误?
3、在ACCESS中的模块中自定义了一个getV函数,在ACCESS查询中执行SQL语句
select getV(5) from T
这条语句能执行,并且能得到数据,
但是在Adodc1中
Adodc1.RecordSource ="select getV(5) from T "
Adodc1.Refresh
结果出错了,显示的错误为“getV未定义函数”。
回答:
1、转到VBE界面,菜单 工具 -> 引用 中看一下有没有丢失的引用,如果有,重新引用一下即可
2、Access中执行 jet sql 语句时使用的很多函数是Access自带的函数,只允许使用在Access界面下,一旦你使用了其他软件做界面,那么很多本来在 access+jet sql环境中能够运行的函数将成为错误根源。
3、Access中编写的自定义函数必须由ACCESS环境支持,在其他环境中根本不能使用。
特别注意:许多在VB代码中可以运行的函数并不一定能嵌入到jet sql语句中
以下列出 jet sql 中的资料供参考:
ODBC 标量函数
Microsoft® Jet SQL 支持使用由 ODBC 为标量函数定义的语法。例如这一查询:
SELECT DAILYCLOSE, DAILYCHANGE FROM DAILYQUOTE
WHERE {fn ABS(DAILYCHANGE)} > 5
凡是一种股票价格变化的绝对值大于 5 的列会返回。
ODBC 定义的标量函数的子集受支持。下表列出了受支持的函数。
关于使函数包含于 SQL 语句的变元的描述和逸出语法的详尽解释,请看 ODBC文献。
字符串函数
ASCII LENGTH RTRIM
CHAR LOCATE SPACE
CONCAT LTRIM SUBSTRING
LCASE RIGHT UCASE
LEFT
数字函数
ABS FLOOR SIN
ATAN LOG SQRT
CEILING POWER TAN
COS RAND MOD
EXP SIGN
时间和日期函数
CURDATE DAYOFYEAR MONTH
CURTIME YEAR WEEK
NOW HOUR QUARTER
DAYOFMONTH MINUTE MONTHNAME
DAYOFWEEK SECOND DAYNAME
数据类型变换
CONVERT 字符串文字能被转换成下列数据类型:SQL_FLOAT, SQL_DOUBLE, SQL_NUMERIC, SQL_INTEGER, SQL_REAL, SQL_SMALLINT, SQL_VARCHAR和 SQL_DATETIME.
请参考:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odappepr_3.asp
最终的解决方案是当你在 VB / C# 等语言中取出数据赋值到变量后再对变量进行函数操作
access911.net 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接
Top
10 楼changechange(http://access911.net 是我的个人网站,欢迎光临)回复于 2006-11-23 11:39:19 得分 0
如果你只是凑巧字段名为 ROUND ,请用
select [round] from [table]
来查询。
Top
11 楼changechange(http://access911.net 是我的个人网站,欢迎光临)回复于 2006-11-23 11:40:21 得分 0
新手来看:LIKE 语句到底如何组织?*和%该用哪个?
作者:cg1 摘自:access911.net 编辑:cg1 更新日期:2004-10-8 浏览人次:1168
专题地址:
http://access911.net/?kbid;72FAB31E13DCEAF3
简述:
新手来看:LIKE 语句到底如何组织?*和%该用哪个?《查询》
阅读前需掌握:
熟练掌握 VBA 编程;熟练掌握 JET SQL 语句
难度等级:
40
问题:
LIKE 语句到底如何组织?*和%该用哪个?
用like 不行,如何进行糊模查询?
回答:
在回答上述问题时你必须弄清楚你的环境
1、在纯 ACCESS 环境中,并且没有开启 ANSI SQL 兼容选项的情况下:
(菜单 -> 工具 -> 选项 -> 高级 -> SQL SERVER 兼容语法(ANSI 92) 中可以看到你是否开启了 ANSI 兼容,如果开启了,请使用 % 而不是 *)
在这种环境下仍然至少要分成3种情况
1.1、在 VBA 代码中组织 JET SQL 语句:
dim rs as new adodb.recordset
dim strSQL as string
dim 变量 as string
strSQL="select * from table where field like '*" & 变量 & "*'"
'如果是 ANSI SQL 兼容模式时,必须用
'strSQL="select * from table where field like '%" & 变量 & "%'"
'代替
'如果不使用变量可以直接这样组织
'strSQL="select * from table where field like '%字符串%'"
'strSQL="select * from table where field like '*字符串*'"
rs.open strsql ,adodb.connection,1,1
1.2、直接在新建查询中写 SQL 代码,并保存为一个查询备用
select * from table where field like '*' & forms!某个窗体名!控件名 & '*'
千万注意,不能写成以下形式,以下形式是错误的:
select * from table where field like '*forms!某个窗体名!控件名*'
1.3、在窗体的 RECORDSOURCE 数据源属性或者控件的 ROWSOURCE行来源属性中
在这种情况中,同1.2是相同的。
2、在纯 ACCESS 环境中,并且已经开启 ANSI SQL 兼容选项的情况下:
在这种情况下也一样至少要分3种情况
2.1、在 VBA 代码中组织 JET SQL 语句:
dim rs as new adodb.recordset
dim strSQL as string
dim 变量 as string
strSQL="select * from table where field like '%" & 变量 & "%'"
'如果是非 ANSI SQL 兼容模式时,必须用
'strSQL="select * from table where field like '*" & 变量 & "*'"
'代替
'如果不使用变量可以直接这样组织
'strSQL="select * from table where field like '%字符串%'"
'strSQL="select * from table where field like '*字符串*'"
rs.open strsql ,adodb.connection,1,1
2.2、直接在新建查询中写 SQL 代码,并保存为一个查询备用
select * from table where field like '%' & forms!某个窗体名!控件名 & '%'
千万注意,不能写成以下形式,以下形式是错误的:
select * from table where field like '%forms!某个窗体名!控件名%'
2.3、在窗体的 RECORDSOURCE 数据源属性或者控件的 ROWSOURCE行来源属性中
在这种情况中,同2.2是相同的。
3、在非 ACCESS 环境中,只是 VB ASP DELPHI 等调用 MDB 格式的文件的情况下:
以下以 VB 举例
dim strSQL as string
strSQL="select * from table where field like '%" & 某字符串变量名 & "%'"
access911.net 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接
Top
12 楼itone_wong(执子之手,与之偕老)回复于 2007-01-11 08:54:15 得分 0
Hello,我也被这个问题搞得好郁闷!
不过后来才知道解决办法却是非常之简单呵,拿出来与大家分享!!
其实只需要:
1. 打开数据库。
2. 按 Alt+F 11 以打开 VisualBasic 编辑器。
3. 在 工具 菜单上, 单击 引用 。
4. 单击以清除复选框对类型库或对象库标记为"丢失"的选项就OK了.
详细参考http://support.microsoft.com/kb/275110/zh-cn
Top




