尝试通过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.有人知道用户名获取用户名的更好方法吗?
提前致谢。
答案 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>