如何在ADO.NET中使用文本框作为日期

问题描述:

我有一个ASP.NET向导,其中用户填写他们的个人详细信息,并将文本框的值插入到MS SQL记录中。 然而,插入记录时,我得到以下错误:如何在ADO.NET中使用文本框作为日期

SQL Server error #241: Conversion failed when converting date and/or time from character string

代码:

string insertSQL; 
insertSQL = "INSERT INTO member ("; 
insertSQL += "UserId, mem_dob,) "; 
insertSQL += "VALUES ("; 
insertSQL += "@UserId, @mem_dob"; 
insertSQL += ")"; 

SqlConnection con = new SqlConnection(connectionString); 
SqlCommand cmd = new SqlCommand(insertSQL, con); 

//Add the parameters. 
cmd.Parameters.AddWithValue("@UserId", providerIdKeyString); 
cmd.Parameters.AddWithValue("@mem_dob", DateOfBirth.Text); 

任何想法的最好办法解决?我应该不是使用文本框,而是使用其他的东西? 我想保持网页表单的简单 - 它验证日期确定,所以认为日期应该是有效的。

感谢

+0

如何验证Web窗体中的日期? – 2012-01-06 12:52:15

您应该简单地解析Text为有效DateTime

cmd.Parameters.AddWithValue("@mem_dob", DateTime.Parse(DateOfBirth.Text)); 

http://msdn.microsoft.com/en-us/library/1k1skd40%28v=VS.100%29.aspx

当然,你应该已经验证所输入的“日期”是在这一阶段有效。

+0

谢谢 - 请参阅我上面的回复。 – bjh 2012-01-06 13:40:13

根据SQL,听起来像在文本框中输入的日期是无效的日期。在尝试将日期添加为参数之前,请首先检查它的有效性。例如

DateTime myDate; 
if(textBox1.TryParse(DateOfBirth.Text, out myDate)) 
{ 
    // Date is valid. 
} else 
{ 
    // Take corrective actions to fix the date. 
} 

简单地试图解析日期不知道它是否有效与否将离开你的应用程序中打开一个失败,因为你根本不应该信任用户输入一个有效的日期。

+0

谢谢,但我在向导控件中验证了日期。 – bjh 2012-01-06 13:35:51

DateTime t; 
String Date = String.Empty; 
if (DateTime.TryParse(Date, out t)) 
{ 
    cmd.Parameters.AddWithValue("@mem_dob", t); 
} 
+0

谢谢!还发现这个工作:cmd.Parameters.AddWithValue(“@ mem_dob”,Convert.ToDateTime(DateOfBirth.Text));但解析可能更好? – bjh 2012-01-06 13:38:17

你应该创建简单的用户控件包含三个下拉控件 - 对日,月,年和公共财产/方法来设置/获取日期。您可能会考虑ASP.NET Ajax控件。

如果您想要使用Textbox,则可以通过CompareValidator控制或某种JavaScript和正则表达式限制用户输入。

要解析日期字符串,请使用DateTime.TryParse或DateTime.ParseExact(DateTime.TryParseExact)方法。

string[] inputFormat = {"dd-MM-yy","dd/mm/yy","dd-MMM-yyyy"}; 
string userDate = "31-12-11"; 
DateTime date; 
if (DateTime.TryParseExact(userDate, 
          inputFormat, 
          CultureInfo.InvariantCulture, 
          DateTimeStyles.None, 
          out date)) 
      { 
       //valid 
      }