【发布时间】:2020-04-03 16:32:49
【问题描述】:
我正在尝试从 C# 将数据插入到 SQL Server 表中,这是一个 smalldatetime 值。在表格中,我可以看到格式为 2013-10-24 00:00:00 的数据。
在我的代码中,我正在执行以下操作以在插入数据之前检查 dataTable 中可用的数据是否具有正确的日期时间格式。在 Excel 中,包含字符串(日期值)的行可以是我放入格式数组中的任何格式。在 Excel 中,数据是字符串形式的。
DateTime date;
bool isValidBookedDate = true;
string[] formats = { "yyyyddMM", "dd/MM/yyyy", "dd/mm/yyyy","yyyyddmm" ,
"dd-MMM-yy", "yyyyMMdd", "dd-mmm-yy", "yyyymmdd" ,
"dd/MM/yyyy hh:mm:ss", "yyyy-MM-dd" };
foreach (DataRow dtrow in excelDataSet.Tables[0].Rows)
{
if (DateTime.TryParseExact(dtrow[5].ToString().Trim(), formats, System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.None,out date))
{
isValidBookedDate = true;
}
else
{
isValidBookedDate = false;
break;
}
}
if(isValidBookedDate)
{
// SQL Server insert
}
在 SQL Server Insert into 语句中传递数据时,出现错误
将 varchar 数据类型转换为 smalldatetime 数据类型导致值超出范围
如何解决这个问题?谢谢
更新代码 1:
string[] formats = { "dd/MM/yyyy hh:mm:ss" };
if (DateTime.TryParseExact(row[5].ToString(), formats, System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
{
row[5] = Convert.ToDateTime(date.ToString("{MM/dd/yyyy hh:mm:ss}")); // this line did not work
}
【问题讨论】:
-
如果不需要时间戳,SQL Server 应该接受所有格式为“yyyyMMdd”的字符串作为日期。如果需要完整日期,则使用参数并像这样编写:Date.Now.ToUniversalTime.ToString("yyyy-MM-ddThh:mm:ss")
-
当您进行转换时,您只需说“这个字符串可以转换成这种格式的日期时间对象吗”。如果您的数据有一些带有小数秒的日期,它仍然会说它可以,因为您的检查不是关于它是否可以转换为 smallDateTime,而是它是否可以转换为基于格式的 c# DateTime 对象。你有什么不寻常的约会吗?
-
如果出现异常,能否显示 sql 插入代码?
-
您是否尝试插入 DateTime.TryParse() 输出的 DateTime 参数?该日期变量包含什么?此外,您可以执行 isValidBookedDate = DateTime.TryParseExact(..) 来保存 if 分支和手动分配 isValidBookedDate
-
作为 sql insert 语句的一部分,您还应该尝试将 datetime 对象转换为 smallDateTime 以确保它可以被转换。
标签: c# sql-server