gpt4 book ai didi

c# - 在 SQL Server 和 C# 中运行查询的结果不同

转载 作者:行者123 更新时间:2023-11-30 15:38:48 24 4
gpt4 key购买 nike

我有一个在 SQL Server 中运行存储过程的应用程序,检查表中一行与 getdate()

之间的时间差

我从 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 中,我有一行包含一个操作的最后日期(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,当然,该行没有更新。

我做错了什么?

最佳答案

当您只能执行有条件的更新时,为什么还要做所有这些工作(声明、选择、有条件地更新)?

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

关于c# - 在 SQL Server 和 C# 中运行查询的结果不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11085040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com