Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从DbCommand对象转换为OracleCommand对象_C#_Asp.net_Oracle_Oracleclient - Fatal编程技术网

C# 从DbCommand对象转换为OracleCommand对象

C# 从DbCommand对象转换为OracleCommand对象,c#,asp.net,oracle,oracleclient,C#,Asp.net,Oracle,Oracleclient,我继承了ASP.NET(C#)应用程序中的一个函数,作者在该应用程序中使用了Microsoft.Practices.EnterpriseLibrary.Data library,但我被要求更改它,以便它使用System.Data.OracleClient。此函数使用数据库中的存储过程itemName和openDate是函数接受的字符串参数PKG\u AUCTION\u ITEMS.IsAuctionItem是存储过程函数名 以下是我收到的代码: string result = Strin

我继承了ASP.NET(C#)应用程序中的一个函数,作者在该应用程序中使用了
Microsoft.Practices.EnterpriseLibrary.Data library
,但我被要求更改它,以便它使用
System.Data.OracleClient
。此函数使用数据库中的存储过程
itemName
openDate
是函数接受的字符串参数
PKG\u AUCTION\u ITEMS.IsAuctionItem
是存储过程函数名

以下是我收到的代码:

    string result = String.Empty;

    Database db = DatabaseFactory.CreateDatabase("OraData");
    using (DbCommand cmdDB = db.GetStoredProcCommand("PKG_AUCTION_ITEMS.IsAuctionItem"))
    {
        db.AddInParameter(cmdDB, "vItemName", DbType.String, itemName);
        db.AddInParameter(cmdDB, "vOpenDate", DbType.String, openDate);
        db.AddParameter(cmdDB, "ret", DbType.String, 2, ParameterDirection.ReturnValue, false, 0, 0, null, DataRowVersion.Current, null);


        db.ExecuteNonQuery(cmdDB);
        result = cmdDB.Parameters["ret"].Value.ToString();
    }
这是我的代码:(
connstr
是连接字符串)

我不明白AddInParameter和AddParameter之间的区别是什么,以及此行的作用是什么:

db.AddParameter(cmdDB, "ret", DbType.String, 2, ParameterDirection.ReturnValue, false, 0, 0, null, DataRowVersion.Current, null);
我走对了吗?有人能帮忙吗?
谢谢

db.AddParameter在本例中添加了一个输出参数。您需要让db客户机库知道您正在寻找从存储过程调用返回的值。因此调用AddParameter。db.AddInParameter添加一个仅为in参数的参数。在中,它是使用ParameterDirection.Input的db.AddParameter的快捷方式。有关AddInParameter与AddParameter的讨论,请参阅

类似地,使用OracleClient时,AddWithValue类似于AddInParameter——当您已经知道值时,用于输入参数的快捷方式。因为根据定义,返回值是一个输出参数,所以不能使用AddWithValue。您需要改为使用Parameters.Add()

现在,回到您的主要问题:使用OracleClient的等效代码是什么。是这样的:

string result = String.Empty;
OracleConnection conn = new OracleConnection(connstr);
OracleCommand cmd = new OracleCommand("PKG_AUCTION_ITEMS.IsAuctionItem",conn);
myCmd.CommandType = CommandType.StoredProcedure;

using (myCmd)
{
    myCmd.Parameters.AddWithValue("vItemName", itemName);
    myCmd.Parameters.AddWithValue("vOpenDate", openDate);

    // depending on whether you're using Microsoft's or Oracle's ODP, you 
    // may need to use OracleType.Varchar instead of OracleDbType.Varchar2.
    // See http://forums.asp.net/t/1002097.aspx for more details.
    OracleParameter retval = new OracleParameter("ret",OracleDbType.Varchar2,2);
    retval.Direction = ParameterDirection.ReturnValue;
    myCmd.Parameters.Add(retval);

    myCmd.ExecuteNonQuery();
    result = myCmd.Parameters["ret"].Value.ToString();
}

在这种情况下,db.AddParameter会添加一个输出参数。您需要让db客户机库知道您正在寻找从存储过程调用返回的值。因此调用AddParameter。db.AddInParameter添加一个仅为in参数的参数。在中,它是使用ParameterDirection.Input的db.AddParameter的快捷方式。有关AddInParameter与AddParameter的讨论,请参阅

类似地,使用OracleClient时,AddWithValue类似于AddInParameter——当您已经知道值时,用于输入参数的快捷方式。因为根据定义,返回值是一个输出参数,所以不能使用AddWithValue。您需要改为使用Parameters.Add()

现在,回到您的主要问题:使用OracleClient的等效代码是什么。是这样的:

string result = String.Empty;
OracleConnection conn = new OracleConnection(connstr);
OracleCommand cmd = new OracleCommand("PKG_AUCTION_ITEMS.IsAuctionItem",conn);
myCmd.CommandType = CommandType.StoredProcedure;

using (myCmd)
{
    myCmd.Parameters.AddWithValue("vItemName", itemName);
    myCmd.Parameters.AddWithValue("vOpenDate", openDate);

    // depending on whether you're using Microsoft's or Oracle's ODP, you 
    // may need to use OracleType.Varchar instead of OracleDbType.Varchar2.
    // See http://forums.asp.net/t/1002097.aspx for more details.
    OracleParameter retval = new OracleParameter("ret",OracleDbType.Varchar2,2);
    retval.Direction = ParameterDirection.ReturnValue;
    myCmd.Parameters.Add(retval);

    myCmd.ExecuteNonQuery();
    result = myCmd.Parameters["ret"].Value.ToString();
}

我们实际上更明确地配置参数,类似这样

System.Data.OracleClient.OracleCommand command = new System.Data.OracleClient.OracleCommand("PACKAGE_NAME.STORED_NAME");
command.CommandType = System.Data.CommandType.StoredProcedure;

System.Data.OracleClient.OracleParameter param;
param = new System.Data.OracleClient.OracleParameter("PARAM_NAME_ID", System.Data.OracleClient.OracleType.Number);
param.Value = id;
command.Parameters.Add(param);

param = new System.Data.OracleClient.OracleParameter("PARAM_NAME_RETURN_COUNT", System.Data.OracleClient.OracleType.Number);
param.Direction = System.Data.ParameterDirection.Output;
command.Parameters.Add(param);
...
你看,我们为返回的参数显式地指定了一个属性方向。第一个获取变量“id”的值,是传递给存储过程的参数


第二个参数是由存储过程返回的,因此没有为该参数值分配任何值,并且方向设置为
“System.Data.ParameterDirection.Output”

我们实际上更明确地配置参数,类似这样

System.Data.OracleClient.OracleCommand command = new System.Data.OracleClient.OracleCommand("PACKAGE_NAME.STORED_NAME");
command.CommandType = System.Data.CommandType.StoredProcedure;

System.Data.OracleClient.OracleParameter param;
param = new System.Data.OracleClient.OracleParameter("PARAM_NAME_ID", System.Data.OracleClient.OracleType.Number);
param.Value = id;
command.Parameters.Add(param);

param = new System.Data.OracleClient.OracleParameter("PARAM_NAME_RETURN_COUNT", System.Data.OracleClient.OracleType.Number);
param.Direction = System.Data.ParameterDirection.Output;
command.Parameters.Add(param);
...
你看,我们为返回的参数显式地指定了一个属性方向。第一个获取变量“id”的值,是传递给存储过程的参数


第二个参数由存储过程返回,因此没有为该参数值分配任何值,并且方向设置为
“System.Data.ParameterDirection.Output”

为什么要求您更改它?您应该可以将配置文件更改为使用Oracle。Microsoft.Practice库不是此处使用的标准库,因此生成引擎没有它。因此,无法在服务器上生成项目。您可能必须在web服务器上安装Enterprise library才能使其正常工作。为什么要求您更改它?您应该可以将配置文件更改为使用Oracle。Microsoft.Practice库不是此处使用的标准库,因此生成引擎没有它。因此,无法在服务器上生成项目。您可能必须在web服务器上安装Enterprise Library才能使其正常工作。因此,如果我使用的是
OracleClient
,那么
AddInParameter
的等价物是什么呢?我将分别创建参数,设置ParameterDirection.ReturnValue,然后使用Parameters.Add()。请参见上文——我编辑了答案以显示代码示例。那么,如果我使用的是
OracleClient
,那么与
AddInParameter
的等价物是什么呢?我将分别创建参数,设置ParameterDirection.ReturnValue,然后使用Parameters.Add()。请参见上文——我编辑了答案以显示代码示例。