2009-09-18 207 views
1

我在ASP.NET(C#)应用程序中继承了一个函数,其中作者使用Microsoft.Practices.EnterpriseLibrary.Data library,但我被要求更改它以便它使用System.Data.OracleClient。这个函数使用一个存储过程形式的数据库。 itemNameopenDate是函数接受的字符串参数。PKG_AUCTION_ITEMS.IsAuctionItem是存储过程函数名称。从DbCommand对象转换为OracleCommand对象

下面是我收到的代码:

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之间的区别是什么,以及此行的功能:

​​

我在右边tr ACK?任何人都可以帮忙吗? 谢谢

+0

你为什么会被要求去改变它?你应该已经能够改变配置文件来使用Oracle。 – CAbbott 2009-09-18 20:37:11

+0

Microsoft.Practice库不是这里使用的标准库,所以构建引擎没有它。因此,该项目无法在服务器上构建。 – zohair 2009-09-18 20:50:30

+0

您可能必须在您的Web服务器上安装Enterprise Library才能使其工作。 – Juri 2009-09-19 16:48:50

回答

1

在这种情况下,db.AddParameter会添加一个输出参数。您需要让数据库客户端库知道您正在寻求从sproc调用返回的返回值。因此调用AddParameter。 db.AddInParameter添加一个参数,它只是一个in-parameter。在这是使用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(); 
} 
+0

那么,如果我使用的是“OracleClient”,那么AddInParameter会相当于什么呢? – zohair 2009-09-19 09:10:36

+0

我会单独创建参数,设置ParameterDirection.ReturnValue,然后使用Parameters.Add()。请参阅上文 - 我编辑答案以显示代码示例。 – 2009-09-19 17:04:56

+0

谢谢!这完美的作品! – zohair 2009-09-21 14:09:34

0

我们实际上做的参数更明确的配置,这样的事情

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"