【问题标题】:DateTime format issue on StoredProcedure - C# ASP.NET x MS SQL Server 2014StoredProcedure 上的日期时间格式问题 - C# ASP.NET x MS SQL Server 2014
【发布时间】:2017-05-08 12:44:02
【问题描述】:

我在从 C# ASP.NET 应用程序 (MVC 3) 运行 SQL Server 2014 存储过程时遇到问题。 当我使用相同的参数手动运行此过程时,它会返回所有正确的结果。当从 C# 应用程序执行该过程时,“读取器”为空,没有任何数据。这似乎是 DateTime 格式的问题。我应该怎么做才能解决它? 代码如下:

SQL:

ALTER PROCEDURE [dbo].[my_proc]
(
    @client_code AS varchar(7),
    @begin_date AS datetime,
    @end_date AS datetime
)
AS
BEGIN
    SET NOCOUNT ON; 


SELECT *
    from [dbo].[my_table] c
    WHERE c.code = @client_code
    AND c.date1 >= @begin_date
    AND c.date2 <= @end_date

END

C#:

DateTime Today = DateTime.Today;
DateTime LastYear = Today.AddYears(-1);
sql = new SqlConnection(/*my string connection*/);
sql.Open();
adapter.SelectCommand = new SqlCommand();
adapter.SelectCommand.CommandText = "dbo.my_proc";
adapter.SelectCommand.Connection = sql;
adapter.SelectCommand.CommandType = CommandType.StoredProcedure;

param1 = adapter.SelectCommand.Parameters.Add("@client_code", SqlDbType.VarChar);
param1.Value = cod_client;

param2 = adapter.SelectCommand.Parameters.Add("@begin_date", SqlDbType.Date);
param2.Value = LastYear.ToString("yyyy-MM-dd");

param3 = adapter.SelectCommand.Parameters.Add("@end_date", SqlDbType.Date);
param3.Value = Today.ToString("yyyy-MM-dd");

reader = adapter.SelectCommand.ExecuteReader();

【问题讨论】:

  • .ToString("...")?不,你会有问题。如果您想删除时间部分,请使用SqlDbType.DateTime 并使用Today.Date
  • 您期望 DateTime 类型的参数,为什么要将您完全适合的日期时间变量转换为字符串?
  • 我担心C#和SQL Server的日期时间格式不匹配,所以我尝试通过toString方法来管理格式。

标签: c# asp.net asp.net-mvc datetime sql-server-2014


【解决方案1】:

您不应将DateTime 转换为字符串。只需将其“按原样”传递给存储过程。如果您只想要日期部分,请使用Date。请记住不要更改数据类型。

param2 = adapter.SelectCommand.Parameters.Add("@begin_date", SqlDbType.Date);
param2.Value = LastYear.Date;

param3 = adapter.SelectCommand.Parameters.Add("@end_date", SqlDbType.Date);
param3.Value = Today.Date;

【讨论】:

  • 我试过这种方式,但它还没有按预期工作。我担心日期时间格式不匹配。
  • 我用这种方式很久了。你能解释一下出了什么问题吗?
  • 从 C# 应用程序执行时,该过程返回空。但是,当我使用相同的参数直接从 SQL Server 手动运行该过程时,将返回所有正确的行。
  • 我不认为 DateTime 是问题所在。请在表格中插入输入的 DateTime 以便跟踪问题。
  • 您可以使用强制转换并尝试一次吗? like cast(c.date1 as date) >= cast(@begin_date as date)
【解决方案2】:

试试 AddWithValue 方法,它不那么冗长,并且可以动态识别参数的 DataType:

        adapter.SelectCommand.Parameters.AddWithValue("@client_code", cod_client);
        adapter.SelectCommand.Parameters.AddWithValue("@begin_date", LastYear.Date);
        adapter.SelectCommand.Parameters.AddWithValue("@end_date", Today.Date);

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多