2012-01-31 4 views
0

내부에 저장 프로 시저가있는 데이터베이스가 있습니다. SqlHelper를 사용하여 프로 시저를 실행하려고합니다. 그러나 나는 이상한 오류가 발생했습니다.DataAccessLayer.SqlHelper. 저장 프로 시저. 출력 매개 변수

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; 
     } 

내 저장 프로 시저가 여기에 다음과 같습니다 :

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 여기에 떨어지면 내가 바로 모든 일을했다고 생각

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 

,하지만 난 할 수 없습니다 왜 내가이 오류가 발생했는지 설명하십시오. 알려주십시오! ..

답변

0

당신은 intscope_identity을 캐스팅 ExecuteScalar 대신 ExecuteNonQuery을 사용해야 주셔서 감사합니다.

SQL

SELECT CAST(scope_identity() AS int) 

C#을

int retval = (Int32)cmd.ExecuteScalar(); 
관련 문제