C# 如何将日期从asp页面文本框插入sql server

C# 如何将日期从asp页面文本框插入sql server,c#,asp.net,sql,sql-server,C#,Asp.net,Sql,Sql Server,我的网页中有一个按钮,可以在SQLServer列中插入一些值。其中一个值恰好是数据类型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',

我的网页中有一个按钮,可以在SQLServer列中插入一些值。其中一个值恰好是数据类型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”等时,它会给我一个错误,表示从字符串转换日期和/或时间时转换失败。有人能帮我吗?这让我很困惑,因为使用“yyy-mm-dd”格式的日期效果很好,这与文本框相同。

您将文本框2.text输入到数据库中,而不是文本框的值。从TextBox2中删除引号。文本:

SqlCommand cmd1 = new SqlCommand("insert into dbo.FillTable values 
    ('" + TextBox2.Text + "', '" + TextBox1.Text + "', 'FA0005')",con);
如上所述,当您附加这样的字符串时,您会让自己处于开放状态

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},我再次说Hello{0}!我像这样使用它。FormatHello{0},我再次说hello{0}!,世界,我会得到这样一个字符串:Hello**world**,然后我再次说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 server的语句就是您看到的,字符串中有@paramname。但是,它会将其作为prepare发送,并使用AddParameterWithValue方法中提供的值准备该语句。注意,在这里,只要TextBox2.Text中的值是一个日期,您就不必担心格式,因为SQL server会处理这个问题。请记住,SQL server以一种格式存储它,您将以另一种格式显示它,但只要格式有效,它就可以从多种格式转换

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

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 );

您不太具备将文本框值正确插入insert的机制。此外,这种类型的数据库插入使您容易受到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");
然后,可以按如下方式指定参数:

 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。希望这有帮助。

您正在尝试将文本TextBox2.text显式插入日期字段,这是导致错误的原因。您还需要研究参数化查询;如果允许用户传入值,则易受SQL注入攻击。同意:。因为您使用的是SQL server,所以也可以查看存储过程。如果您正在制定正确的解决方案,请在插入之前使用DateTime.TryParse或等效工具验证日期字符串。@WillemDuncan,注意到了,我修改了答案。谢谢你的详细答案@Mike。它真的帮助我理解了这个问题。@Rick,我很高兴我能帮上忙!