0

我的网页中有一个按钮,可以将一些值插入到 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 服务器的日期格式。“TextBox2”是保存日期输入的文本框。每当我像 ex 一样简单地硬编码日期时。'2010-01-01', '50', 'FA0005',它运行良好并插入记录。但是,当我编码为“TextBox2.Text”、“TextBox1”等时。它给了我一个错误,说“从字符串转换日期和/或时间时转换失败”。有人可以帮我弄这个吗?这让我很困惑,因为日期格式为 'yyyy-mm-dd' 效果很好,这与文本框相同。

4

3 回答 3

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在字符串中带有 。但是,它会将其作为 a 发送并使用您在方法prepare中提供的值准备该语句。AddParameterWithValue请注意,只要 中的值TextBox2.Text是日期,您就不必关心格式,因为 SQL Server 会处理这个问题。请记住,SQL Server 以一种格式存储它,您将以另一种格式显示它,但只要它们有效,它就可以从无数格式转换。

现在,正如@Willem 所说,您应该确保TextBox2.Textin 实际上是一个日期,所以让我们这样做,在函数顶部添加这个片段......

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 );
于 2012-10-02T14:28:20.323 回答
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。希望这可以帮助。

于 2012-10-02T14:31:47.450 回答
2

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

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

如上所述,当您附加这样的字符串时,您会让自己对SQL 注入开放。

于 2012-10-02T14:27:22.160 回答