DataAccessLayer.SqlHelper.Stored过程。输出参数

时间:2012-01-31 16:17:30

标签: .net sqlhelper

我有一个包含存储过程的数据库。 我正在尝试使用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 :(得分:0)

您应该将scope_identity投放到int并使用ExecuteScalar代替ExecuteNonQuery

SQL

SELECT CAST(scope_identity() AS int)

C#

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