【问题标题】:Converting from DbCommand object to OracleCommand object从 DbCommand 对象转换为 OracleCommand 对象
【发布时间】:2009-09-18 20:28:45
【问题描述】:

我在作者使用Microsoft.Practices.EnterpriseLibrary.Data library 的 ASP.NET (C#) 应用程序中继承了一个函数,但有人要求我对其进行更改,以便它使用System.Data.OracleClient。该函数使用存储过程形成数据库。 itemNameopenDate是函数传入的字符串参数。PKG_AUCTION_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 是连接字符串)

    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);
        myCmd.Parameters.AddWithValue("ret", ???);
        myCmd.ExecuteNonQuery();
        result = myCmd.Parameters["ret"].Value.ToString();
    }

我不明白 AddInParameter 和 AddParameter 有什么区别,这行是做什么的:

db.AddParameter(cmdDB, "ret", DbType.String, 2, ParameterDirection.ReturnValue, false, 0, 0, null, DataRowVersion.Current, null);

我在正确的轨道上吗?有人可以帮忙吗? 谢谢

【问题讨论】:

  • 为什么要求您更改它?您应该能够更改配置文件以使用 Oracle。
  • 这里使用的Microsoft.Practice库不是标准库,所以构建引擎没有。因此无法在服务器上构建项目。
  • 您可能必须在您的网络服务器上安装 Enterprise Library 才能使其工作。

标签: c# asp.net oracle oracleclient


【解决方案1】:

db.AddParameter 在这种情况下添加了一个输出参数。您需要让 db 客户端库知道您希望从 sproc 调用中获取返回值。因此调用 AddParameter。 db.AddInParameter 添加一个参数,该参数只是一个内参数。在它是使用 ParameterDirection.Input 的 db.AddParameter 的快捷方式。有关 AddInParameter 与 AddParameter 的讨论,请参阅 http://blogs.x2line.com/al/archive/2006/03/25/1579.aspx

类似地,使用 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();
}

【讨论】:

  • 如果我使用OracleClient,那么AddInParameter 的等价物是什么?
  • 我会单独创建参数,设置ParameterDirection.ReturnValue,然后使用Parameters.Add()。见上文——我编辑了答案以显示代码示例。
【解决方案2】:

我们实际上更明确地进行参数的配置,像这样

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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2020-06-15
    • 2016-03-11
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多