2

これはかなり一般的な問題のようで、なぜそれが起こっているのか頭を悩ませています。ソース コードに直接アクセスできないソフトウェア アプリケーションを使用しています (一部は .NET Reflector でのみ表示できます)。

ストアド プロシージャは次のようになります。

ALTER PROCEDURE [dbo].[CS_GetMessages] (
    @CustomerID C_ID, @Level C_Integer, @UsersTimeZoneOffset C_Integer
    )
AS
BEGIN 
    SET NOCOUNT ON
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    DECLARE @Date Datetime
    SELECT @Date = CONVERT(nvarchar(10), getutcdate(), 101)

    SELECT
        [MessageID]

    FROM
        [dbo].[Messages]
    WHERE
        ([CustomerID] = @CustomerID OR [CustomerID] IS NULL) 
        AND Enabled = 1
        AND Deleted = 0
        AND (EffectiveDate IS NULL OR @Date >= CONVERT(nvarchar(10), DATEADD(minute, @UsersTimeZoneOffset, EffectiveDate), 101))
        AND (ExpiryDate IS NULL OR @Date < CONVERT(nvarchar(10),  DATEADD(minute, @UsersTimeZoneOffset, ExpiryDate), 101))
        AND Publish = 1
        AND Level = ISNULL(@Level, Level)
    ORDER BY MaintenanceDate DESC

END

現在、ソース コードによると (残念ながら、ライセンスの問題で貼り付けることができません)、適切な量のパラメーターが送信されます。SQL プロファイラもこれを適切に表示します。

exec CS_GetMessages @CustomerID=N'CT000001',@Level=NULL,@UsersTimezoneOffset=0

ただし、エラーが発生します。

Error: 8144, Severity: 16, State: 2 Procedure or function CS_GetMessages has too many arguments specified.

しかし、プロシージャを手動で実行すると、値が正しく返されます。次のテストコードを使用しました。

DECLARE @return_value int

EXEC    @return_value = [dbo].[CS_GetMessages]
        @CustomerID = 'CT000001',
        @Level = NULL,
        @UsersTimeZoneOffset = 0

SELECT  'Return Value' = @return_value

GO

データベースが空白 (空のテーブル) であるため、データがないことに注意してください。したがって、適切に 0 が返されます。

更新: データベース呼び出しを行うソース コード:

 private SystemMessageManager LoadSystemMessages()
        {
            int paramValue = Conversions.ToInteger(Utility.DataFromSession("UsersTimezoneOffset", string.Empty));
            SystemMessageManager messageManager = new SystemMessageManager();
            CriteriaCollection loadCriteria = new CriteriaCollection();
            CriteriaCollection criterias2 = loadCriteria;
            criterias2.Add("CustomerID", DbType.String, Utility.GetCurrentCustomer().CustomerID, ParameterDirection.Input, "");
            criterias2.Add("Level", DbType.Int32, null, ParameterDirection.Input, "");
            criterias2.Add("UsersTimezoneOffset", DbType.Int32, paramValue, ParameterDirection.Input, "");
            criterias2 = null;
            messageManager.Load(loadCriteria);
            this.CheckForDeactivation(messageManager);
            return messageManager;
        }
4

1 に答える 1

1

ALTER PROCEDURE [dbo].[CS_GetMessages] ( @CustomerID C_ID、@Level C_Integer、@UsersTimeZoneOffset C_Integer )

コードを次のように変更します

ALTER PROCEDURE [dbo].[CS_GetMessages] (
    @CustomerID BigInt, @Level Integer=NULL, @UsersTimeZoneOffset Integer
    )

デフォルトの整数は null ではなく 0 です。したがって、具体的にnullにする必要があります。

exec CS_GetMessages @CustomerID=1,@Level=NULL,@UsersTimezoneOffset=0
于 2013-10-24T19:57:50.817 に答える