我用.net做的winform程序,需要连接到oracle 10G,发现连接数据老是出错,乱搞了很久都没解决。后来才发现我原来的程序目录是
F:\ImportFormDataFile(1.1) ,把目录改为F:\ImportFormDataFile1.1,就OK了。就是程序目录中不能含有括号。不然数据库连接不上,不信你们试试看。
F:\ImportFormDataFile(1.1) ,把目录改为F:\ImportFormDataFile1.1,就OK了。就是程序目录中不能含有括号。不然数据库连接不上,不信你们试试看。
{"ORA-12154: TNS: 无法解析指定的连接标识符\n"}不用括号没事
你试试用oralce客户端软件能否直接连上。如果能连,是.net的问题。如果不能连,是客户端问题。话说.net已经放弃对oracle支持了,就是真的bug也不会改了。
我本地同时安装了10G和11G的客户端,10G是很早就装的,但后来发现11G的好用,又安装了一个,两者不存在任何冲突,11G单独提供的Oracle.DataAccess.dll,版本又2.0和4.0两种运行库支持,且访问的数据库版本不限制,而10G的只提供了1.0的版本,且不支持DbConnection的继承,不符合数据库的标准继承规范,因此废弃不用。另外微软的OracleClient已经明确被微软废弃,不能再用,功能上也有很大限制,因此我做的新版数据库访问类已经使用Oracle.DataAccess,支持Oracle高级语法,效率极高。
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单独优化的,尚未发布。
你这句话并不正确,而且会让某些人产生恐慌的情绪。尤其你还是一个“两星”的人物,请说话稍微注意一点影响,谢谢。.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楼你的这个说法真的很不准确。
http://www.oracle.com/technetwork/topics/dotnet/index-085163.html
winxp sp2,服务器oracle10g,用的oracle.dataaccess。
使用OracleClient.OracleConnection时(我连的是Oracle 9i,其他版本未知),如果你的执行目录太长或者有括号等(未考察有些什么符号),那么即使你的服务名是对的,也会引起ORA-12154问题“TNS: 无法处理服务名”,当出现这个问题时,请也考虑这个原因。
请参见此消息的结尾。************** 异常文本 **************
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...)。
我的客户端系统是winxp sp3
只能将程序安装在不带英文括号的目录中楼上的那些用ODP.NET的就不要乱喷了
XP会有问题,但win7不会有问题
所以到底是oracle的问题,还是系统的问题,这个有待研究。