如果缺少日期,则从文本框插入日期而不会出错

时间:2014-06-10 08:54:27

标签: c# sql sql-server date type-conversion

我有两个文本框并包含日期。我想将文本转换为日期并将其插入SQL数据库。如果用户未输入日期,则会发生错误。如何防止错误发生?

     try
        {

            DateTime abc,bsd;
            abc = Convert.ToDateTime(textBox1.Text);
            bsd = Convert.ToDateTime(textBox2.Text);
            SqlConnection con = new SqlConnection();
            con.ConnectionString = Scout_DHQ_Manager.Properties.Settings.Default.constring;
            con.Open();
            SqlCommand cmd;
            cmd = new SqlCommand("INSERT INTO Table1 (dt,dt2) VALUES('"+abc +"','"+bsd+"')", con);
            cmd.ExecuteNonQuery();
            MessageBox.Show("Details of a new unit is successfully added", " Successfully Added", MessageBoxButtons.OK, MessageBoxIcon.Information);
            con.Close();

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString(), "Erroe Occure in Connection.", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

4 个答案:

答案 0 :(得分:3)

您应该对输入进行某种验证。如果它看起来不像日期,则抛出错误。

您可以使用DateTime.TryParse()

DateTime date = new DateTime();

if(DateTime.TryParse(textBox1.Text, out date))
{
    //The text is a valid date
    //Insert it
}

如果您需要特定格式,可以使用DateTime.TryParseExact()

您也可以考虑使用parametrized queries,因为编写这样的代码会让您容易受到SQL注入攻击。

答案 1 :(得分:2)

有些观点:

  • 使用参数来屏蔽格式化问题(是DMY还是MDY格式?)。在这个特殊情况下你没有SQL注入问题,但如果你直接使用来自用户输入的字符串值,你就会拥有它。
  • 确保数据库表中的这些日期列可以为空。
  • 确保abcbsd变量的类型为Nullable<DateTime>(或DateTime?,且相同)。
  • 仅当该文本框中有内容(并捕获错误)时才使用Convert.ToDateTime:empty textbox = null date。

答案 2 :(得分:1)

更改以下代码

        DateTime? abc, bsd;
        if (textBox1.Text != "")
            abc = Convert.ToDateTime(textBox1.Text);
        else
            abc = null;
        if (textBox2.Text != "")
            bsd = Convert.ToDateTime(textBox2.Text);
        else
            bsd = null;

答案 3 :(得分:1)

记住这些事情:

  • 在查询中使用参数
  • 为您的变种使用合理的名称
  • 在请求来自用户
  • 的输入时,检查值是否为空
  • 在查询中使用引号sql cast var to string

考虑到上述尝试:

try
     {    
       string date1=textBox1.Text;
       string date2= textBox2.Text;
       if (date1!=null)&&((date2!=null)
        {
          date1=DateTime.TryParse(date1).ToString("yyyy/MM/dd HH:mm:ss.fff");
          date2=DateTime.TryParse(date2).ToString("yyyy/MM/dd HH:mm:ss.fff");
          SqlConnection con = new SqlConnection();
          using (con)
          {
           con.ConnectionString = Scout_DHQ_Manager.Properties.Settings.Default.constring;
           con.Open();
           SqlCommand cmd;
           cmd = new SqlCommand("INSERT INTO Table1 (dt,dt2) VALUES(@dt1,@dt2)", con);
           cmd.Parameters.AddWithValue("@dt1", date1);
           cmd.Parameters.AddWithValue("@dt2", date2);
           cmd.ExecuteNonQuery(); 
           }                   
         }            
            else
            {
              MessageBox.Show("Please Fill in both Textboxes");
            }
         }
            catch (Exception ex)
            {
               MessageBox.Show(ex.ToString(), "Erroe Occure in Connection.", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

编辑:

将textBox改为DateTimePicker控件可能会导致更好的功能(你永远不会有空值)如果你在你可以在你的参数中设置的else块中坚持使用textBoxes:

 parameter.Value = DBNull.Value;