Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

[5分]从ORACLE数据库读取数据,提示“查询输入必须包含至少一个表或查询”

chinasa  发表于:2014-06-13 09:13:55  
复制

我通过以下方法与ORACLE链接,在运行SQL语句时提示:“查询输入必须包含至少一个表或查询”,请问应该如何写SQL语句?

Private Sub link_Click()
If IsNull(Me.database) Then
MsgBox "服务器名称不能为空!", vbInformation, "Error 提示"
Me.database.SetFocus
Exit Sub
ElseIf IsNull(Me.user) Then
MsgBox "用户名不能为空!", vbInformation, "Error 提示"
Me.user.SetFocus
Exit Sub
ElseIf IsNull(Me.password) Then
MsgBox "密码不能空!", vbInformation, "Error 提示"
Me.password.SetFocus
Exit Sub
End If
Call oracle(IIf(IsNull(Me.ipaddress), "1", Me.ipaddress), Me.database, Me.user, Me.password)

strsql = "SELECT A表.B字段 INTO C表" _
& "FROM A表" _
& "WHERE (((A表.D字段)='文本内容'));"

DoCmd.RunSQL strsql

 

DoCmd.RunSQL strsql

 

 

End Sub

 

 

下面是模块内容

Option Compare Database
Function oracle(strIPName As String, strDBName As String, strUserID As String, strPassword As String)  '-------------网络地址、服务器名称、用户ID、密码
'----------------------------
'检测是否在连接成功
'----------------------------
Dim ConnDB As New ADODB.Connection
Dim OraOpen As Boolean
Dim connstr As String
On Error GoTo Myerr
'MsgBox strIPName
strDBName = IIf(strIPName = "1", strDBName, strIPName & ":1522/" & strDBName) '-----------网络地址转换,ORACLE默认端口是1521

'MsgBox strDBName
connstr = "DRIVER={Microsoft ODBC for Oracle};SERVER=" & strDBName & ";UID=" & strUserID & ";PWD=" & strPassword & ";"
ConnDB.CursorLocation = adUseServer
ConnDB.Open connstr
OraOpen = True
MsgBox "恭喜你已经成功连接到数据库!", vbInformation, "Connect Successful"

 

ConnDB.Close
Set ConnDB = Nothing
Exit Function
Myerr: MsgBox "连接不成功,请检查你的用户名、密码和数据库地址是否正确!", vbInformation, "No Connect Successful"
End Function

 

 

 

Top
chinasa 发表于:2014-06-13 09:57:25

问题更改为:

数据库引擎找不到输入表或查询“A表”

难道是我链接不成功?理论上应该是成功的,因为现在提示链接成功,而我故意把密码改错就会提示链接不成功。



chinasa 发表于:2014-06-13 09:58:04

或者不可以直接这样用SQL语句来检索?



cspa 发表于:2014-06-13 10:06:24
oracle属于ODBC连接,可能不能用DoCmd.RunSQL strsql连接,试试ADO方式连接。ADO是用来连接ODBC数据源的。

chinasa 发表于:2014-06-13 12:06:38
还是不会啊,有谁懂的给指点下?

cspa 发表于:2014-06-13 12:40:39

我把你的模块内容改了下,变为测试连接成功后就开始处理A表中的数据,供你参考:

Function oracle(strIPName As String, strDBName As String, strUserID As String, strPassword As String)  '-------------网络地址、服务器名称、用户ID、密码
'----------------------------
'检测是否在连接成功,并处理 A表中的数据
'----------------------------

Dim ConnDB As New ADODB.Connection
Dim OraOpen As Boolean
Dim connstr As String
Dim rst As ADODB.Recordset
Dim strSQL As String

 

On Error GoTo Myerr
'MsgBox strIPName
strDBName = IIf(strIPName = "1", strDBName, strIPName & ":1522/" & strDBName) '-----------网络地址转换,ORACLE默认端口是1521

'MsgBox strDBName
connstr = "DRIVER={Microsoft ODBC for Oracle};SERVER=" & strDBName & ";UID=" & strUserID & ";PWD=" & strPassword & ";"
ConnDB.CursorLocation = adUseServer
ConnDB.Open connstr
OraOpen = True
MsgBox "恭喜你已经成功连接到数据库!", vbInformation, "Connect Successful"

