3

SQL Server でストアド プロシージャを実行し、テーブル内の 1 つの行とgetdate()

このストアド プロシージャを C# から呼び出し、a を使用@returnValueしていくつかのことを行います。

これが方法です

public static bool Check(string CheckStored)
{
    using (DbCommand command = DatabaseDA.DefaultDb.GetStoredProcCommand(CheckStored))
    {
        DatabaseDA.DefaultDb.AddParameter(command, "ReturnValue", DbType.Boolean, ParameterDirection.ReturnValue, "", DataRowVersion.Current, 0);
        DatabaseDA.DefaultDb.ExecuteNonQuery(command);

        return Convert.ToBoolean(command.Parameters["@ReturnValue"].Value);
    }
}

そしてこれが呼び出しです

bool notifNeeded = NotificationsDA.Check("CheckLastEnvioListadoComprobanteEjercicio");

次に、SQL Serverに次のものがあります。

ALTER Procedure [dbo].[CheckLastEnvioListadoComprobanteEjercicio]
as
Begin

declare @UltimoEnvio datetime
declare @ReturnValue bit 
select @UltimoEnvio = LastDate from EnvioListadoEjercicioComprobantes 

Select @returnValue = CASE 
                         WHEN DATEDIFF(hour, @UltimoEnvio, getdate()) >= 1 THEN 1
                         ELSE 0 
                      END   
from rep_inboxRequest

if (@ReturnValue = 1)
    update EnvioListadoEjercicioComprobantes set LastDate = getdate()

return @ReturnValue
END 

in EnvioListadoEjercicioComprobantes1 つのアクション (ej メール送信) の lastDate の行があります。

現在、2012-06-18 06:40:02.210値のある行は 1 行しかありません。この日付を実際の日付と比較し、差が 1 時間以上ある場合はビットを返します。

現在、アルゼンチンでは、2012-06-18 11:26

getdate()SQL Server で実行すると、2012-06-18 11:30:44.027

SQL Server でストアド プロシージャ全体を実行して print@ReturnValueすると、1 が返され、行が更新されます。

しかし、C# からストアドを呼び出すと、常に 0 が返され、もちろん、行は更新されませんでした。

私は何を間違っていますか?

4

3 に答える 3

4

条件付き更新を実行できるのに、なぜそのすべての作業 (宣言、選択、条件付き更新) を行うのでしょうか?

ALTER PROCEDURE [dbo].[CheckLastEnvioListadoComprobanteEjercicio]
AS
BEGIN
  SET NOCOUNT ON;

  UPDATE dbo.EnvioListadoEjercicioComprobantes 
    SET LastDate = GETDATE()
    WHERE LastDate <= DATEADD(HOUR, -1, GETDATE());

  IF @@ROWCOUNT > 0
    RETURN 1;
  ELSE
    RETURN 0;
END
GO

とにかく、それが戻り値を処理する方法だとは思いません。次のようなものを試してください(これは疑似コードです):

DatabaseDA.DefaultDb.ExecuteNonQuery(command);
var returnVal = command.Parameters.Add("@ReturnValue", SqlDbType.Int);
returnVal.Direction = ParameterDirection.ReturnValue; // this is important
DatabaseDA.DefaultDb.ExecuteNonQuery(command);
return Convert.ToBoolean(returnVal.Value);

それ以外の場合は、これに対する戻り値の使用を停止することをお勧めします。戻りパラメーターを SQL Server から少しだけ出力したい場合は、出力パラメーターを使用できます。

ALTER PROCEDURE [dbo].[CheckLastEnvioListadoComprobanteEjercicio]
  @ReturnVal BIT = 0 OUTPUT
AS
BEGIN
  SET NOCOUNT ON;

  UPDATE dbo.EnvioListadoEjercicioComprobantes 
    SET LastDate = GETDATE()
    WHERE LastDate <= DATEADD(HOUR, -1, GETDATE());

  SELECT @ReturnVal = @@ROWCOUNT;
END
GO

C# コードで (これも疑似コードです。コピーして貼り付けると、アプリで魔法のようにコンパイルされるかどうかはわかりませんが、アイデアが得られるはずです):

SqlParameter rv = new SqlParameter("@ReturnVal", SqlDbType.Boolean);
rv.Direction=ParameterDirection.Output;
command.Parameters.Add(rv);
command.ExecuteNonQuery();
return Convert.ToBoolean(rv.Value);
于 2012-06-18T14:37:54.710 に答える
0

ストアドプロシージャの先頭にSETNOCOUNTONを追加してみてください。従来、戻り値は、「SET NOCOUNT ON」オプションを使用して影響を受ける行数を報告するために使用され、この機能を無効にして、戻り値に問題を引き起こす可能性があります。

また、SQL Serverログイン言語オプションもチェックしてください。これもDateTimeの計算方法に影響を与える可能性があります(照合など)。Management Studioでは、アルゼンチンの現地時間を使用してWindowsアカウントを使用して接続しているが、C#アプリケーションは米国/英語のログイン設定を使用して接続しているため、SQLServerは別のタイムゾーンにいると見なす可能性があります。

于 2012-06-18T14:43:21.503 に答える
0

データベースの照合設定を確認します。 Select ステートメントでは、設定しています@returnValueが、後で確認して返してい@ReturnValueます。大文字と小文字の区別がオンの場合、これらは 2 つの異なる変数です。

于 2012-06-18T14:37:44.507 に答える