小弟的问题如下:
小弟公司的一个仪表上位机是vb6开发的,数据库是ms 的access,客户(一工厂)用到我们的仪器,他要求将数据上传到他们的 ERP 系统中,他们的ERP 系统是B/S模式,数据库是ORAcle的,是内部局域网。
小弟遇到问题:
1)我客户端(C/S)必须安装ORACLE 客户端软件么?还有其他的解决方案么?
2)连接老出现错误 ora-01005 null password given logon denied
3)我用adodc 配置数据源 绑定 datagrid 能显示数据,当用下面程序会出现问题2的错误。
我的部分代码如下:------------------------------------------配置系统设置的模块-------------------------------
'声明写入ini文件的API函数
Public Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As Any, ByVal lpFilenchame As String) As Long
Public Declare Function WritePrivateProfileSection Lib "kernel32" Alias "WritePrivateProfileSectionA" (ByVal lpAppName As String, ByVal lpString As String, ByVal lpFilenchame As String) As Long
'判断文件是否存在
Function FileExist(Fname As String) As Boolean
  On Local Error Resume Next
  FileExist = (Dir(Fname) <> "")
End Function
'读取ini文件的数据项值
Public Function GetKey(Tmp_File As String, Tmp_Key As String) As String
  Dim File As Long, buffer, pos
  '分配文件句柄
  File = FreeFile
  
  '如果文件不存在则创建一个默认的Setup.ini文件
  If FileExist(Tmp_File) = False Then
    GetKey = ""
    Call WritePrivateProfileString("Setup Information", "DataSource", "", App.Path + "\Setup.ini")
    Call WritePrivateProfileString("Setup Information", "UserID", " ", App.Path + "\Setup.ini")
    Call WritePrivateProfileString("Setup Information", "Password", " ", App.Path + "\Setup.ini")
    Exit Function
  End If
  
  '读取数据项值
  Open Tmp_File For Input As File
    Do While Not EOF(1)
      Line Input #File, buffer
      If Left(buffer, Len(Tmp_Key)) = Tmp_Key Then
        pos = InStr(buffer, "=")
        GetKey = Trim(Mid(buffer, pos + 1))
      End If
    Loop
  Close File
End Function
-----------------------------------------ORACLE 数据库操作模块---------------------------------------
'定义服务器参数常量
Public UserID  As String                   '用户名
Public DataSource As String             '数据源
Public Password As String                '用户密码Public ConnStr As String                      '连接字符串
'== 标记数据库是否连接 ==
Private IsConnect As Boolean           'ORACLE数据库是否打开
Private ConnStrect_Num As Integer      '== 标记执行ConnStrect()函数后,访问数据库的次数 ==
Private cnn As ADODB.Connection       '连接数据库的ConnStrection对象
Private rs As ADODB.Recordset         '保存结果集的Recordset对象
Public OraDB_Open As Boolean        'ORACLE数据库是否打开'连接数据库
Private Sub DbConnect()   ConnStr = "Provider=OraOLEDB.Oracle.1;Persist Security Info=False;User ID=" + Trim(UserID) + ";Password=" + Trim(Password) + ";Data Source=" + Trim(DataSource) + ";Persist    Security    Info=False"
Debug.Print ConnStr
  '如果连接标记为真,则返回。否则会出错
   If IsConnect = True Then
       Exit Sub
   End If
   
  '关键New用于创建新对象cnn
   Set cnn = New ADODB.Connection
  '设置连接字符串ConnStrectionString属性
   cnn.ConnectionString = ConnStr
   
  '打开到数据库的连接
   cnn.Open
   
  '判断连接的状态
   If cnn.State <> adStateOpen Then
    '如果连接不成功,则显示提示信息,退出程序
        MsgBox "连接数据库服务器错误,您可以在网络正常后继续使用。", vbInformation, "错误信息"
      End
   End If
  
  '设置连接标记,表示已经连接到数据库
   IsConnect = True
End Sub'断开与数据库的连接
Private Sub DbDisConnect()
  Dim Rc As Long
  '如果连接标记为假,标明已经断开连接,则直接返回
  If IsConnect = False Then
      Exit Sub
  End If
  '关闭连接
  cnn.Close
  '释放cnn
  Set cnn = Nothing
  '设置连接标记,表示已经断开与数据库的连接
  IsConnect = False
End Sub'执行数据库操作语句
Public Sub SQLExt(ByVal TmpSQLstmt As String)
  '创建Command对象cmd
  Dim cmd As New ADODB.Command
  
  '连接到数据库
  DbConnect
  '设置cmd的ActiveConnStrection属性,指定与其关联的数据库连接
  Set cmd.ActiveConnection = cnn
  '设置要执行的命令文本
  cmd.CommandText = TmpSQLstmt
 
 'MsgBox TmpSQLstmt
  '执行命令
   cmd.Execute
  '清空cmd对象
  Set cmd = Nothing
  '断开与数据库的连接
DbDisConnect
End Sub'执行数据库查询语句
Public Function QueryExt(ByVal TmpSQLstmt As String) As ADODB.Recordset
  '创建Recordset对象rst
  Dim rst As New ADODB.Recordset
  
  '连接到数据库
  DbConnect
  '设置rst的ActiveConnStrection属性,指定与其关联的数据库连接
  Set rst.ActiveConnection = cnn
  '设置游标类型
  rst.CursorType = adOpenDynamic
  '设置锁定类型
  rst.LockType = adLockOptimistic
  '打开记录集
  rst.CursorLocation = adUseClient
  rst.Open TmpSQLstmt
  '返回记录集
  Set QueryExt = rst
End Function

解决方案 »

  1.   

    你的问题是没有安装oracle客户端造成的.
    其实可以安装ORACLE OLEDB驱动,这就不需要客户端了,然后用ADO调用这个OLEDB驱动就可以了。驱动到   www.oracle.com 有下载。可以把它打包到安装程序里
      

  2.   

    仿照adodc的connetionstring来写不就可以了吗
      

  3.   


    回孤独剑:
    我机器上装了ORACLE 10g 企业版,但没有装客户端。
    必须装客户端么?
      

  4.   

    调用的是本机的oracle呀,那就不需要了,设置ODBC数据源,用ado直接连接,试试
      

  5.   

    改一下tnsnames.ora 配置即可!