2012-01-31 78 views
0

我有一个内部存储过程的数据库。 我正在尝试使用SqlHelper执行过程。但是我得到奇怪的错误。DataAccessLayer.SqlHelper.Stored过程。输出参数

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 

我想我已经做了一切正确的,但我不能解释为什么我得到这个错误。 请指教!谢谢。

回答

0

你应该投scope_identityint和使用ExecuteScalar代替ExecuteNonQuery

SQL

SELECT CAST(scope_identity() AS int) 

C#

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