积极答复者
问存储过程的“返回值”

问题
-
有一个存储过程,如下:
ALTER PROCEDURE [dbo].[Usp_TransferTest] (
@MeterNo Char(20),
@MeterType Char(4),
@DATime Datetime,
-- @Qty Decimal(18,6),
@Unit Char(4)
)
as
Begin
Set Nocount On;
Declare @DAYear Char(4);
Declare @DAMonth Char(2);
Declare @DADay Char(2);
Declare @DAHour Char(2);
Declare @Time Char(10);
Declare @AvgQty Decimal(18,6);
Declare @RowCnt1 Int;
Declare @RowCnt2 Int;
Declare @RowCnt3 Int;
Declare @RowCnt4 Int;
Set @DAYear = Substring(Ltrim(Rtrim(Convert(varchar(10),@DATime,120))),1,4);
Set @DAMonth = Substring(Ltrim(Rtrim(Convert(varchar(10),@DATime,120))),6,2);
Set @DADay = Substring(Ltrim(Rtrim(Convert(varchar(10),@DATime,120))),9,2);
Set @DAHour = Substring(Ltrim(Rtrim(Convert(varchar(10),@DATime,114))),1,2);
Set @Time = Replace((Replace(CONVERT(varchar(13),@DATime, 20),'-','')),' ','');
Set @AvgQty = (select AVG(Qty) from SpecialMonitorData where Replace((Replace
(CONVERT(varchar(13), DATime, 20),'-','')),' ','')=@Time and MeterNo=@MeterNo)
Set @RowCnt4 = (Select Count(*) From SpecialDataSumByHour Where MeterNo =
@MeterNo
And MeterType = @MeterType And DADay = IsNull(@DAYear,'') + IsNull
(@DAMonth,'') + IsNull(@DADay,'')
And DAHour = @DAHour);
If IsNull(@RowCnt4,0) = 0
Begin
Set @RowCnt4 = 0;
End
If @RowCnt4 > 0
Begin
Update SpecialDataSumByHour Set AvgQty = @AvgQty
Where MeterNo = @MeterNo
And MeterType = @MeterType
And DADay = IsNull(@DAYear,'') + IsNull(@DAMonth,'') +
IsNull(@DADay,'')
And DAHour = @DAHour ;
End
Else
Begin
Insert SpecialDataSumByHour
(MeterNo,MeterType,DADay,DAHour,AvgQty,Unit)
Select @MeterNo,@MeterType,IsNull(@DAYear,'') + IsNull
(@DAMonth,'') + IsNull(@DADay,''),@DAHour,@AvgQty,@Unit;
End
End
问题:
这样一个存储过程,当它执行成功了也不会有大于零的返回值。C#中执行存储过程的“Command”对象根本不知道,执行成功了吗??? 它执行成功了,返回的值也是“-1”。
怎样修改存储过程可以有一个返回值,当存储过程执行成功了,那么返回值为“1”??? 主要指“Update”和“Insert”有一个成功就行了,那是判断条件。
Science and technology is my lover.
答案
-
你直接return一个0或者1就好了。
family as water
- 已编辑 Stone Z 2013年1月11日 8:28
- 已建议为答案 TerryChuang 2013年1月11日 8:54
- 取消建议作为答案 TerryChuang 2013年1月11日 9:19
- 已标记为答案 starrycheng 2013年1月14日 5:10
-
请搜索ParameterDirection.ReturnValue 和 RETURN (Transact-SQL)
想不想时已是想,不如不想都不想。
- 已标记为答案 starrycheng 2013年1月14日 5:10
全部回复
-
你直接return一个0或者1就好了。
family as water
- 已编辑 Stone Z 2013年1月11日 8:28
- 已建议为答案 TerryChuang 2013年1月11日 8:54
- 取消建议作为答案 TerryChuang 2013年1月11日 9:19
- 已标记为答案 starrycheng 2013年1月14日 5:10
-
“return @@ROWCOUNT”,这样也不行啊,大师。
Command对象执行成功了,但是返回值还是“-1”。
就算“return 1”,它还是返回“-1”。
难道是:
public int ExecuteNonQuery(string strSql, params SqlParameter[] paramter)
{
SqlCommand cmd = new SqlCommand(strSql, Connection);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddRange(paramter);
int count = Convert.ToInt32(cmd.ExecuteNonQuery());
connection.Close();
//connection.Dispose();
return count;
}有问题??? 但是这个方法直接执行“增加”、“删除”、“更新”都是返回值啊。
Science and technology is my lover.
- 已编辑 starrycheng 2013年1月11日 8:46
-
谢谢,大师。但是,还有一个问题。
ALTER PROCEDURE [dbo].[Usp_TransferDAListToSpecialMonitorData] (
@MeterNo Char(20),
@MeterType Char(4),
@DATime Datetime,
-- @Qty Decimal(18,6),
@Unit Char(4)
)
as
Begin
Set Nocount On;
Declare @DAYear Char(4);
Declare @DAMonth Char(2);
Declare @DADay Char(2);
Declare @DAHour Char(2);
Declare @Time Char(10);
Declare @AvgQty Decimal(18,6);
Declare @RowCnt1 Int;
Declare @RowCnt2 Int;
Declare @RowCnt3 Int;
Declare @RowCnt4 Int;
Set @DAYear = Substring(Ltrim(Rtrim(Convert(varchar(10),@DATime,120))),1,4);
Set @DAMonth = Substring(Ltrim(Rtrim(Convert(varchar(10),@DATime,120))),6,2);
Set @DADay = Substring(Ltrim(Rtrim(Convert(varchar(10),@DATime,120))),9,2);
Set @DAHour = Substring(Ltrim(Rtrim(Convert(varchar(10),@DATime,114))),1,2);
Set @Time = Replace((Replace(CONVERT(varchar(13),@DATime, 20),'-','')),' ','');
Set @AvgQty = (select AVG(Qty) from SpecialMonitorData where Replace((Replace
(CONVERT(varchar(13), DATime, 20),'-','')),' ','')=@Time and MeterNo=@MeterNo)
Set @RowCnt4 = (Select Count(*) From SpecialDataSumByHour Where MeterNo =
@MeterNo
And MeterType = @MeterType And DADay = IsNull(@DAYear,'') + IsNull
(@DAMonth,'') + IsNull(@DADay,'')
And DAHour = @DAHour);
If IsNull(@RowCnt4,0) = 0
Begin
Set @RowCnt4 = 0;
End
If @RowCnt4 > 0
Begin
Update SpecialDataSumByHour Set AvgQty = @AvgQty
Where MeterNo = @MeterNo
And MeterType = @MeterType
And DADay = IsNull(@DAYear,'') + IsNull(@DAMonth,'') +
IsNull(@DADay,'')
And DAHour = @DAHour ;
End
Else
Begin
Insert SpecialDataSumByHour
(MeterNo,MeterType,DADay,DAHour,AvgQty,Unit)
Select @MeterNo,@MeterType,IsNull(@DAYear,'') + IsNull
(@DAMonth,'') + IsNull(@DADay,''),@DAHour,@AvgQty,@Unit;
End
print '执行了'
--select @@ROWCOUNT as [Return]
return @@ROWCOUNT
--return 1
End
问题:“Insert”或“Update”执行成功了后,“@@ROWCOUNT”的值并不会变为“1”啊???
“@@ROWCOUNT”的值是记录插入或更新影响的行的吗???
直接“Return 1”是可以获取的,但是有更新或是插入的时候“@@ROWCOUNT”也是“0”,Why???Science and technology is my lover.
-
-
请搜索ParameterDirection.ReturnValue 和 RETURN (Transact-SQL)
想不想时已是想,不如不想都不想。
- 已标记为答案 starrycheng 2013年1月14日 5:10