'打开表,并用ADO处理数据
Set rst = New ADODB.Recordset
strSQL = "SELECT A表.B字段 INTO C表" _
& "FROM A表" _
& "WHERE (((A表.D字段)='文本内容'));"
rst.Open strSQL, ConnDB, adOpenKeyset, adLockOptimistic, adCmdTable
'以下你可以对rst操作,处理其中的数据了,如:
rst.MoveFirst
......

rst.Close
Set rst= Nothing

ConnDB.Close
Set ConnDB = Nothing
Exit Function
Myerr: MsgBox "连接不成功,请检查你的用户名、密码和数据库地址是否正确!", vbInformation, "No Connect Successful"

End Function



chinasa 发表于:2014-06-13 13:47:19


cspa 发表于:2014-06-13 14:35:54
该提示是说无效的表名称,查查你的Oracle中的表名是否写错了?

chinasa 发表于:2014-06-13 15:11:56
查过了,我的SQL语句是从查询的SQL视图复制过来的,应该不会错的。

chinasa 发表于:2014-06-13 15:20:15

我的语句写成这样,可以吗?

strSQL = "SELECT IND.[INDEX_NAME] FROM IND;"



cspa 发表于:2014-06-13 15:22:50
你复制的是access中的SQL视图,orcale中的表名称可能与其不一样!连接表在acccess端是可以改名的。你要进入orcale数据库看看该表是如何命名的。简单地例子,在access中连接表都会加上前缀dbo.表名

cspa 发表于:2014-06-13 15:32:39

strSQL = "SELECT IND.[INDEX_NAME] FROM IND;"   改成:

 

strSQL = "SELECT IND.INDEX_NAME FROM IND;"  或

 

strSQL = "SELECT (IND.INDEX_NAME) FROM IND;"  试试



 





 



chinasa 发表于:2014-06-13 15:35:35

进入ORACLE数据库以后发现有的表名称是“SAS.XXX”,链接到本地后变成“SAS_XXX”,我尝试把前缀去掉、把中间的连接符从下划线改为点,都不行。后来我又找了个表“IND”没有任何其它字符,仍然不行。真奇怪啊。

我在查网上有人说SQL SERVER与ORCAL的SQL语句有些不同,但比较了下好像我写的这个应该可以通用的啊。



chinasa 发表于:2014-06-13 15:37:15
仍然不成功啊。

cspa 发表于:2014-06-13 15:44:44

这种情况下要最简化处理,即去掉一切可能引发错误的特殊符号如“-”、“_”、“.”等:

1、把IND表中的[INDEX_NAME]字段名改为INDEXNAME

2、把strSQL = "SELECT IND.[INDEX_NAME] FROM IND;"  改为:strSQL = "SELECT INDEXNAME FROM IND;" 或:strSQL = "SELECT IND.INDEXNAME FROM IND;" 或:strSQL = "SELECT (IND.INDEXNAME) FROM IND;"  等试试

3、如不能对oracle中已有表随便修改就在oracle中新建一个试验用表。注意不要用任何可能引起问题的特殊字符。



 



chinasa 发表于:2014-06-13 15:48:28

strSQL = "SELECT IND.[COMPRESSION] FROM IND;"

仍然不成功



chinasa 发表于:2014-06-13 15:49:55

strSQL = "SELECT IND.[COMPRESSION] FROM IND;"另外两种写法也测试了,不成功



chinasa 发表于:2014-06-13 15:54:03

http://www.accessoft.com/article-show.asp?id=1342

看了半天这个资料也没看懂,能帮我看下不?



cspa 发表于:2014-06-13 16:03:58
不成功报什么错呢?停在哪条语句上(黄*色的语句)?你上面的例子都是连接成功后对表数据进行处理的,你现在是打不开表,所以没用。

chinasa 发表于:2014-06-13 16:05:49

不成功停在  rst.Open strSQL, ConnDB, adOpenKeyset, adLockOptimistic, adCmdTable

所报错误都是上面的图片



cspa 发表于:2014-06-13 16:13:53

把rst.Open strSQL, ConnDB, adOpenKeyset, adLockOptimistic, adCmdTable 改成:

rst.Open strSQL, ConnDB 或:

rst.Open strSQL

试试,总之是尽量简化,排除一切干扰因素。

strSQL也用最简的,如:

strSQL="select * from IDN;" 



总记录:36篇  页次:1/2 9 1 2 8 :