Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
要保存在SQL server中的用C#表示的DateTime字符串_C#_Sql Server_Datetime - Fatal编程技术网

要保存在SQL server中的用C#表示的DateTime字符串

要保存在SQL server中的用C#表示的DateTime字符串,c#,sql-server,datetime,C#,Sql Server,Datetime,我在将“3月16-17日”转换为DateTime并将其保存到SQL server时遇到问题。“3月16日至17日”看起来是3月16日至3月17日,在我的案例中无效,但C#DateTime.TryParse()将“3月16日至17日”视为2017年3月16日,这是错误的,并将数据保存在SQL server中。SQL server将“3月16日至17日”视为无效。那么,有人能告诉我如何在C#中使用SQL server日期时间验证吗 谢谢 阿什瓦尼 您可以使用DateTime.TryParseExac

我在将“3月16-17日”转换为DateTime并将其保存到SQL server时遇到问题。“3月16日至17日”看起来是3月16日至3月17日,在我的案例中无效,但C#DateTime.TryParse()将“3月16日至17日”视为2017年3月16日,这是错误的,并将数据保存在SQL server中。SQL server将“3月16日至17日”视为无效。那么,有人能告诉我如何在C#中使用SQL server日期时间验证吗

谢谢 阿什瓦尼

您可以使用DateTime.TryParseExact将字符串解析为DateTime,要求其格式精确。这将消除问题,即您能够将无效日期解析为DateTime实例

以下是一个例子:

        DateTime dt;
        if (DateTime.TryParseExact("March 16", "MMMM dd", new CultureInfo("en-GB"), DateTimeStyles.None, out dt))
            Console.WriteLine(dt);
省略年份时,TryParseExact将采用当前年份。如果您将“3月16-17日”传递给该方法,它将失败。IFormatProvider参数是英国文化,因此我们可以将“三月”解析为一年中的第三个月

正如您所注意到的,这与SQL Server所做的不同。它转换日期的方式将取决于它的排序规则设置。我不推荐使用它,但是如果您真的,真的需要准确地复制该功能,并从C#使用它,您可以创建一个存储过程,它接受varchar,进行转换,并返回DateTime,然后从C#调用它

您还可以使用DateTime.TryParse方法从C#解析日期。此方法还接受一个IFormatProvider,它告诉框架如何进行解析。FormatProvider是由CultureInfo实现的,因此,如果传入与观察到所需行为的SQL Server排序规则对应的CultureInfo,解析结果很可能类似。最后,如果您对内置的可能性不满意,您可以自己实现IFormatProvider

我的评论 您真正的问题是,实际上您正在两次执行从字符串到日期时间的验证和转换。一旦进入C#,然后将字符串发送到SQL Server,并再次进行转换。这必然会给您带来问题,因为正如您所指出的,这两个系统的解析方式类似,但在边缘情况下并不完全相同


我认为您应该做的是,在C#中进行验证和解析,然后将生成的DateTime作为DateTime对象发送给SQL Server,因此SQL Server本身不需要进行解析。您可以使用-如果您使用其他内容进行数据访问,将有一个类似的功能。

听起来该值根本不应该是日期时间。相反,它应该是一个字符串(varchar/nvarchar)或两个日期时间值(start和end)。也就是说,首先为什么要调用
DateTime.TryParse
DateTime.TryParseExact
?如果要将它们存储为日期,则需要强制用户将它们输入为日期(如示例中的两个日期值),然后可以轻松地将它们存储为日期。如果要允许用户输入“3月16-17日”或“2010年春季”或“3月下旬”,请使用varchar或nvarchar数据类型

编辑根据您在评论中所说的内容,听起来您是在将XML直接传递给SQL Server,并希望SQL Server解析日期。不幸的是,SQL Server并不像您所发现的那样是一个很好的解析工具。在我看来,在将XML传递给SQL Server之前,在C#中重建XML、验证和解析日期和整数会更容易。也就是说,我会尽可能少地在SQLServer中进行这种类型的解析和验证。如果您仍然想走这条路,另一个解决方案是创建一个CLR函数(这意味着必须启用CLR),该函数将为您提供与C#相同的日期解析功能

EDIT经过大量讨论,问题似乎在于C#的日期解析器对于您的目的来说太聪明了。您希望C#像SQL Server一样使日期无效。我可以想出几个方法来解决这个问题:

  • DateTime.TryParseExact
    方法发送一长串允许的格式列表。缺点是,就解析日期值而言,这远远不够宽容
  • 运行TryParse并验证年份。如果年份X超出了本年的年数,则将其作废
  • 找到一种强制XML源强制执行日期的方法,以便只发送有效的日期
  • 在将日期传递给TryParse之前,编写一个例程,确定该日期是否有16-17(尽管03-16-17应该被认为是有效的,所以您需要小心)

除非您将数据推入字符列,然后在填充数据后使用SQL Server的
IsDate
Cast
函数填充DateTime列,否则尝试实际使用SQL Server的日期解析将不起作用。

它认为17是2017年,因为年份可以用两位数字写入,请尝试强制执行四

if (DateTime.TryParseExact("March 16-17", "MMMM dd YYYY", new CultureInfo("en-GB"), DateTimeStyles.None, out dt))

我知道你不想限制你的用户。你听起来像是在做这样的事情:

mySqlCommand.CommandText = "UPDATE tbl SET date_field = @parm";
string maybeDate = "March 16-17");
DateTime dt;
if (DateTime.TryParse(maybeDate, dt)
{
    mySqlCommand.Parameters.AddWithValue("@parm", maybeDate)
}
你能改做这个吗

mySqlCommand.CommandText = "UPDATE tbl SET date_field = @parm";
string maybeDate = "March 16-17");
DateTime dt;
if (DateTime.TryParse(maybeDate, dt)
{
    mySqlCommand.Parameters.AddWithValue("@parm", dt); // <============
}
mySqlCommand.CommandText=“更新tbl设置日期\u字段=@parm”;
字符串maybeDate=“3月16-17日”);
日期时间dt;
if(DateTime.TryParse(maybeDate,dt)
{

mySqlCommand.Parameters.AddWithValue(“@parm”,dt);//
3月16-17日
不是日期时间。这就是我所说的,不是,而是日期时间。TryParse将其视为日期时间并将其转换为2017年3月16日。下面有一点混乱。他只想验证给定的日期字符串是否可以被SQL Server接受。@egrunin-实际上,问题是.NET的TryParse I他太聪明了。理想情况下,他希望TryParse在3月16-17日返回false。也就是说,C#找到一种方法将该值转换为验证日期,而SQL Server只是使其无效。他想要的是一种方法,理想情况下是在C#中,像SQL Server那样使日期无效。DateTime.TryPa