ravikiran geddam Ответов: 1

Как получить строковое значение из хранимой процедуры в C#?


Привет я использую хранимую процедуру

ALTER PROCEDURE [dbo].[SP_InsTicketSale] 
(
@TktDate date, @TktId nvarchar(50),@Name nvarchar(50),  @Email nvarchar(50), @Mobile varchar(15),@TktStatus nvarchar(50)
,
@EmpId nvarchar(50),@TblLoc_ID varchar(3), @Promoid nvarchar(50), @TaxId nvarchar(50), @Grandtotal decimal(18,2),@subtotal decimal(18,2),

@Details ITEMDATA1   Readonly,

@id nvarchar(5) = NULL OUTPUT
)
AS
BEGIN


if not exists(select * from Tbl_TicketSale where TktId= @TktId)
	Begin
		declare @IdTmp	varchar(5)
    	set @IdTmp = 00000
  	    select @IdTmp = count(*) from Tbl_TicketSale
	   
	    set @IdTmp = @IdTmp + 1
	    set @TktId=   Right(('00000' + @IdTmp),5)

Begin Transaction


INSERT INTO Tbl_Client(TktDate, TktId, Name, Email, Mobile)
VALUES   (@TktDate, @TktId,@Name, @Email, @Mobile)


IF (@@ERROR <> 0) GOTO ERR_HANDLER	

INSERT INTO Tbl_TicketSale (TktId, EmpId, TktDate, TblLoc_ID,  TaxId, Grandtotal,subtotal,TktStatus)
VALUES  (@TktId , @EmpId, @TktDate, @TblLoc_ID, @TaxId , @Grandtotal ,@subtotal,'Delivered')


IF (@@ERROR <> 0) GOTO ERR_HANDLER	

--Temp Table
INSERT INTO Tbl_TicketSaleChild (TktId, ActivityId, Qty, PoxtypeAC, ActPrice, Amt, TktSale_childdate)
Select TktId=@TktId, tActivityId, tQty, tPoxtypeAC, tActPrice, tAmt, tTktSale_childdate from @Details ;

IF (@@ERROR <> 0) GOTO ERR_HANDLER	

End
Commit Transaction

 --RETURN 0
 Return @TktId 
 --select @TktId

ERR_HANDLER:
PRINT 'Unexpected error occurred!'
ROLLBACK Transaction
RETURN 1


END


и C# я использую

//public int InsetTicketSale()
        public void InsetTicketSale()
        {
            int i = 0;
            try
            {

                SqlDBHelper SqlDb = new SqlDBHelper();
                SqlDb.CreateParameters("@TktDate", SqlDbType.Date, TktDate);
                SqlDb.CreateParameters("@TktId", SqlDbType.VarChar, TktId);
                SqlDb.CreateParameters("@Name", SqlDbType.VarChar, Name);
                SqlDb.CreateParameters("@Email", SqlDbType.VarChar, Email);
                SqlDb.CreateParameters("@Mobile", SqlDbType.VarChar, Mobile);
                SqlDb.CreateParameters("@EmpId", SqlDbType.VarChar, EmpId);
                SqlDb.CreateParameters("@TblLoc_ID", SqlDbType.VarChar, TblLoc_ID);
                SqlDb.CreateParameters("@Promoid", SqlDbType.VarChar, Promoid);
                SqlDb.CreateParameters("@TaxId", SqlDbType.VarChar, TaxId);
                SqlDb.CreateParameters("@Grandtotal", SqlDbType.Decimal, Grandtotal);
                SqlDb.CreateParameters("@subtotal", SqlDbType.Decimal, subtotal);
                SqlDb.CreateParameters("@Details", SqlDbType.Structured, Details);
                SqlDb.CreateParameters("@Servtax", SqlDbType.Decimal, Servtax);
                SqlDb.CreateParameters("@vat", SqlDbType.Decimal, vat);
                SqlDb.CreateParameters("@Tax3", SqlDbType.Decimal, Tax3);
                SqlDb.CreateParameters("@Servtaxp", SqlDbType.Decimal, Servtaxp);
                SqlDb.CreateParameters("@vatp", SqlDbType.Decimal, vatp);
                SqlDb.CreateParameters("@Tax3p", SqlDbType.Decimal, Tax3p);
                SqlDb.CreateParameters("@TktStatus", SqlDbType.VarChar, TktStatus);
                

                SqlDb.ProcedureName = "[SP_InsTicketSale]";

                i = Convert.ToInt32(SqlDb.ExecuteNonQueryReturn());
            }
            catch (Exception Excep)
            {
                throw new ApplicationException(Excep.Message);
            }
           // return i;
        }


Что я уже пробовал:

в C# я пробовал int type и executenonquery() он получал количество выполненных транзакций,
я получаю null как при использовании комбинации string и executescalar

Andy Lanng

Если вы используете ExecuteScalar, попробуйте Select @TktId / Select 1

Возвращаемые значения имеют несколько иное применение

ravikiran geddam

я благодаря вам я varhcar getrrin как выход, как '000010', как это

1 Ответов

Рейтинг:
0

NaibedyaKar

ExecuteNonQuery () вернет количество затронутых записей. Что было бы числом.
Executrescalar () вернет первый столбец верхней строки. Поэтому вместо этого вы должны использовать Executrescalar ().

Узнайте больше от Разница между ExecuteReader ExecuteScalar и ExecuteNonQuery[^]


ravikiran geddam

Привет, большое вам спасибо за ответ.
Но даже я использовал Executitescalar() в качестве строки, но я получаю null, и процедура выполнялась успешно

NaibedyaKar

Используйте SELECT @TktId вместо Return @TktId.