无法将C#的默认日期时间插入SQL Server 2008
我正在做一个C#控制台应用程序项目。正在尝试将无法将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
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);
}
}
您可以使用变量DateTimereturndatetime.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