尝试从采用最小设置配置的C#程序连接到Oracle 10g数据库时出错
我尝试从正在开发的C#2008速成版应用程序连接到远程Oracle 10g数据库时遇到错误。我试图在开发中使用极简主义的非侵入式方法,以便将ClickOnce部署到用户工作站。尝试从采用最小设置配置的C#程序连接到Oracle 10g数据库时出错
就上述调查过下列文件(除其他..) -
What is the minimal setup required to deploy a .NET application with Oracle client 11?
http://jeremybranham.wordpress.com/2011/04/25/oracle-instant-client-with-odp-net/
http://ora-00001.blogspot.com/2010/01/odpnet-minimal-non-intrusive-install.html
http://splinter.com.au/using-the-new-odpnet-to-access-oracle-from-c
Connect to Oracle with odp.net and the OCI from C#
鉴于我遇到的错误,我创建了一个简单的测试应用程序。由一个单一(wpf)页面组成。 在按钮我试图创建到Oracle数据库的连接的点击事件 -
private void button1_Click(object sender, RoutedEventArgs e)
{
OracleConnection oraConnect;
// string previously used OK in other projects
string connectionString = "Data Source=" +
"(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = myServer)(PORT = 1521)))" +
"(CONNECT_DATA =(SERVICE_NAME = myOracleDb)))" +
";Password=myPw;User ID=myID;";
using (oraConnect = new OracleConnection(connectionString))
{
try
{
if (oraConnect.State == ConnectionState.Closed)
{
oraConnect.Open();
MessageBox.Show("oraConnect is attempting to open..");
}
else
MessageBox.Show("oraConnect open to DB: " + oraConnect.ServerVersion.ToString());
}
catch (NullReferenceException nullExcept)
{
MessageBox.Show("Caught error: ." + nullExcept.ToString());
}
catch (OracleException dbEx)
{
MessageBox.Show("OraException - " + dbEx.Message.ToString());
}
catch (Exception ex)
{
Exception current;
current = ex;
while (current != null)
{
current = current.InnerException;
}
MessageBox.Show("Db base exception - " + ex.GetBaseException().ToString());
}
finally
{
oraConnect.Close();
}
}
}
继我保证,在上述文章中的信息下面的dll的是在我的“bin”文件夹 -
•OCI.DLL
•OCIW32.DLL
•orannzsbb10.dll
•oraocci10.dll
•oraociicus.dll
•MSVCR71.DLL
(最后在绝望中命名......)并引用了'Oracle.DataAccess.dll'。
(在 '赶上(OracleException dbEx)')的错误消息是 -
"Oracle.DataAccess.Client.OracleException was caught
Message=""
StackTrace:
at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure)
at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, Object src)
at Oracle.DataAccess.Client.OracleConnection.Open()
at OracleConnectionTest.Window1.button1_Click(Object sender, RoutedEventArgs e) in C:\Documents\Visual Studio 2008\Projects\OracleConnectionTest\OracleConnectionTest\Window1.xaml.cs:line 69
InnerException: "
Line 69 is 'oraConnect.Open();'.
此外,以下报道 -
"((Oracle.DataAccess.Client.OracleException)($exception)).DataSource' threw an exception of type 'System.NullReferenceException".
我是从内的所述的NullReferenceException假设数据源问题在于其中一个DLL(?),因为我在尝试引用它之前'新建'上面的OracleConnection。
此外,代码执行会跳转'catch(NullReferenceException nullExcept)' 并直接进入OracleException catch。
对不起,但希望这是有道理的? 任何帮助/建议表示赞赏!
确保ODAC设置正确。我会建议使用TNSNAMES(你不应该有连接字符串IMO中的所有信息)。请参阅本文档的TNSNAMES setup部分(11.2)。也看到了通用连接底部发出
一旦这样做了,就应该尽可能把你的连接字符串中项目的设置属性,做一样简单:
oraConnect = new OracleConnection(Properties.Settings.Default.MyConnString);
在你的榜样,你的oraConnect不是招没有被实例化(你只有“OracleConnection oraConnect”),所以失败的“新OracleConnection”部分会导致一个空引用异常(如果我理解你的解释是它的破坏在哪里)。在VS中的调试器也应该有所帮助;)
编辑: 您可能想要设置一个简单的测试控制台应用程序,只需打开/关闭连接。这可能会消除任何噪音,而不是正确地进行ODAC设置。喜欢的东西(未经测试,假设TNSNAMES设置):
使用...
namespace Testbed {
class Program {
static void Main(string[] args) {
try {
string connStr="User Id=my_user;Password=my_pass;Data Source=my_sid;";
OracleConnection oraConnect = new OracleConnection(connStr);
oraConnect.Open();
Console.WriteLine("Opened Connection");
oraConnect.Close();
Console.WriteLine("Complete");
Console.ReadLine();
catch (System.Exception e) {
Console.WriteLine(e.Message);
Console.ReadLine();
} ...
试运行和报告从什么控制台回来。
它发生在我身上。
经过一段伏都教之后,我从我的注册表中删除了这个密钥:HKEY_CURRENT_USER\Software\ORACLE
,一切正常。
好的,很晚才回到这很多道歉!
在此期间,我们的数据库已经升级,并在不断变化的DLL列表包括:(!) -
- oraocci11.dll
- oraociccus11.dll
- OraOps11w.dll
- orannzsbb1 .dll
从'10'版本,仍然没有成功,我编辑了App.xaml(在这里和在网上广泛搜索)wi th以下 -
<system.data>
<DbProviderFactories>
<add name="OracleClient Data Provider"
invariant="System.Data.OracleClient"
description=".Net Framework Data Provider for Oracle"
type="System.Data.OracleClient.OracleClientFactory, System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=##################"/>
</DbProviderFactories>
</system.data>
<!-- publicKeyToken obtained using Reflector to investigate dll -->
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess"
publicKeyToken="##################"
culture="neutral"/>
<bindingRedirect oldVersion="10.2.0.100"
newVersion="2.112.2.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
bindingRedirect做了诡计!
DLL的似乎是非常依赖于兼容的版本号
希望我能说我真正理解如何这个工作,但它确实和我现在有工作连接...
中完全失败的位置_该dll似乎非常依赖于兼容的版本号_这个。 EXTREMELY touchy,我已经让整个服务器在XX1/XX2版本不匹配的情况下纾困。这将是我的调试建议,我很高兴这个问题得到解决。你应该接受你自己的答案,以便其他人可以找到答案。 – 2015-08-06 13:20:29
你能ping'myServer'?你尝试通过sqlplus连接吗? – V4Vendetta 2011-12-22 12:34:58
你可以t''myOracleDb'吗? – Shai 2011-12-22 12:45:20
'NullReferenceException'不是问题的原因。它发生在您检查VisualStudio中的异常时。这是一个调试工件,可以忽略。不幸的是,真正的异常似乎不包含任何错误信息。或者你在某处忽略了它? – Codo 2011-12-22 12:48:44