存储过程无法正常工作错误转换数据类型

时间:2014-01-08 09:49:58

标签: c# sql-server stored-procedures

尝试通过UserId获取用户名 - 我有以下存储过程:

ALTER PROCEDURE [dbo].[GET_UsernameByUserId_SP](
        @UserId             int,
        @ExecutionResult    nvarchar(64)    OUTPUT
        )
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    SET @ExecutionResult = (SELECT TOP 1 Username FROM UserProfile WHERE UserId = @Userid);

END

由以下方法执行:

    public string CallSpRetStr(String spName, SqlParameter[] sqlParams)
    {
        string sRet = null;

        myCommand.CommandType = CommandType.StoredProcedure;
        myCommand.CommandText = spName;

        myCommand.Parameters.Clear();
        myCommand.Parameters.AddRange(sqlParams);

        myCommand.Parameters.AddWithValue("@ExecutionResult", DbType.String);
        myCommand.Parameters[myCommand.Parameters.Count - 1].Direction = ParameterDirection.Output;

        try
        {
            if (myConnection.State == ConnectionState.Open)
            {
                myCommand.ExecuteNonQuery();
            }
            else
            {
                OpenConnection();
                myCommand.ExecuteNonQuery();
                CloseConnection();
            }
            sRet = myCommand.Parameters["@ExecutionResult"].Value.ToString();
        }
        catch (Exception ex)
        {
            CloseConnection();
        }

        return sRet;
    }

通过以下方法调用:

    public string GetUsernameByUserId(int UserId)
    {
        SqlParameter[] parameters = new SqlParameter[1];
        parameters[0] = new SqlParameter("@UserId", UserId);

        return dal.CallSpRetStr("GET_UsernameByUserId_SP", parameters);
    }

在运行时,我收到以下错误消息(由CallSpRetStr中的try-catch捕获): '将数据类型nvarchar转换为int'时出错。

我现在一直在墙上撞了一个多小时,尝试疯狂的事情等等。 我有两个问题: 1.有谁知道上述所有问题? 2.有人知道用户名获取用户名的更好方法吗?

提前致谢。

1 个答案:

答案 0 :(得分:4)

此行不正确

myCommand.Parameters.AddWithValue("@ExecutionResult", DbType.String);

应该是

myCommand.Parameters.AddWithValue("@ExecutionResult", new string(' ', 64);

对于第二个参数,AddWithValue方法需要命名参数的当前值,但是您传递枚举(DbType.String == (int)16)。 AddWithValue然后尝试使用与传递的值对应的数据类型构建参数,从而创建整数参数。当然,您的存储过程需要nvarchar类型

,这是不可接受的

另外,我会使用AddWithValue的返回值而不是参数集上的索引来删除任何可能误解输出的参数

 SqlParameter p myCommand.Parameters.AddWithValue("@ExecutionResult", new string(' ', 64);
 p.Direction = ParameterDirection.Output;

请注意,我们需要创建一个正确大小的字符串,因为AddWithValue不知道存储过程中参数的预期大小,因此它创建的参数的大小等于传递的字符串的长度。 / p>