我的网页中有一个按钮,可以将一些值插入到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”格式显示日期效果很好,与文本框相同。
答案 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开放。