设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 6128|回复: 5
打印 上一主题 下一主题

【VB.net小品】盲人摸象---解决Oracle数据库连接问题

[复制链接]
跳转到指定楼层
1#
发表于 2014-5-7 15:02:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  一直一来都没对数据连接问题做深入研究,只是写一些练习类型的示例。最近想真正开发些小的项目,便需要考虑真实环境中客户端与服务器的连接问题了。单位的服务器装的是Oracle10g,我的笔记本中装的是Oracle11g,本来没想到会有多大的麻烦,可是实际上麻烦非常之大。


  根据微软的说法,在.net framework中会将弃用System.Data.OracleClient,建议采用第三方客户端。好在Orcale很地道,开发有专门针对.net framework的ODP.net。于是便根据网上找到的一些资料,使用ODP.net做数据连接的客户端。具体的处理方法为:

  1、在项目中添加引用Oracle.DataAccess.dll:该文件在Oracle的安装目录中的..\ODP.NET\bin\2.x\中。

  2、在app.config中分别写本地和服务器的连接字符串。在connectionStrings节点中增加add节点,其中的代码分别为:
add name="OracleConnectionString0" connectionString="Data Source=xx.xxx.x.xxx/你的Oracle数据库名;User Id=你的用户名assword=你的用户密码;"

add name="OracleConnectionString1" connectionString="Data Source=127.0.0.1/你的Oracle数据库名;User Id=你的用户名assword=你的用户密码;"  

  3、在类文件中引用System.Data、Oracle.DataAccess.Client、Oracle.DataAccess.Types、System.Configuration。

  4、在类文件中编写几个函数和子程序用于数据库处理即可。大体如下:

Imports System.Data
Imports oracle.DataAccess.Client
Imports oracle.DataAccess.Types
Imports System.Configuration

Public Class ClassOracle
    'Odp.net连接
    Private Shared connstring As String '连接字符串

    Public Sub New()
        If String.IsNullOrEmpty(connstring) = True Then
            Dim str1 As String = ConfigurationManager.ConnectionStrings("OracleConnectionString0").ConnectionString
            Dim str2 As String = ConfigurationManager.ConnectionStrings("OracleConnectionString1").ConnectionString
            Using conn As New oracleConnection(str1)
                Try
                    conn.Open()
                    If conn.State = ConnectionState.Open Then
                        connstring = str1
                        Exit Sub
                    End If
                Catch ex As Exception
                End Try
            End Using


            Using conn As New oracleConnection(str2)
                Try
                    conn.Open()
                    If conn.State = ConnectionState.Open Then
                        connstring = str2
                    End If
                Catch ex As Exception
                End Try
            End Using
        End If
    End Sub

    Public Function GetDataTable(ByVal ssql As String) As DataTable
        '功能:返回数据表
        Dim tb As New DataTable
        If String.IsNullOrEmpty(connstring) = False Then
            Using conn As New oracleConnection(connstring)
                conn.Open()
                Using cmd As New oracleCommand()
                    cmd.Connection = conn
                    cmd.CommandType = CommandType.Text
                    cmd.CommandText = ssql
                    Using adp As New oracleDataAdapter(cmd)
                        Using ds As New DataSet
                            adp.Fill(ds)
                            tb = ds.Tables(0)
                        End Using
                    End Using
                End Using
                conn.Close()
            End Using
        Else
            MessageBox.Show("连接服务器失败!")
        End If
        Return tb
    End Function

    Public Sub ExecuteNonQuery(ByVal ssql As String)
        '功能:执行非Select命令
        If String.IsNullOrEmpty(connstring) = False Then
            Using conn As New oracleConnection(connstring)
                conn.Open()
                Using cmd As New oracleCommand
                    cmd.Connection = conn
                    cmd.CommandType = CommandType.Text
                    cmd.CommandText = ssql
                    cmd.ExecuteNonQuery()
                End Using
                conn.Close()
            End Using
        Else
            MessageBox.Show("连接服务器失败!")
        End If
    End Sub

    Public Function ExecuteScalar(ByVal ssql As String) As Object
        '功能:返回单一值
        Dim obj As Object = Nothing
        If String.IsNullOrEmpty(connstring) = False Then
            Using conn As New oracleConnection(connstring)
                conn.Open()
                Using cmd As New oracleCommand
                    cmd.Connection = conn
                    cmd.CommandType = CommandType.Text
                    cmd.CommandText = ssql
                    obj = cmd.ExecuteScalar()
                End Using
                conn.Close()
            End Using
        Else
            MessageBox.Show("连接服务器失败!")
        End If
        Return obj
    End Function
End Class



