ste*_*eve 8 c# oracle clickonce oracleexception
尝试从我正在开发的C#2008 Express Edition应用程序连接到远程Oracle 10g数据库时遇到错误.我正在尝试使用极简主义,非侵入性的方法进行开发,以便将ClickOnce部署到用户工作站.
关于上述内容,我调查了以下文件(其中包括......) -
使用Oracle客户端11部署.NET应用程序所需的最小设置是什么?
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
鉴于我遇到的错误,我创建了一个简单的测试应用程序.由一个(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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
根据上述文章中的信息,我确保以下Dll位于我的"bin"文件夹中 -
•oci.dll
•ociw32.dll
•orannzsbb10.dll
•oraocci10.dll
•oraociicus.dll
•msvcr71.dll
(最后一个在绝望中命名...)并引用了'Oracle.DataAccess.dll'.
错误消息(在'catch(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();'.
Run Code Online (Sandbox Code Playgroud)
此外,报告如下 -
"((Oracle.DataAccess.Client.OracleException)($exception)).DataSource' threw an exception of type 'System.NullReferenceException".
Run Code Online (Sandbox Code Playgroud)
我假设在数据源中的NullReferenceException中,问题在于其中一个dll'(?),因为我在尝试引用它之前是'new'the OracleConnection.
此外,代码执行会跳转'catch(NullReferenceException nullExcept)'并直接进入OracleException catch.
抱歉漫无目的,但希望这有道理吗?任何帮助/建议表示赞赏!
确保 ODAC 设置正确。我建议使用 TNSNAMES (在我看来,您不应该在连接字符串中包含所有这些信息)。请参阅本文档的TNSNAMES 设置部分 (11.2)。另请参阅底部部分了解常见连接问题
完成后,它应该像将连接字符串放入项目的设置属性中并执行以下操作一样简单:
oraConnect = new OracleConnection(Properties.Settings.Default.MyConnString);
Run Code Online (Sandbox Code Playgroud)
在您的示例中,您的 oraConnect 尚未实例化(您只有“OracleConnection oraConnect”),因此失败的“new 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();
} ...
Run Code Online (Sandbox Code Playgroud)
尝试运行它并报告从控制台返回的内容。