如何通过 C# ASP.net 从 SQL Server 中的文本框中存储日期

Posted

技术标签:

【中文标题】如何通过 C# ASP.net 从 SQL Server 中的文本框中存储日期【英文标题】:How to store date from text box in SQL Server through C# ASP.net 【发布时间】:2013-05-13 10:32:53 【问题描述】:

我在通过 C# asp.net 在线将日期存储在 sql server 数据库中时遇到问题

我在 ASP 文件中使用了 asp 文本框和 asp 日历扩展器来获取用户的日期,

 <asp:TextBox runat="server" ID="txt_date"></asp:TextBox>
<asp:CalendarExtender runat="server" ID="cal_date" TargetControlID="txt_date"></asp:CalendarExtender>

文件后面的代码是,假设连接和命令已声明和初始化,

mycom = new SqlCommand("insert into mytable(dtCol1) values('"+Convert.ToDateTime(txt_dob.Text).ToString("dd-MMM-yyyy") + "')", mycon);mycom.ExecuteNonQuery();

问题是,当我选择的日期小于任何月份的 12 时,它可以完美运行, 但是当日期/日期大于任何月份的 12 时,它会给出错误,

Exception Details: System.FormatException: String was not recognized as a valid DateTime.

我已经尝试了 .ToString("dd-MMM-yyyy") 的所有组合

请帮忙 提前致谢

【问题讨论】:

您在txt_dob中写入日期时间值时使用什么格式 如果您在 12 日以上有问题,则表示您的日期格式错误,并将月份存储为一天,反之亦然。检查您必须发送到 SQL 的确切格式。最好使用参数而不是粘合查询 - 这是你冒 SQL 注入风险的坏习惯。 感谢@Rajeev Kumar - 它采用日历扩展器的默认时间格式,即 mm-dd-yyyy 我不敢相信有人没有意识到他/她正在使用 friggin(激光)SqlCommand 动态编写 Sql! 【参考方案1】:

试试这个

mycom = new SqlCommand("insert into mytable(dtCol1) values(@value1)");
mycom.Parameters.AddWithValue("@value1",Convert.ToDateTime(txt_dob.Text));
mycom.ExecuteNonQuery();

【讨论】:

这个答案比接受的答案更好:-)【参考方案2】:

试试这个

CultureInfo provider = CultureInfo.InvariantCulture;
System.Globalization.DateTimeStyles style = DateTimeStyles.None;
DateTime dt;
DateTime.TryParseExact(txt_dob.Text, "m-d-yyyy", provider, style, out dt);
mycom = new SqlCommand("insert into mytable(dtCol1) values(@datevalue)", mycon);
cmd.Parameters.Add("@datevalue",SqlDbType.DateTime).Value =dt;
mycom.ExecuteNonQuery();

【讨论】:

嘿,谢谢 Rajeev,你能告诉我 DateTime.TryParseExact(strDate, format, provider, style, out dt) 中的 'strDate' 和 'format' 是什么; 在将 dt 插入 sql 之前检查是否在调试时获得了正确的日期时间值 这里有什么问题吗。 -1 不使用参数化 sql。这种方法对于 sql 注入攻击是开放的 @JonP 我已经更新了对参数化查询的回答。现在希望它对你有意义:)【参考方案3】:

问题似乎来自这里:Convert.ToDateTime(txt_dob.Text)。这种类型的转换不好,因为:

它忽略控件使用的格式Convert.ToDateTime(...) 期望字符串采用某种格式,以便正确解析它。这无法处理txt_dob 可以使用的任何自定义格式。

它不知道特定于文化的格式。在内部,Convert.ToDateTime(...) 可能会坚持使用CultureInfo.CurrentCulture,据说它不能解析日期。此外,.NET 中的某些前端控件识别并使用浏览器传递的客户端文化(对于 Web 应用程序),并且该文化可能与服务器文化不同。 CultureInfo.CurrentCulture 代表服务器端文化,可能会出现格式差异

如果您知道txt_dob.Text 的格式,您必须显式解析它。在下面的示例中,我假设格式为 "MM/dd/yyyy":

String dateFormat = "MM/dd/yyyy";//The format that the txt_dob control uses
DateTime parsedDate = DateTime.ParseExact(
    txt_dob.Text, dateFormat, CultureInfo.InvariantCulture);

您还可以查看this related topic,了解与您类似的案例的更多信息

【讨论】:

【参考方案4】:

TLDR;您使用了错误的 DateTime 格式

这里有很多问题会炸毁左右和中间的死星。

首先,您正在动态创建 sql 查询 - 这可能是过去 10 年中最大的禁忌,每个人都已停止这样做。换句话说,请不要开始做(非常过时的)ADO.NET 编程来将数据从网站传递到数据库。如果您不顾一切,可以使用 Entity Framework、NHibernate 甚至是 Linq2Sql 等现代替代品。

好的 - 就是说,让我们试着回答你的问题。

原因是因为您以错误的格式传入值。你先约会。您的 sql 服务器可能希望它首先是 MONTHS。因为它可能被设置为 style 121

但不要试图打架和猜测。

让我们使用更通用的起始字符串格式:yyyy-mm-dd hh:mm:ss.ms

例如。

SELECT CAST('2013-02-08 09:53:56.223' as DateTime)

你可以see this in action over at SQLFIDDLE。

This is a really good *** question 解释默认的 DateTime 格式是什么,等等。

【讨论】:

【参考方案5】:

使用这个:

mycom = new SqlCommand("insert into mytable (dtCol1) values ('" +  Convert.ToDateTime(txt).ToString("MMM-dd-yyyy") + "')", mycon);

谢谢

【讨论】:

【参考方案6】:

用户 DateTime.ParseExact() 代替 Convert.ToDateTime() 方法。

dateString = "12-31-2012";
format = "MM-dd-yyyy";
try 

  DateTime result = DateTime.ParseExact(dateString, format, CultureInfo.CurrentCulture);

catch (FormatException) 



【讨论】:

【参考方案7】:

[Date_Of_Birth]='" + Convert.ToDateTime(TxtDate_Of_Birth.Text).ToString("MM-dd-yyyy") + "'

将有助于解决 sqlserver 接受MM/dd/yyyy 格式的日期时间,但不接受dd/MM/yyyy 格式的错误原因。

【讨论】:

以上是关于如何通过 C# ASP.net 从 SQL Server 中的文本框中存储日期的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C# ASP.NET 参数将希伯来语文本发送到 SQL Server?

如何从asp.net中的js函数调用c#函数?

如何从 ASP.net C# 中的字符串中提取 C#/PHP/Code/SQL

如何更好地在 c# (asp.net) 和 SQL Server 上保存和加载图片?

如何使用 C#、ASP.NET、SQL Server 端处理实现 jQuery DataTables 插件?

如何使用 c# asp.net 从 url 获取数据?