我在ASP.NET(C#)应用程序中继承了一个函数,其中作者使用Microsoft.Practices.EnterpriseLibrary.Data library
,但我被要求更改它以便它使用System.Data.OracleClient
。此函数使用存储过程形成数据库。 itemName
和openDate
是函数接受的字符串参数。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);
我是否在正确的轨道上?有人可以帮忙吗? 感谢
答案 0 :(得分: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();
}
答案 1 :(得分: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"