2011-03-07 11 views
8

Al conseguir un valor devuelto de un procedimiento almacenado, que sólo devuelve el primer carácter,El valor de retorno de un procedimiento almacenado obtiene el primer personaje sólo en ASP.NET

Exec sp_Auto_Gen_TTBDBatNo 'TT', '' en SQL   servidor obtiene toda la cadena, pero en ASP.NET obtiene el primer personaje.

¿Cómo obtengo el valor de la cadena completa?

CREATE PROC sp_Auto_Gen_TTBDBatNo 
     @Prefix nvarchar(2), 
     @Result nvarchar(8) output 
AS 
BEGIN 
    DECLARE @LastValue int 


    -- CompanyCode = @CompanyCode AND BankCode = @BankCode AND AccountCode = @AccountCode 

    SET NOCOUNT ON 
    If @Prefix = 'BD' 
     SELECT @LastValue = MAX(RIGHT(RTRIM(ISNULL(BatchNo, '')),2)) from dbo.Cheque_IssueRecord_Secretary_Review_BD WHERE ISNUMERIC(RIGHT(RTRIM(BatchNo),2))= 1 AND LEN(RIGHT(RTRIM(BatchNo),2)) = 2 
    ELSE 
     SELECT @LastValue = MAX(RIGHT(RTRIM(ISNULL(BatchNo, '')),2)) from dbo.Cheque_IssueRecord_Secretary_Review_TT WHERE ISNUMERIC(RIGHT(RTRIM(BatchNo),2))= 1 AND LEN(RIGHT(RTRIM(BatchNo),2)) = 2 

    SET NOCOUNT OFF 
    set @Result = @Prefix + RIGHT(RTRIM(STR(year(getdate()))),2)+RIGHT('0'+LTRIM(RTRIM(STR(month(getdate())))),2) + RIGHT('0'+LTRIM(RTRIM(STR(ISNULL(@LastValue,0)+1))),2) 

    print @Result 
END 

código C#:

string tAuto_Batch = ""; 

SqlTransaction trans = null; 
using (SqlConnection connection = new SqlConnection(_connectionString)) 
{ 
    try 
    { 
     SqlCommand command = new SqlCommand("sp_Auto_Gen_TTBDBatNo", connection); 
     command.CommandType = CommandType.StoredProcedure; 

     command.Parameters.Add(new SqlParameter("@Prefix", "TT")); 
     //command.Parameters.Add(new SqlParameter("@CompanyCode", cheque.Voucherbatchno)); 
     //command.Parameters.Add(new SqlParameter("@BankCode", cheque.Voucherno)); 
     //command.Parameters.Add(new SqlParameter("@AccountCode", cheque.Voucherno)); 

     SqlParameter ResultValue = new SqlParameter("@Result", tAuto_Batch); 
     ResultValue.Direction = ParameterDirection.Output; 

     command.Parameters.Add(ResultValue); 

     connection.Open(); 
     trans = connection.BeginTransaction(); 
     command.Transaction = trans; 
     command.Connection = connection; 

     command.ExecuteNonQuery(); 
     trans.Commit(); 

     tAuto_Batch = command.Parameters["@Result"].Value.ToString(); 

     command.Dispose(); 
     trans.Dispose(); 
     connection.Close(); 

    } 
    catch (Exception ex) 
    { 
     connection.Close(); 
     Error_Label.Text = Error_Label.Text + "sp_Auto_Gen_TTBDBatNo error " + ex.Message; 
    } 
} 

Respuesta

10

Asegúrese de que realmente lo usa así:

@Result NVARCHAR(8) OUTPUT 
SqlParameter resultValue = new SqlParameter("@Result", SqlDbType.NVarChar, 8); 

La longitud predeterminada de las (N) columnas VARCHAR es 1.

1

encuentro la respuesta con:

command.Parameters["@Result"].size = 50 
+0

50 es un poco exagerado, si en el procedimiento almacenado define la longitud como 8. –

2

Según MSDN:

Para los parámetros de salida con un tipo de longitud variable (nvarchar, por ejemplo), el tamaño del parámetro define el tamaño de la memoria intermedia que sostiene el parámetro de salida. El parámetro de salida se puede truncar a un tamaño especificado con Tamaño.

Por lo tanto, es importante especificar el tamaño para los parámetros out.

Cuestiones relacionadas