0

これは私のストアドプロシージャコードです

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() の後に存在するコードを通過していないため、無視できません。

4

1 に答える 1

1

これは、次のように使用SqlDbTypeしている可能性が最も高いOleDbParametersです。

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

これにより、.NET はコンストラクターを使用し、.NETであると見なされるOleDbParameter(String, Object)パラメーターの値を設定します。SqlDbType.VarCharint

代わりにこれを使用する必要があります。

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

また、呼び出しをcmd.Parameters.Add使用するように変更OleDbTypeします。

System.Data.SqlClientまたは、 OleDb の代わりに使用することもできます

于 2013-05-10T22:44:14.540 に答える