得不到存储过程return参数问题?

ebayboy 2009-01-27 09:56:58
存储过程:

ALTER procedure GetCustomer @CustomerID nchar(5),
@CompanyName nvarchar(40) output,
@ContactName nvarchar(30) output,
@ContactTitle nvarchar(30) output as
select @CompanyName=CompanyName,@ContactName=ContactName,
@ContactTitle=ContactTitle
FROM Customers where CustomerID=@CustomerID
IF @@rowcount = 1
return 0
ELSE
return -1

程序:
string strConn;
strConn = "Provider=SQLOLEDB;Data Source=(local);Initial Catalog=Northwind;uid=sa;pwd=sa";
OleDbConnection cn = new OleDbConnection(strConn);
cn.Open();

OleDbCommand cmd = cn.CreateCommand();
cmd.CommandText = "GetCustomer";
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("@CustomerID",OleDbType.WChar,5);
cmd.Parameters.Add("@CompanyName",OleDbType.VarWChar,40);
cmd.Parameters.Add("@ContactName",OleDbType.VarWChar,30);
cmd.Parameters.Add("@ContactTitle",OleDbType.VarWChar,30);
cmd.Parameters.Add("@RetVal",OleDbType.Integer);

cmd.Parameters["@CustomerID"].Value="ALFKI";
cmd.Parameters["@CompanyName"].Direction = ParameterDirection.Output;
cmd.Parameters["@ContactName"].Direction = ParameterDirection.Output;
cmd.Parameters["@ContactTitle"].Direction = ParameterDirection.Output;
cmd.Parameters["@RetVal"].Direction = ParameterDirection.ReturnValue;

try
{
cmd.ExecuteNonQuery();
}
catch(OleDbException ex)
{
Console.WriteLine(ex.Message);
Console.ReadLine();
}
cn.Close();

if(Convert.ToInt32(cmd.Parameters["@RetVal"].Value)==0)
Console.WriteLine(cmd.Parameters["@CompanyName"].Value);
else
Console.WriteLine("Customer not found.");
调试的时候出异常:为过程或函数 GetCustomer 指定的参数太多。
我把:参数@RetVal去掉,运行正常;
很困惑,请高手帮忙看下,谢谢。

...全文
52 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
king19840811 2009-01-27
  • 打赏
  • 举报
回复
ALTER procedure GetCustomer @CustomerID nchar(5),
@CompanyName nvarchar(40) output,
@ContactName nvarchar(30) output,
@ContactTitle nvarchar(30) output as
在这里定义一个参数@RetVal int
valenhua 2009-01-27
  • 打赏
  • 举报
回复
cmd.Parameters.Add("@RetVal",OleDbType.Integer);
这句不用写的,只写取返回的值就可以了。

参照我的一个函数

public static VExmSMSLogDataTable GetSMSLogList(string strCaseID, string strNodeCode,
int startRowIndex, int maximumRows)
{
Database db = MTH2HBaseLib.DataEntHelper.CreateDatabase();
DbCommand dbcSelect = db.GetStoredProcCommand("pExmSMSLog");
db.AddInParameter(dbcSelect, "StartRowIndex", DbType.Int32, startRowIndex);
db.AddInParameter(dbcSelect, "MaximumRows", DbType.Int32, maximumRows);
db.AddInParameter(dbcSelect, "CaseID", DbType.String, strCaseID);
db.AddInParameter(dbcSelect, "NodeCode", DbType.String, strNodeCode);
dbcSelect.CommandTimeout = StructSystemConst.CommandTimeOut;

DbParameter dbParm = dbcSelect.CreateParameter();
dbParm.DbType = DbType.Int32;
dbParm.ParameterName = "@TotalRecord";
dbParm.Direction = ParameterDirection.ReturnValue;
dbcSelect.Parameters.Add(dbParm);
DataSet dstTemp = db.ExecuteDataSet(dbcSelect);
intSMSLogCount = int.Parse(db.GetParameterValue(dbcSelect, "@TotalRecord").ToString());
VExmSMSLogDataTable dtSMSLog = new VExmSMSLogDataTable();
dtSMSLog.Merge(dstTemp.Tables[0]);
return dtSMSLog;
}
white_dos 2009-01-27
  • 打赏
  • 举报
回复
ALTER procedure GetCustomer @CustomerID nchar(5),
@CompanyName nvarchar(40) output,
@ContactName nvarchar(30) output,
@ContactTitle nvarchar(30) output as
select @CompanyName=CompanyName,@ContactName=ContactName,
@ContactTitle=ContactTitle
FROM Customers where CustomerID=@CustomerID
IF @@rowcount = 1
return 0
ELSE
return -1
这里面没有@RetVal

111,131

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