2013-05-10 2 views
0

Это мой код хранимой процедурыТип ошибки преобразования данных VARCHAR в 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 [email protected]_Name); 
if (select count(*) from Users where [email protected] and [email protected]) > 0 begin    
    if (select count(*) from User_Credentials where [email protected]_Indicator and 
    [email protected] ) > 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, но не из моего приложения (front-end). Я также предоставил те же значения, но это не удается из моего приложения.

Я проверил дважды, чтобы убедиться, что порядок параметров согласован и один и тот же тип данных, но все же он вызывает эту ошибку. Я могу вставить свой хранимый код proc здесь, если захочет, так что дайте мне знать ... Спасибо заранее!

EDIT

OOPS! Я просто понял, что все вставки все происходят, и в базе данных все исправлено. Именно эта ошибка попадает в блок catch в моем приложении. Есть идеи?

Я не могу игнорировать его, потому что на основе возвращаемого значения ExecuteNonQuery() у меня есть некоторые утверждения, а также он не проходит через код, присутствующий после ExecuteNonQuery().

+1

Жесткий, чтобы помочь, если ваш код говорит что-то другое, чем 'мой код here'. –

+0

Какой тип данных является 'accessIndicator' в коде? Возможно, вы попытаетесь преобразовать 'string' в' int' и провалиться. –

+0

Действительно ли UserID a VARCHAR? – Steve

ответ

1

Это, скорее всего, потому что вы используете SqlDbType с OleDbParameters:

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

+0

Woohoo! Он начал работать после создания этой настройки! Еще раз спасибо! – user841311

Смежные вопросы