2012-06-18 44 views
3

查詢我有一個運行在SQL Server存儲過程,檢查時間一排之間的一個表,差異getdate()不同的結果運行在SQL Server和C#

我把這個存儲過程中的應用C#中,並使用@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 

EnvioListadoEjercicioComprobantes我有一個動作的lastDate(EJ發送郵件)一行。

現在,我只有一行,與2012-06-18 06:40:02.210值。我將此日期與實際日期進行比較,如果差異超過一小時,則返回一點。眼下

,在阿根廷,其對2012-06-18 11:26

如果我在SQL Server中執行getdate(),我得到2012-06-18 11:30:44.027

如果我在SQL Server和打印@ReturnValue運行我的整個存儲過程中,我得到1該行更新-

但是,當我打電話給我從C#存儲,我總是得到0,當然,行沒有更新。

我在做什麼錯?

+0

你已經完成了哪些調試步驟? –

+0

一步一步運行。在ExecuteNonQuery之後,我檢查「Value」,它是0(當然,轉換得到'false')。如果我運行存儲在SQL服務器中,我得到1值。檢查app.config,這是正確的數據庫。 –

+0

你可以顯示你的連接字符串嗎? (我有一個偷偷的懷疑,「用戶實例」/「AttachDbFilename」在玩。) –

回答

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); 
+0

如果我做'int a =(int)command.Parameters [「@ ReturnValue」]。Value;'。所以問題是,當我需要1時,Stored返回0。 –

+0

我不認爲存儲過程返回0.您的C#代碼沒有正確處理它作爲返回參數,所以* it *總是改變它將您的AddWithValue中的最後一個元素更改爲1,我敢打賭,您突然總是得到1. –

+0

對不起,我說「AddWithValue」我的意思是「AddParameter」... –

0

檢查數據庫的排序規則設置:在您的Select語句中,您正在設置@returnValue,但稍後您將檢查並返回@ReturnValue。如果區分大小寫,這些是兩個不同的變量。

+0

我不認爲這會解釋它,因爲該過程不會編譯,即使它以某種方式在C#和SQL Server中的結果相同。 –

+0

我修改存儲的,並把'@ ReturnValue'。沒有工作 –

0

嘗試加入SET NOCOUNT ON,傳統的返回值是用來報告使用「SET NOCOUNT ON」選項禁用此功能,可與造成麻煩影響的行數您返回值。

此外,還要檢查SQL Server登錄語言選項,因爲這也會影響DateTime的計算方式(其中包括排序規則)。可能在Management Studio中,您使用的是使用阿根廷當地時間的Windows帳戶進行連接,但C#應用程序使用US/English登錄設置進行連接,這會導致SQL Server認爲您處於不同的時區。

+0

SQL Server根據本地服務器時間評估GETDATE(),而不是用戶。雖然我同意使用SET NOCOUNT ON,但它也不會導致此問題。 –

+0

我試試這個(在Aaron Bertrand評論之前)。沒有工作 –

相關問題