0

内部にストアド プロシージャを含むデータベースがあります。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

すべてを正しく行ったと思っていましたが、なぜこのエラーが発生したのか説明できません。アドバイスしてください!!ありがとう..

4

1 に答える 1

0

にキャストscope_identityして代わりにint使用する必要があります。ExecuteScalarExecuteNonQuery

SQL

SELECT CAST(scope_identity() AS int)

c#

int retval = (Int32)cmd.ExecuteScalar(); 
于 2012-08-21T20:47:43.167 に答える