我用.net做的winform程序,需要连接到oracle 10G,发现连接数据老是出错,乱搞了很久都没解决。后来才发现我原来的程序目录是
F:\ImportFormDataFile(1.1) ,把目录改为F:\ImportFormDataFile1.1,就OK了。就是程序目录中不能含有括号。不然数据库连接不上,不信你们试试看。

解决方案 »

  1.   

    试过了,很正常,而且你说的情况本身不可能出现,不试就知道,因为程序目录和数据库的访问没有任何关系,数据库访问是通过连接字符串来访问的,你不把出错信息贴出来分析,主观臆断说是BUG,那只是推卸责任。
      

  2.   

    话是这么说,但是为啥改了目录就能正常访问?可能你oracle的客户端版本跟我的不一样
      

  3.   

    有兴趣可以把程序里的Oracle操作部分屏蔽掉,看看带上括号是否还是出错。你都不知道出错的详细信息和部位,就叫别人做这种荒唐的测试。
      

  4.   

    我实在模拟不出异常,Oracle也搞了好多年了,从没见过类似情况,你却一直不看给我看出错信息,让我自己模拟,这不是明显的难为人吗?
      

  5.   

    目录中用了括号之后,调试,open connnection时会跑出异常:
    {"ORA-12154: TNS: 无法解析指定的连接标识符\n"}不用括号没事
      

  6.   

    据说有的oracle客户端是有这样的问题。
    你试试用oralce客户端软件能否直接连上。如果能连,是.net的问题。如果不能连,是客户端问题。话说.net已经放弃对oracle支持了,就是真的bug也不会改了。
      

  7.   

    这问题很好解决,看下当时的连接字符串是否正常(如果你怀疑Oracle的客户端版本太低了,可以再安装Oracle 11G的客户端)
    我本地同时安装了10G和11G的客户端,10G是很早就装的,但后来发现11G的好用,又安装了一个,两者不存在任何冲突,11G单独提供的Oracle.DataAccess.dll,版本又2.0和4.0两种运行库支持,且访问的数据库版本不限制,而10G的只提供了1.0的版本,且不支持DbConnection的继承,不符合数据库的标准继承规范,因此废弃不用。另外微软的OracleClient已经明确被微软废弃,不能再用,功能上也有很大限制,因此我做的新版数据库访问类已经使用Oracle.DataAccess,支持Oracle高级语法,效率极高。
      

  8.   

    连接字符串是没问题的,我用的是微软的System.Data.OracleClient; Oracle.DataAccess稍后试用看看。
      

  9.   

    三个版本(1.0、2.0、4.0)的Oracle.DataAccess.dll都试过了,完全正常,项目所在目录后缀
    D:\My Documents\Visual Studio 2010\Projects\WindowsFormsApplication(1.1)\ConsoleApplication1\
    这样的目录结构应该符合要求,数据库操作类自己封装的,测试代码部分如下:
    using (var conn = GetOracleConnection("V7HQS"))
    {
        var sqltext = @"SELECT '上班' A FROM DUAL";
        var data = conn.Query<EFX>(sqltext).First();
        Console.WriteLine(data);
    }
    Console.WriteLine("按回车退出。");
    Console.ReadLine();枚举定义如下:
        public enum EFX
        {
            自动 = 0,
            上班 = 1,
            下班 = 2
        }
    通过扩展方法直接给OracleConnection添加的Query方法,具体操作类可以参考我的博客,不过这个是第二版针对Oracle单独优化的,尚未发布。
      

  10.   


    你这句话并不正确,而且会让某些人产生恐慌的情绪。尤其你还是一个“两星”的人物,请说话稍微注意一点影响,谢谢。.Net不可能连Oracle都不支持。不仅支持,而且支持得很好。ADO.Net又不是为微软的数据库专门设计的接口,它是为所有关系型数据库(以及某些非关系型数据库、数据源)而设计的。只要是主流的关系型数据库,ADO.Net没有理由不支持它。你所说的“.net已经放弃对oracle支持”,其实是这么回事:
    因为为软也曾经提供了Oracle Data Provider for ADO.Net,而Oracle公司也做提供了Oracle Data Provider for ADO.Net,甚至也有一些第三方机构也提供了提供了Oracle Data Provider for ADO.Net,再加上开发者一般习惯于使用Oracle和第三方机构的Data Provider,所以微软就考虑,干脆微软自己不再在Oracle Data Provider for ADO.Net上面多花精力了,就让开发者使用Oracle自己提供的或者第三方机构提供的,这不是挺好的吗?微软负责把ADO.Net做好,而ADO.Net的标准是公开的,各数据库厂商自行去开发Data Provider,微软不再干吃力不讨好的事,做好自己份内的事就很好了。你看,MySQL、Postgresql、SQLite,这些数据库微软都没有给它们做Data Provider,但是我从来没有听说过.Net不支持MySQL或者.Net不支持Postgresql之类的蠢话,为什么?因为这些数据库厂商或者第三方机构已经做了Data Provider,所以我们在.Net程序里面使用MySQL、Postgresql、SQLite这些数据库毫无困难。所以说#21楼你的这个说法真的很不准确。
      

  11.   

    Oracle自己提供的Oracle Data Provider for .NET在这里:
    http://www.oracle.com/technetwork/topics/dotnet/index-085163.html
      

  12.   

    顺手测试了一下,加了英文的括号,准确的说是只是加了英文的反括号,而且没有重新编译程序,的确会抛出“无法解析指定的连接标识符”异常。
    winxp sp2,服务器oracle10g,用的oracle.dataaccess。
      

  13.   

    现在都是反向支持,由数据库厂商来支持.net.net只提供一套,包括新特性数据访问的支持也由厂商来做。
      

  14.   

    我以前用asp连接到oracle9i要装客户端,还常出错,憋屈啊,现在直接用java的jdbc啥事都没有。
      

  15.   

    不光看oracle server/client版本问题,还有可能是系统环境问题,如补丁之类的。
      

  16.   

    二、应用程序中报错:    一个很难想到的引起ORA-12154的原因
            使用OracleClient.OracleConnection时(我连的是Oracle 9i,其他版本未知),如果你的执行目录太长或者有括号等(未考察有些什么符号),那么即使你的服务名是对的,也会引起ORA-12154问题“TNS: 无法处理服务名”,当出现这个问题时,请也考虑这个原因。
      

  17.   

    有关调用实时(JIT)调试而不是此对话框的详细信息,
    请参见此消息的结尾。************** 异常文本 **************
    System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail]: ORA-12154: TNS: 无法解析指定的连接标识符
     (错误详细信息等于 很可能由 IncludeExceptionDetailInFaults=true 创建的 ExceptionDetail,其值为:
    System.Data.OracleClient.OracleException: ORA-12154: TNS: 无法解析指定的连接标识符   在 System.Data.OracleClient.OracleException.Check(OciErrorHandle errorHandle, Int32 rc)
       在 System.Data.OracleClient.OracleInternalConnection.OpenOnLocalTransaction(String userName, String password, String serverName, Boolean integratedSecurity, Boolean unicode, Boolean omitOracleConnectionName)
       在 System.Data.OracleClient.OracleInternalConnection..ctor(OracleConnectionString connectionOptions)
       在 System.Data.OracleClient.OracleConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
       在 System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
       在 System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
       在 System.Data.ProviderBase.DbConnectionPool.User...)。
      

  18.   

    我的是oracle10g客户端,oracle服务端是windows2003 oracle数据库也是10g的。
    我的客户端系统是winxp sp3
      

  19.   

    使用.NET 2.0,Oracle 10g R2,M$的Oracle联接,一直就有这个毛病,是微软的bug
    只能将程序安装在不带英文括号的目录中楼上的那些用ODP.NET的就不要乱喷了
      

  20.   

    本来就该这个流程。MS(和主要厂商、协会)商讨接口,具体实现由厂商自行完成。MS顶多只是验证,厂商的实现,是否合格。
      

  21.   

    OCI.DLL文件的调用不允许使用括号
      

  22.   

    还真热闹,俺就说一句:因为oracle遇到括号的时候,会认为在解析tnsname,所以报错。这个错误不单单出现在.net,其他开发语言同样。
      

  23.   

    确实是个bug,我在项目中也遇到了这个问题 
      

  24.   

    这个问题我们遇到过好几次,有时候发包的程序文件夹被工程师随意命名,比如加上个日期然后用括号括上,就出了这种问题
    XP会有问题,但win7不会有问题
    所以到底是oracle的问题,还是系统的问题,这个有待研究。
      

  25.   

    原来win7没问题啊,难怪我无法重现错误了,因为我是win7