簡體   English   中英

將數據類型varchar轉換為int時出錯

[英]Error converting data type varchar to int

這是我的存儲過程代碼

ALTER procedure [Proc_Add_User]
    (@UserId varchar(20), 
     @UserName varchar(100),
     @Page_Name varchar(20), 
     @AccessIndicator int, 
     @CreatedBy varchar(50), 
     @returnStatus varchar(50) output)
as
   DECLARE @intErrorCode INT
DECLARE @Page_Indicator INT
begin
BEGIN TRAN
Set @Page_Indicator = (select Page_Indicator from Pages where Page_Name=@Page_Name);
if (select count(*) from Users where UserId=@UserId and UserName=@UserName) > 0 begin               
    if (select count(*) from User_Credentials where Page_Indicator=@Page_Indicator and 
    UserId=@UserId  ) > 0 
    set @returnStatus='User already has access'             
    else 
    insert into User_Credentials(UserId,Page_Indicator,Access_Indicator,CreatedBy) 
        values (@UserId,@Page_Indicator,@AccessIndicator,@CreatedBy)
    SELECT @intErrorCode = @@ERROR
    IF (@intErrorCode <> 0) GOTO PROBLEM            
end
else begin  
    insert into Users(UserId,UserName,CreatedBy) 
    values(@UserId,@UserName,@CreatedBy)
    SELECT @intErrorCode = @@ERROR
    IF (@intErrorCode <> 0) GOTO PROBLEM
    insert into User_Credentials(UserId,Page_Indicator,Access_Indicator,CreatedBy) 
        values (@UserId,@Page_Indicator,@AccessIndicator,@CreatedBy)
    SELECT @intErrorCode = @@ERROR
    IF (@intErrorCode <> 0) GOTO PROBLEM    
end
COMMIT TRAN
if(@returnStatus is null)
    set @returnStatus='Success';
PROBLEM:
IF (@intErrorCode <> 0) BEGIN
set @returnStatus= 'Unexpected error occurred!'
ROLLBACK TRAN
end
end

我從下面粘貼的代碼中調用它:

Con.Open();
cmd = new OleDbCommand();
cmd.Connection = Con;

cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "Proc_Add_User";

cmd.Parameters.Clear();
cmd.Parameters.Add("@UserId", SqlDbType.VarChar).Value = userLanId;
cmd.Parameters.Add("@UserName", SqlDbType.VarChar).Value = userName;
cmd.Parameters.Add("@Page_Name", SqlDbType.VarChar).Value = pageName;
cmd.Parameters.Add("@AccessIndicator", SqlDbType.Int).Value = accessIndicator;
cmd.Parameters.Add("@CreatedBy", SqlDbType.VarChar).Value = createdBy;

OleDbParameter output = new OleDbParameter("@returnStatus", SqlDbType.VarChar);
output.Direction = ParameterDirection.Output;
cmd.Parameters.Add(output); 

int result = cmd.ExecuteNonQuery();

我收到ExecuteNonQuery語句中提到的錯誤。 我感到困惑的是,我能夠在SSMS中執行存儲過程,但無法從我的應用程序(前端)執行存儲過程。 我也提供了相同的值,但我的應用程序失敗了。

我再次檢查以確保傳遞的參數順序匹配並且具有相同的數據類型,但仍然會引發此錯誤。 如果需要的話,我可以將存儲的proc代碼粘貼到此處,請讓我知道。。謝謝!

編輯

糟糕! 我只是意識到,所有插入操作都正在發生,並且在數據庫中可以很好地落實。 只是這個錯誤被捕獲在我的應用程序的catch塊中。 有任何想法嗎?

我不能忽略它,因為基於ExecuteNonQuery()的返回值,我有一些語句,並且它不會通過ExecuteNonQuery()之后的代碼。

這很可能是因為您將SqlDbTypeOleDbParameters

OleDbParameter output = new OleDbParameter("@returnStatus", SqlDbType.VarChar);

這導致.NET使用OleDbParameter(String, Object)構造函數,將參數的值設置為SqlDbType.VarChar ,它假定它是int

您應該改用以下代碼:

OleDbParameter output = new OleDbParameter("@returnStatus", OleDbType.VarChar);

並將對cmd.Parameters.Add的調用更改為也使用OleDbType

或者,您可以使用System.Data.SqlClient代替OleDb

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM