4

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

我在 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") 的所有组合

请帮助提前谢谢

4

7 回答 7

3

尝试这个

mycom = new SqlCommand("insert into mytable(dtCol1) values(@value1)");
mycom.Parameters.AddWithValue("@value1",Convert.ToDateTime(txt_dob.Text));
mycom.ExecuteNonQuery();
于 2013-05-13T11:22:43.960 回答
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();
于 2013-05-13T10:42:46.690 回答
2

问题似乎来自这里: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);

您还可以查看此相关主题以及有关您的类似案例的一些附加信息

于 2013-05-13T10:44:04.137 回答
1

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

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

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

好的-也就是说,让我们尝试回答您的问题。

原因是因为您以错误的格式传入值。你先约会。您的 sql 服务器可能希望它首先是 MONTHS。因为它可能已设置为样式 121(<-- 这是一个真正的技术性 sql server 为兼容性废话设置的东西..)

但不要试图打架和猜测。

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

例如。

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

您可以在 SQLFIDDLE 上看到这一点

这是一个非常好的 StackOverflow 问题,它解释了默认的 DateTime 格式是什么等。

于 2013-05-13T10:45:26.330 回答
0

用这个:

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

谢谢

于 2013-05-13T10:42:43.677 回答
0

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

dateString = "12-31-2012";
format = "MM-dd-yyyy";
try 
{
  DateTime result = DateTime.ParseExact(dateString, format, CultureInfo.CurrentCulture);
}
catch (FormatException) 
{

}
于 2013-05-13T10:44:08.610 回答
0

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

将有助于 sqlserver 接受 datetime 格式的错误原因MM/dd/yyyy,但不接受dd/MM/yyyy.

于 2013-11-29T21:42:34.800 回答