【问题标题】:How do i pass arbitary date format from C# to sql backend如何将任意日期格式从 C# 传递到 sql 后端
【发布时间】:2011-01-01 07:34:33
【问题描述】:

我在后端有一个交易日期的日期时间字段。所以我从前面的 C#.net 传递那个日期,格式如下:

2011-01-01 12:17:51.967

为此,我已经写了:

表示层:

string date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture);
PropertyClass prp=new PropertyClass();
Prp.TransDate=Convert.ToDateTime(date);

PropertyClass 结构:

Public class property
{
private DateTime transdate;
public DateTime TransDate
{
    get
    {
        return transdate;
    }
    set
    {
        transdate = value;
    }
   }
}

像这样从 DAL 层传递 TransactionDate:

Cmd.Parameters.AddWithValue("@TranSactionDate”, SqlDbType.DateTime).value=propertyobj.TransDate;

从演示层调试时:

string date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture);

在这我得到了正确的预期日期格式,但是当调试到这一行时

Prp.TransDate=Convert.ToDateTime(date);

日期格式再次更改为 2011 年 1 月 1 日。

但是我的后端 sql datefield 需要这种格式的日期参数 2011-01-01 12:17:51.967 否则会抛出异常无效的日期格式。

注意:将日期作为字符串传递而不转换为日期时间时,会出现以下异常:

System.Data.SqlTypes.SqlTypeException: SqlDateTime overflow. Must be between 1/1/1753     12:00:00 AM and 12/31/9999 11:59:59 PM. at   System.Data.SqlTypes.SqlDateTime.FromTimeSpan(TimeSpan value) at System.Data.SqlTypes.SqlDateTime.FromDateTime(DateTime value) at System.Data.SqlTypes.SqlDateTime..ctor(DateTime value) at System.Data.SqlClient.MetaType.FromDateTime(DateTime dateTime, Byte cb) at System.Data.SqlClient.TdsParser.WriteValue(Object value, MetaType type, Byte scale, Int32 actualLength, Int32 encodingByteSize, Int32 offset, TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParser.TdsExecuteRPC(_SqlRPC[] rpcArray, Int32 timeout, Boolean inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, Boolean isCommandProc) 

【问题讨论】:

  • DateTime 值没有格式。该格式仅在将DateTime 转换为string 时才起作用。
  • 我注意到,在将交易日期传递给 DAL 时,您使用的是“propertyobj.TransDate”,而在其他地方则指的是“Prp.TransDate”。这是代码中的实际内容,还是撰写问题时的无意错误?

标签: c# sql datetime


【解决方案1】:

你说:

 So I am passing that date from front C#.net, in the below format:

但我看不出有任何证据表明您使用了任何格式 - 实际上您不应该DateTime 没有任何固有格式,就像数字一样。正如您可以以十六进制或十进制查看相同的数字一样,您可以通过多种方式查看相同的日期和时间。

您已经将DateTime 直接而不是以特定格式传递给数据库,这是正确的(通常有关日期/时间格式和数据库的问题与不使用参数化查询的人有关)。您根本不必担心格式。

可能性:

  • 您的数据在其他地方已损坏,而您实际上得到的日期早于 1753 年
  • 您的 SQL 语句使用了错误的值
  • 您的数据库驱动程序有问题(您还没有说明您使用的是哪个数据库;是 SQL Server 吗?)

【讨论】:

  • Jon Skeet->我正在使用 sql server 2005,并调用 e-connect 存储过程...这个 sp 不是我构建的。
  • @Jims:如果你写出日期时间就在调用存储过程之前——或者就在你调用AddWithValue之前——显示什么日期?看起来它是在构建抛出异常的值时......即它实际上并没有进入数据库。
  • 尝试得到相同的异常
  • @Jims:是的,你一定会遇到同样的异常——关键是看看你传入的是什么 DateTime。显然 SqlDateTime 构造函数认为你的值不合适——我'试图找出那个值是什么。
【解决方案2】:

尝试将 DateTime 实例直接作为参数传递:

Cmd.Parameters.AddWithValue("@TranSactionDate", DateTime.Now);

【讨论】:

  • Darin Dimitrov->仍然得到相同的异常:System.Data.SqlTypes.SqlTypeException:SqlDateTime 溢出。必须在 1753 年 1 月 1 日凌晨 12:00:00 到 9999 年 12 月 31 日晚上 11:59:59 之间。在 System.Data.SqlTypes.SqlDateTime.FromTimeSpan(TimeSpan 值) 在 System.Data.SqlTypes.SqlDateTime.FromDateTime(DateTime 值) 在 System.Data.SqlTypes.SqlDateTime..ctor(DateTime 值) 在 System.Data.SqlClient。 MetaType.FromDateTime(DateTime dateTime, Byte cb) at System.Data.SqlClient.TdsParser.WriteValue(Object value, MetaType type, Byte scale, Int32 actualLength, Int32 encodingByteSize, Int32 offset, TdsParserStat...
  • @Jims:老实说,如果您甚至不能使用 DateTime.Now,这听起来好像您的机器上有一些非常奇怪的东西。
猜你喜欢
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多