当我试图在C#中打开Oracle数据库的连接时,发生以下错误。这是什么解决方案。 [英] When I Am Trying To Open The Connection Of Oracle Database In C#, Then The Following Error Occurred.What Is The Solution For This.

查看:100
本文介绍了当我试图在C#中打开Oracle数据库的连接时,发生以下错误。这是什么解决方案。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题:

当我尝试在C#中打开oracle数据库的连接时,发生了以下错误。提到此代码适用于新项目。这是什么解决方案。



Quote:

ArgumentNullException:



值不能为空。

参数名称:SafeHandle不能为空。





堆栈跟踪:



在System.StubHelpers.StubHelpers.SafeHandleAddRef(SafeHandle pHandle,布尔和成功)
在System.Data.Common .UnsafeNativeMethods.OCIAttrSet(OciHandle trgthndlp,HTYPE trghndltyp,Byte [] attributep,UInt32 size,ATTR attrtype,OciHandle errhp)
at System.Data.OracleClient.TracedNativeMethods.OCIAttrSet(OciHandle trgthndlp,Byte [] attributep,UInt32 size ,ATTR attrtype,OciHandle errhp)
at System.Data.OracleClient.OciHandle.SetAttribute(ATTR attribute,String value,OciErrorHandle errorHandle)
at System.Data.OracleClient.OracleInternalConnection.OpenOnLocalTransaction(String userName,String password,String serverName,Boolean integratedSecurity,Boolean unicode,Boolean omitOra cleConnectionName)
at System.Data.OracleClient.OracleInternalConnection..ctor(OracleConnectionString connectionOptions)
at System.Data.OracleClient.OracleConnectionFactory.CreateConnection(DbConnectionOptions options,Object poolGroupProviderInfo,DbConnectionPool pool,DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection,DbConnectionPool pool,DbConnectionOptions选项)
at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
at System.Data.ProviderBase .DbConnectionPool.UserCreateRequest(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System System.Data.Ora中的.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection,DbConnectionFactory connectionFactory)
System.Data.Common.DbDataAdapter.FillInternal(DataSet数据集,DataTable [] datatables,Int32 startRecord,Int32 maxRecords,String srcTable,IDbCommand命令,CommandBehavior行为)中的cleClient.OracleConnection.Open()

at System.Data.Common.DbDataAdapter.Fill(DataTable [] dataTables,Int32 startRecord,Int32 maxRecords,IDbCommand command,CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
at FlexiStar.DataProvider.OracleProcedureProvider.GetSpParameterSet(String connectionString,String spName,Boolean includeReturnValueParameter,String&回复)在C:\ Users \ shihabiu \Desktop \ Middleware.Net \Source\QCash Middleware 2.0.2\FlexiStar.DataProvider\MSOracleDataprovider\OracleProcedureProvider.cs:294行





代码

 字符串 cs =  @ 数据源= loacalhost / orcl;集成安全性=否;用户ID = fspro;密码= fspro; 
使用(OracleConnection con = new OracleConnection(cs))
{
OracleDataAdapter da = new OracleDataAdapter( FSO_CFG_SYSTEM_GA,con);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.SelectCommand.Parameters.Add( P_RESULT_SET_OUT,OracleType.Cursor).Direction = ParameterDirection.Output;

DataTable dt = new DataTable();
尝试
{
da.Fill(dt);
}
catch (OracleException e)
{
throw new 异常(e.Message,e.InnerException);
}
catch (例外e)
{
throw new 异常(e.Message,e.InnerException);
}
return dt;
}

解决方案

添加的任何具有NULL值的参数都不会作为参数发送到数据库。这就是Oracle告诉你的原因:SafeHandle不能为空。

使用DBNull.Value而不是NULL



示例:

 da.SelectCommand.Parameters。添加 < span class =code-string> P_RESULT_SET_OUT,OracleType。 Cursor  ?? DBNull.Value)。Direction = ParameterDirection。输出; 


Question:
When i am trying to open the connection of oracle database in C#, then the following error occurred. Mention that this code work on new project. What is the solution for this.

Quote:

ArgumentNullException:

Value cannot be null.
Parameter name: SafeHandle cannot be null.



Stack Trace:

at System.StubHelpers.StubHelpers.SafeHandleAddRef(SafeHandle pHandle, Boolean& success)
at System.Data.Common.UnsafeNativeMethods.OCIAttrSet(OciHandle trgthndlp, HTYPE trghndltyp, Byte[] attributep, UInt32 size, ATTR attrtype, OciHandle errhp)
at System.Data.OracleClient.TracedNativeMethods.OCIAttrSet(OciHandle trgthndlp, Byte[] attributep, UInt32 size, ATTR attrtype, OciHandle errhp)
at System.Data.OracleClient.OciHandle.SetAttribute(ATTR attribute, String value, OciErrorHandle errorHandle)
at System.Data.OracleClient.OracleInternalConnection.OpenOnLocalTransaction(String userName, String password, String serverName, Boolean integratedSecurity, Boolean unicode, Boolean omitOracleConnectionName)
at System.Data.OracleClient.OracleInternalConnection..ctor(OracleConnectionString connectionOptions)
at System.Data.OracleClient.OracleConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.OracleClient.OracleConnection.Open()
at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
at FlexiStar.DataProvider.OracleProcedureProvider.GetSpParameterSet(String connectionString, String spName, Boolean includeReturnValueParameter, String& reply) in C:\Users\shihabiu\Desktop\Middleware.Net\Source\QCash Middleware 2.0.2\FlexiStar.DataProvider\MSOracleDataprovider\OracleProcedureProvider.cs:line 294



Code

String cs = @"Data Source=loacalhost/orcl;Integrated Security=no;User ID=fspro;Password=fspro";
using (OracleConnection con = new OracleConnection(cs))
{
    OracleDataAdapter da = new OracleDataAdapter("FSO_CFG_SYSTEM_GA", con);
    da.SelectCommand.CommandType = CommandType.StoredProcedure;
   da.SelectCommand.Parameters.Add("P_RESULT_SET_OUT", OracleType.Cursor).Direction = ParameterDirection.Output;

    DataTable dt = new DataTable();
    try
    {
        da.Fill(dt);
    }
    catch (OracleException e)
    {
        throw new Exception(e.Message, e.InnerException);
    }
    catch (Exception e)
    {
        throw new Exception(e.Message, e.InnerException);
    }
    return dt;
}

解决方案

any parameter added that has a NULL value will not be send as parameter to the database. That is why Oracle tells you: SafeHandle cannot be null.
Use DBNull.Value in stead of NULL

Example:

da.SelectCommand.Parameters.Add("P_RESULT_SET_OUT", OracleType.Cursor ?? DBNull.Value).Direction = ParameterDirection.Output;


这篇关于当我试图在C#中打开Oracle数据库的连接时,发生以下错误。这是什么解决方案。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