【问题标题】:Unable to insert default DateTime of C# to SQL Server 2008无法将 C# 的默认日期时间插入 SQL Server 2008
【发布时间】:2013-06-06 07:20:33
【问题描述】:

我正在开发一个 C# 控制台应用程序项目。尝试将 DateTime 值插入 SQL Server 2008 并且效果很好。如果我的代码失败,我想将 default DateTime 插入到数据库中的表中。

当我尝试插入时出现错误。

SqlTypeException 未处理:
SqlDateTime 溢出。必须在 1753 年 1 月 1 日凌晨 12:00:00 到 9999 年 12 月 31 日晚上 11:59:59 之间。

下面我已经粘贴了具体代码。

try
{
  ...
  return DateTime.Now;
}

catch (WebException ex)
{
  ...
  return default(DateTime);
}

我用来在 LOGS 表中插入详细信息的代码:

connection.Open();
for (int i = 0; i < LogList.Count; i++)
    {
        string aprocessLogQuery = "INSERT INTO PROCESS_LOGS VALUES (@fileId, @startTime, @endTime, @transferredTime)";
        command = new SqlCommand(aprocessLogQuery, connection);
        command.Parameters.Add("fileId", SqlDbType.Int).Value = LogList[i].fileId;
        command.Parameters.Add("startTime", SqlDbType.DateTime).Value = LogList[i].fileGeneration_StartDateTime;
        command.Parameters.Add("endTime", SqlDbType.DateTime).Value = LogList[i].fileGeneration_EndDateTime;
        command.Parameters.Add("transferredTime", SqlDbType.DateTime).Value = LogList[i].fileTransferred_DateTime;
        dataReader.Close();
        dataReader = command.ExecuteReader();
    }
connection.Close();

DateTime 的默认值为01/01/0001 12:00:00 AM,因此它不起作用。任何人都可以建议替代工作解决方案吗?

谢谢

【问题讨论】:

  • 你应该使用datetime2 datatype
  • 最好使用 SqlParameter 而不是字符串。每当我看到一个字符串查询时,我就看到了 SQL 注入的风险......
  • 看看this question:它说插入null datetime 会在数据库中给出默认值。
  • @V4Vendetta 感谢您介绍 datetime2。但很抱歉,我无权更改 SQL Server 中的数据类型。
  • DATETIME 在 SQL Server 中不支持 1753 年之前的日期 - 因此,如果您无法将 SQL Server 数据类型更改为 DATETIME2(它将支持 01/01/0001),那么您需要将您的 .NET 代码更改为默认返回 01/01/1900 或类似的东西

标签: c# sql-server datetime default sqlexception


【解决方案1】:

另一种替代解决方案是您可以通过构建扩展方法来解决,如下所示:

public static class DateTimeExtension
{
    public static DateTime DefaultSqlDateTime(this DateTime dateTime)
    {
       return new DateTime(1753, 1, 1, 12, 0, 0);
    }
}

您可以使用变量 dateTime return dateTime.DefaultSqlDateTime; 而不是 return default(DateTime)

编辑: 如何使用扩展方法:

例如:return default(DateTime).GetDefaultSqlDateTime();

DateTime dateTime = ...
return dateTime.GetDefaultSqlDateTime();

【讨论】:

  • 谢谢。但是return DateTime.DefaultSqlDateTime 不起作用。你能解释一下吗?
  • @user1671639 啊,我看到你想知道如何使用 DefaultSqlDateTime 扩展方法。请参阅下面的编辑部分。
  • 我仍然无法通过它。继错误Extension method must be defined in a non-generic static class
  • 是的。您可以查看链接:codeproject.com/Articles/19963/… 以进一步了解 DateTime 类型的扩展方法。在处理 SQL Server 时,我在 DateTime 上应用了许多扩展方法,这将有助于您的代码可读性和更优雅。
【解决方案2】:

在数据库中,未知日期用NULL 值表示。你可以像这样插入:

command.Parameters.AddWithValue("@startTime", DBNull.Value);

(据我所知,需要在参数前加上@。)

【讨论】:

  • @ 前缀是可选的。
【解决方案3】:

我在我的实用程序中使用这个函数而不是常规的 TryParse

public static bool TryParseSqlDateTime(string someval, DateTimeFormatInfo dateTimeFormats, out DateTime tryDate)
    {
        bool valid = false;
        tryDate = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;
        System.Data.SqlTypes.SqlDateTime sdt;
        if (DateTime.TryParse(someval, dateTimeFormats, DateTimeStyles.None, out tryDate))
        {
            try
            {
                sdt = new System.Data.SqlTypes.SqlDateTime(tryDate);
                valid = true;
            }
            catch (System.Data.SqlTypes.SqlTypeException ex)
            {


            }
        }

        ret

【讨论】:

    【解决方案4】:

    您可以使用它,这将返回 SQL 将接受的最小日期值。此方法在 .Net 中返回 DateTime。

    System.Data.SqlTypes.SqlDateTime.MinValue.Value
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-20
      • 1970-01-01
      相关资源
      最近更新 更多