DataAccessLayer.SqlHelper.Stored процедуры. Выходные параметры - PullRequest
0 голосов
/ 31 января 2012

У меня есть база данных с хранимой процедурой внутри.Я пытаюсь выполнить процедуру с помощью SqlHelper.Однако я получаю странную ошибку.

 public override User Insert(User entity)
  {
           var param = new SqlParameter() { Direction = ParameterDirection.Output, ParameterName = "@UserId", SqlDbType = SqlDbType.Int };
           int result = SqlHelper.ExecuteNonQuery(_connectionString, "sp_User_Insert",
                    param,
                    new SqlParameter("@Name", entity.Name),
                    new SqlParameter("@Password", entity.Password),
                    new SqlParameter("@Created", entity.Created),
                    new SqlParameter("@LastAccessed", entity.LastAccessed),
                    new SqlParameter("@LastLogin", entity.LastLogin),
                    new SqlParameter("@Email", entity.Email),
                    new SqlParameter("@CommunityId", entity.Community.Id));

            entity.Id = Convert.ToInt32(param.Value);

            return entity;           
    }

Мой dataAccesLayer находится здесь в SqlHelper.cs:

public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
        {
            SqlCommand cmd = new SqlCommand();
            PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters);

            int retval = cmd.ExecuteNonQuery(); //Stops here with InvalidCastException.Failed to convert parameter value from a SqlParameter to a String.


            cmd.Parameters.Clear();
            return retval;
        }

Моя хранимая процедура выглядит следующим образом:

ALTER PROCEDURE [dbo].[sp_User_Insert]
    @UserId int OUTPUT,
    @Name varchar(50),
    @Password varchar(50),
    @Created datetime,
    @LastAccessed datetime,
    @LastLogin datetime,
    @Email nchar(50),
    @CommunityId int    
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
    BEGIN TRANSACTION;

    INSERT INTO [User] 
    VALUES( @Name,@Password,@Created,@LastAccessed,@LastLogin,@Email,@CommunityId);

    SET @UserId = SCOPE_IDENTITY();

    COMMIT TRANSACTION;
END

Я думал, что все сделал правильно, но не могу объяснить, почему я получил эту ошибку.Пожалуйста, сообщите! Спасибо ..

1 Ответ

0 голосов
/ 22 августа 2012

Вы должны привести scope_identity к int и использовать ExecuteScalar вместо ExecuteNonQuery.

SQL

SELECT CAST(scope_identity() AS int)

c #

int retval = (Int32)cmd.ExecuteScalar(); 
...