【问题标题】:How to insert date from asp page textbox to sql server如何将日期从asp页面文本框插入到sql server
【发布时间】:2012-10-02 22:35:30
【问题描述】:

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

【问题讨论】:

  • 您正在尝试将文本 TextBox2.Text 显式插入到日期字段中,这是导致错误的原因。您还想查看参数化查询;如果你允许用户传入值,你很容易受到 SQL 注入攻击。
  • 由于您使用的是 sql server,因此查看存储过程可能会有所帮助。

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


【解决方案1】:
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 Server 会处理这一点。请记住,SQL Server 以一种格式存储它,您将用另一种格式显示它,但只要它们有效,它就可以从多种格式转换。

现在,正如@Willem 所说,您应该确保TextBox2.Text 中的值实际上是一个日期,所以让我们这样做,在函数顶部添加这个 sn-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 );

【讨论】:

  • 如果您正在制定正确的解决方案,请在插入之前使用 DateTime.TryParse() 或等效项验证日期字符串。
  • @WillemDuncan,适当指出,我修改了答案。
  • 谢谢你的详细回答@Mike。它真的帮助我理解了这个问题。
  • @Rick,很高兴能帮上忙!
【解决方案2】:

您没有将文本框值正确插入插入的机制。此外,这种数据库插入方式使您容易受到 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。希望这会有所帮助。

【讨论】:

    【解决方案3】:

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

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

    如上所述,当您附加这样的字符串时,您将自己对SQL Injection 开放。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多