本帖被以下淘专辑推荐:

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖1 订阅订阅
2#
 楼主| 发表于 2014-5-7 15:02:47 | 只看该作者

  当然,你可以根据需要将这个类的功能写得更强大一些。有了这些代码,就可以对Oracle数据库进行增删改查的各种操作了,至于怎么设计窗体不是本文关注的内容,在此不赘述。

  我在编写完成一个小的项目后,便开始设计安装项目。应该说.Net提供了很多项目部署的处理方案,比较简单的是设计安装项目。在安装项目中我们可以自定义安装的内容和过程。如何去完成一个安装项目在此也不赘述,只是告诉同志们,我搞出来了,并且在本机安装并运行成功。问题出现在向其他计算机安装的时候,首先在其他目标计算机上需要安装相同版本的.NET客户端。我的项目需要的是.NET Framewoke 4 Client Profile这个客户端,去下载一个安装即可。安装完成这个客户端后,接着安装我的项目,然后运行。问题来了,Oracle数据库连接失败!

  问管理员,说是服务器和终端上的Oracle版本是10g,可能与我安装版本中的11g有冲突。到网上一查,还真是如此。于是就在网上找相关的处理方法,找了很多,终于找到了一篇《.net中使用ODP.net访问Oracle数据库(无客户端部署方法)》的文章,这个文章写的比较详细,大家可以去看看。按照这篇文章的方法我进行了处理,但是还是连不上。于是又找相关的资料,原来Oracle的版本号还有小号的差异,这个就比较麻烦了。于是我仔细想了一下,觉得可以不完全按照《.net中使用ODP.net访问Oracle数据库(无客户端部署方法)》文中的方法进行处理。这篇文章说到需要去下载Oracle的ODAC,然后从其中解压出几个dll文件,问题在于目标机上的Oracle版本并不总是能预先知道,这就需要下载很多不同版本的ODAC,这显然不是解决问题之道。

  这篇文章最有价值的一句话被我敏锐的捕获到了,这句话是这样的:“在上面列出的DLL中,其中Oracle.DataAccess.dll和OraOps11w.dll才是ODP.net对应的文件,其余的DLL(oci.dll、oraociicus11.dll、orannzsbb11.dll、oraocci11.dll、ociw32.dll)均为OracleInstantClient对应的文件,ODP.net和InstantClient的版本必须一致,否则会发生错误,只要能保证版本正确,可以视需求另外下载OracleInstantClient(因为InstantClient分几个版本,BASIC,BASIC_LITE等),再将这几个DLL文件替换”

  这段话,实际上已经排除了下载ODAC的必要。因为目标计算机上只存在两种情况:第一种是已经有客户端(比如有别的运用程序在前面已经安装了客户端),第二种情况是没有Oracle客户端。当存在客户端的时候,我们能在目标机上找到文章所述的几个dll文件,这几个文件编入安装项目即可。没有客户端的话,那也就不存在两种版本的冲突(注意这里的版本冲突与后台无关,只是前台目标计算机上的既有版本与将要安装的客户端中所带的版本之间的冲突),直接用开发用的计算机上的版本就可以了。

  按照这个思路,和我所面临的情况(目标计算机上已经存在Oracle10g客户端),我在目标机上找到了所有的dll文件(注意有几个dll文件在主文件名末尾有版号标识中,所以文件名称会有11和10的差别,如oraociicus11.dll、orannzsbb11.dll),然后将这些文件拷贝到开发计算机上。然后按照以下步骤进行处理:

  1、先在项目中删除原来的引用Oracle.DataAccess.dll。方法是:右击项目名称--属性--引用标签页,找到Oracle.DataAccess.dll,然后删除。

  2、右击项目--添加引用--浏览--找到拷贝过来的文件夹中的Oracle.DataAccess.dll(它的版本是10g)。

  3、在安装项目中打开文件系统视图,在目标计算机上的文件系统下,找到应用程序文件夹,然后右击--添加--文件,找到拷贝过来的文件夹,选中其中除oracle.DataAccess.dll外的所有文件,将它们全部添加到应用程序文件夹中。

  4、生成安装项目。


   所生成的安装项目在本机是无法运行的,因为本机的版本为11g,而安装的版本为10g。不过这没关系,拿到目标机上安装,然后运行之。一切OK!
3#
 楼主| 发表于 2014-5-7 15:52:22 | 只看该作者
本帖最后由 todaynew 于 2014-5-7 17:44 编辑

以上所论不一定完全正确,只是提供同志们参考一下。
4#
发表于 2015-5-27 17:34:47 | 只看该作者
好经验,谢谢分享.
5#
发表于 2015-5-27 17:36:08 | 只看该作者
oracle的体积大吗?如果不大,改天我也试试

点击这里给我发消息

6#
发表于 2019-5-18 08:11:07 | 只看该作者
太强大了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-4-20 19:37 , Processed in 0.106962 second(s), 31 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表