我在调用存储过程的时候提示:不允许从数据类型 sql_variant 到 nvarchar 的隐性转换。请使用 CONVERT 函数来运行此查询(程序代码和存储过程如下:)
程序代码:
  Dim n_objCommand As New OleDb.OleDbCommand
  n_objCommand.Connection = Me.m_objConn
  n_objCommand.CommandType = CommandType.StoredProcedure
  n_objCommand.CommandText = "UserLogin"
  n_objCommand.Parameters.Add("@UserID", SqlDbType.NVarChar, 20)
  n_objCommand.Parameters.Add("@UserPass", SqlDbType.NVarChar, 20)
  n_objCommand.Parameters.Add("@LoginFlag", SqlDbType.Int, 50)
  n_objCommand.Parameters.Add("@UserName", SqlDbType.NVarChar, 30)
  n_objCommand.Parameters(0).Value = strUserID
  n_objCommand.Parameters(1).Value = strUserPass
  n_objCommand.ExecuteNonQuery()‘*********这里出先问题*****
  If n_objCommand.Parameters("@LoginFlag").Value = 1 Then
        '存在
  End If
存储过程:
CREATE PROCEDURE UserLogin
@UserID nvarchar(20),
@UserPass nvarchar(20),
@LoginFlag int output,
@UserName nvarchar(30) output
AS
declare @strSql nvarchar(200) 
select @loginflag=count(*) from userinfodb where userid=convert(nvarchar(20),@userid) and userpass=convert(nvarchar(20), @userpass ) 
if @loginflag=1  
begin
      select @UserName= username from userinfodb where userid=convert(nvarchar(20),@userid)  and userpass=convert(nvarchar(20), @userpass )  
end
else
begin
set @loginflag=0
set @UserName=""
end 
return @loginflag
return @username
请大家帮帮忙,不胜感激。

解决方案 »

  1.   

    try  n_objCommand.Parameters.Add("@UserID", SqlDbType.NVarChar, 20)
      n_objCommand.Parameters.Add("@UserPass", SqlDbType.NVarChar, 20)
      n_objCommand.Parameters.Add("@LoginFlag", SqlDbType.Int, 50)
      n_objCommand.Parameters.Add("@UserName", SqlDbType.NVarChar, 30)
      n_objCommand.Parameters(0).Value = strUserID
      n_objCommand.Parameters(1).Value = strUserPass
      n_objCommand.Parameters(2).Value =System.DBNull.Value
      n_objCommand.Parameters(3).Value =System.DBNull.Value
      n_objCommand.ExecuteNonQuery()
      

  2.   

    另外你的存储过程有点问题CREATE PROCEDURE UserLogin
    @UserID nvarchar(20),
    @UserPass nvarchar(20),
    @LoginFlag int output,
    @UserName nvarchar(30) output
    AS
    declare @strSql nvarchar(200) 
    select @loginflag=count(*) from userinfodb where userid=convert(nvarchar(20),@userid) and userpass=convert(nvarchar(20), @userpass ) 
    if @loginflag=1  
    begin
          select @UserName= username from userinfodb where userid=convert(nvarchar(20),@userid)  and userpass=convert(nvarchar(20), @userpass )  
    end
    else
    begin
    set @loginflag=0
    set @UserName=""
    end go
      

  3.   

    to vivianfdlpw:
    加try和不加try不是一样的道理吗?加上go以后还是有错误。
      

  4.   

    .NET程序:n_objCommand.Parameters.Add("@UserID", SqlDbType.NVarChar, 20)
      n_objCommand.Parameters.Add("@UserPass", SqlDbType.NVarChar, 20)
      n_objCommand.Parameters.Add("@LoginFlag", SqlDbType.Int, 50)
      n_objCommand.Parameters.Add("@UserName", SqlDbType.NVarChar, 30)
      n_objCommand.Parameters(0).Value = strUserID
      n_objCommand.Parameters(1).Value = strUserPass
      n_objCommand.Parameters(2).Value =System.DBNull.Value
      n_objCommand.Parameters(3).Value =System.DBNull.Value
      n_objCommand.ExecuteNonQuery()
    存储过程:CREATE PROCEDURE UserLogin
    @UserID nvarchar(20),
    @UserPass nvarchar(20),
    @LoginFlag int output,
    @UserName nvarchar(30) output
    AS
    declare @strSql nvarchar(200) 
    select @loginflag=count(*) from userinfodb where userid=convert(nvarchar(20),@userid) and userpass=convert(nvarchar(20), @userpass ) 
    if @loginflag=1  
    begin
          select @UserName= convert(nvarchar(30),username) from userinfodb where userid=convert(nvarchar(20),@userid)  and userpass=convert(nvarchar(20), @userpass )  
    end
    else
    begin
    set @loginflag=0
    set @UserName=""
    end go
      

  5.   

    注意这行更改了select @UserName= convert(nvarchar(30),username) from userinfodb 你的表中使用了sql_variant 类型?如果有需要显式转换为nvarchar
      

  6.   

    to vivianfdlpw:
    我也更改了。全部用的你的。
      

  7.   

    to vivianfdlpw:
    麻烦你在想想其他的办法。