如何将日期从asp页面文本框插入到SQL Server

时间:2012-10-02 14:23:35

标签: c# asp.net sql sql-server

我的网页中有一个按钮,可以将一些值插入到sql server列中。其中一个值恰好是数据类型Date。以下是我的asp.net页面的代码:

 protected void Button1_Click(object sender, EventArgs e)
{
     con.Open();
     SqlCommand cmd1 = new SqlCommand("insert into dbo.FillTable values ('TextBox2.Text', 'TextBox1.Text', 'FA0005')",con);
     SqlDataAdapter dr = new SqlDataAdapter(cmd1);
     con.Close();
     DataSet dl = new DataSet();
     dr.Fill(dl);
     //Label5.Text = dl.Tables[0].Rows[1][9].ToString();

}

我希望能够让用户以格式(yyyy-MM-dd)输入日期,这是我的sql server的日期格式。 “TextBox2”是保存日期输入的文本框。每当我简单地对日期进行硬编码时就像前一样。 '2010-01-01','50','FA0005',它运作良好并插入记录。但是,当我的代码是'TextBox2.Text','TextBox1'等。它给我一个错误,说“从字符串转换日期和/或时间时转换失败”。有人可以帮我弄这个吗?令我困惑的是因为以“yyyy-mm-dd”格式显示日期效果很好,与文本框相同。

3 个答案:

答案 0 :(得分:7)

protected void Button1_Click(object sender, EventArgs e) 
{ 
     con.Open(); 
     SqlCommand cmd1 = new SqlCommand(string.Format("insert into dbo.FillTable values ('{0}', '{1}', 'FA0005')", TextBox2.Text, TextBox1.Text), con); 
     SqlDataAdapter dr = new SqlDataAdapter(cmd1); 
     con.Close(); 
     DataSet dl = new DataSet(); 
     dr.Fill(dl); 
} 

现在,让我们分解string.Format函数。它说如果我有一个像"Hello {0}!"那样格式化的字符串,那么我在函数的零索引处传入的任何内容都将替换 {0}的每个出现。所以,假设我有这个字符串"Hello {0}, and I say again hello {0}!",我就像string.Format("Hello {0}, and I say again hello {0}!", "world")一样使用它,我会得到一个像"Hello **world**, and I say again hello **world**!"这样的字符串。

注意

但是,上面的解决方案让你对SQL注入开放,所以如果你想要防止它,那么让我们走这条路。

protected void Button1_Click(object sender, EventArgs e) 
{ 
     con.Open(); 
     SqlCommand cmd1 = new SqlCommand("insert into dbo.FillTable values (@TextBox2Val, @TextBox1Val, 'FA0005')", con); 
     cmd1.AddParameterWithValue( "TextBox1Val", TextBox1.Text );
     cmd1.AddParameterWithValue( "TextBox2Val", TextBox2.Text );
     SqlDataAdapter dr = new SqlDataAdapter(cmd1); 
     con.Close(); 
     DataSet dl = new DataSet(); 
     dr.Fill(dl); 
} 

现在让我们打破这个。发送到SQL服务器的语句正是您所看到的,字符串中包含@paramname。但是,它会将其作为prepare发送,并使用您在AddParameterWithValue方法中提供的值准备该语句。请注意,这里,只要TextBox2.Text中的值是一个日期,您就不必关心格式,因为SQL服务器会处理这个问题。请记住,SQL服务器以一种格式存储它,您将在另一种格式中显示它,但只要它们有效,它就可以从无数种格式转换。

现在,正如@Willem所述,你应该确保TextBox2.Text中的值实际上是一个日期,所以让我们这样做,在函数顶部添加这个片段... < / p>

DateTime theDate;
if (!DateTime.TryParse(TextBox2.Text, out theDate))
{
    // throw some kind of error here or handle it with a default value
    ... 
}

...然后修改AddParameterWithValue这样的行......

cmd1.AddParameterWithValue( "TextBox2Val", theDate );

答案 1 :(得分:3)

您没有完全将文本框值插入插入的机制。此外,这种数据库插入方式使您容易受到SQL注入攻击。一个更好的选择是参数化您的SqlCommand,如下所示:

 SqlCommand cmd1 = new SqlCommand("insert into dbo.FillTable values (@Date1, @Date2, @SomeString)",con);

然后,您可以按如下方式指定参数:

 cmd1.Parameters.AddWithValue("@Date1",TextBox1.Text);
 cmd1.Parameters.AddWithValue("@Date2",TextBox2.Text);
 cmd1.Parameters.AddWithValue("@SomeString,"FA0005");

指定参数可消除SQL注入风险,并提供一种干净的机制,用于将值从文本框中获取到INSERT。希望这会有所帮助。

答案 2 :(得分:2)

您正在将文本“TextBox2.Text”输入到数据库中,而不是文本框的值。从TextBox2.Text中删除引号:

SqlCommand cmd1 = new SqlCommand("insert into dbo.FillTable values 
    ('" + TextBox2.Text + "', '" + TextBox1.Text + "', 'FA0005')",con);

如上所述,当你附加这样的字符串时,你会向SQL Injection开放。