无法将C#的默认日期时间插入SQL Server 2008

无法将C#的默认日期时间插入SQL Server 2008,c#,sql-server,datetime,default,sqlexception,C#,Sql Server,Datetime,Default,Sqlexception,我正在做一个C#控制台应用程序项目。正在尝试将DateTime值插入到SQL Server 2008中,但效果良好。如果我的代码失败,我想将默认值日期时间插入数据库中的表中 我尝试插入时出错 SqlTypeException未处理: SqlDateTime溢出。必须在1753年1月1日12:00:00 AM和9999年12月31日11:59:59 PM之间 下面我粘贴了具体的代码 try { ... return DateTime.Now; } catch (WebException

我正在做一个C#控制台应用程序项目。正在尝试将
DateTime
值插入到SQL Server 2008中,但效果良好。如果我的代码失败,我想将默认值
日期时间
插入数据库中的表中

我尝试插入时出错

SqlTypeException未处理:
SqlDateTime溢出。必须在1753年1月1日12:00:00 AM和9999年12月31日11:59:59 PM之间

下面我粘贴了具体的代码

try
{
  ...
  return DateTime.Now;
}

catch (WebException ex)
{
  ...
  return default(DateTime);
}
用于在日志表中插入详细信息的代码:

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();
connection.Open();
对于(int i=0;i
DateTime
的默认值为
01/01/0001 12:00:00 AM
,因此它不工作。有人能提出替代工作方案吗


感谢

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

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

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

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

public static class DateTimeExtension
{
    public static DateTime DefaultSqlDateTime(this DateTime dateTime)
    {
       return new DateTime(1753, 1, 1, 12, 0, 0);
    }
}
您可以使用变量DateTime
returndatetime.DefaultSqlDateTime,而不是
returndefault(DateTime)

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

例如:
返回默认值(DateTime).GetDefaultSqlDateTime()


我在我的实用程序中使用此函数,而不是常规的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

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

System.Data.SqlTypes.SqlDateTime.MinValue.Value

您应该使用SqlParameter而不是字符串,这将是一个好主意。每当我看到一个字符串查询,我就会看到SQL注入的风险…看看:它说插入
null
datetime会在数据库中提供默认值。@V4Vendetta感谢引入datetime2。但很抱歉,我没有权限更改SQL Server中的数据类型。
DATETIME
SQL Server中不支持1753年之前的日期-因此,如果您无法将SQL Server数据类型更改为
DATETIME2
(这将支持
01/01/0001
),然后您需要更改.NET代码以返回
01/01/1900
或类似的默认值
@
前缀是可选的。谢谢。但是
return DateTime.DefaultSqlDateTime
不起作用。您能解释一下吗?@user1671639啊,我看到您在想如何使用DefaultSqlDateTime扩展方法。请看下面的编辑部分。我仍然无法通过它。在错误
之后,必须在非泛型静态类中定义扩展方法。您可以查看链接:以进一步了解DateTime类型的扩展方法。在处理SQL Server时,我在DateTime上应用了许多扩展方法,这将帮助您的代码更可读、更优雅。
System.Data.SqlTypes.SqlDateTime.MinValue.Value