C# 试图在sql server中插入日期和时间,但出现错误

C# 试图在sql server中插入日期和时间,但出现错误,c#,sql-server,C#,Sql Server,以下代码中有什么错误?我正在将日期n时间存储到sql server中的datetime字段中 private void button1_Click(object sender, EventArgs e) { string d = DateTime.Now.ToShortDateString(); cmd.CommandText = "insert into trans values("+label9.Text+",'d');"; cmd.C

以下代码中有什么错误?我正在将日期n时间存储到sql server中的datetime字段中

private void button1_Click(object sender, EventArgs e)
    {
        string d = DateTime.Now.ToShortDateString();
        cmd.CommandText = "insert into trans values("+label9.Text+",'d');";
        cmd.Connection = con;
        con.Open();
        int x= cmd.ExecuteNonQuery();
        MessageBox.Show("Attendance recorded succesfully");
CommandText字符串中存在键入错误。用这个代替

cmd.CommandText="insert into trans values("+label9.Text+","+DateTime.Now.ToString()+");";
编辑:

完整编辑的代码如下所示。请注意,使用语句会处理您的更新,但这段代码仍然很糟糕,并且充满了sql注入。如果需要安全代码,则必须使用参数

private void button1_Click(object sender, EventArgs e)
{
    using (System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection("Data Source=localhost; Initial Datalog=myDatabase; Integrated Security=TRUE;")) 
  {
      using (System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand("insert into trans values("+label9.Text+","+DateTime.Now.ToString()+");", connection)) 
    {
        connection.Open();
        command.ExecuteNonQuery();
        connection.Close();
     }
  }
}
CommandText字符串中存在键入错误。用这个代替

cmd.CommandText="insert into trans values("+label9.Text+","+DateTime.Now.ToString()+");";
编辑:

完整编辑的代码如下所示。请注意,使用语句会处理您的更新,但这段代码仍然很糟糕,并且充满了sql注入。如果需要安全代码,则必须使用参数

private void button1_Click(object sender, EventArgs e)
{
    using (System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection("Data Source=localhost; Initial Datalog=myDatabase; Integrated Security=TRUE;")) 
  {
      using (System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand("insert into trans values("+label9.Text+","+DateTime.Now.ToString()+");", connection)) 
    {
        connection.Open();
        command.ExecuteNonQuery();
        connection.Close();
     }
  }
}

除了使用内联SQL这一事实之外,这是很糟糕的。您应该在查询中使用@param1语法,然后向查询中添加参数,这样也可以避免这个问题。甚至更好——使用像LINQtoSQL或实体框架或nHibernate之类的ORM

SQL Server通常希望它的时间为yyyymmdd格式,而且您确实应该检查标签的值是否确实是整数,并且仅在以下情况下运行查询:

int labelValue = 0;
if(int.TryParse(label9.Text, out labelValue))
{
  cmd.CommandText="insert into trans values("+ labelValue +
    ", '" + DateTime.Now.ToString("yyyyMMdd");"')"; 
  cmd.Connection = con;      
  con.Open();      
  int x= cmd.ExecuteNonQuery();      
  MessageBox.Show("Attendance recorded succesfully");
}     
我还想说,您确实需要检查连接/命令的使用情况—您在哪里处置?从这个密码判断,我猜你不会吧


总而言之,即使有了这些修复,我也不建议你这样做——按照Harm建议的方式做——应该有+5或更多

除了使用内联SQL这一事实之外,这是很糟糕的。您应该在查询中使用@param1语法,然后向查询中添加参数,这样也可以避免这个问题。甚至更好——使用像LINQtoSQL或实体框架或nHibernate之类的ORM

SQL Server通常希望它的时间为yyyymmdd格式,而且您确实应该检查标签的值是否确实是整数,并且仅在以下情况下运行查询:

int labelValue = 0;
if(int.TryParse(label9.Text, out labelValue))
{
  cmd.CommandText="insert into trans values("+ labelValue +
    ", '" + DateTime.Now.ToString("yyyyMMdd");"')"; 
  cmd.Connection = con;      
  con.Open();      
  int x= cmd.ExecuteNonQuery();      
  MessageBox.Show("Attendance recorded succesfully");
}     
我还想说,您确实需要检查连接/命令的使用情况—您在哪里处置?从这个密码判断,我猜你不会吧


总而言之,即使有了这些修复,我也不建议你这样做——按照Harm建议的方式做——应该有+5或更多

这是一种非常糟糕的方法,因为它是为sql注入而打开的。最好使用SqlParameter

cmd.CommandText="insert into trans values(@label, @date)";
cmd.Parameters.AddWithValue("label", int.Parse(label9.Text));
cmd.Parameters.AddWithValue("date", DateTime.Now);
cmd.Connection = con;
con.Open();
int x= cmd.ExecuteNonQuery();

这是一种非常糟糕的方法,因为它是为sql注入而打开的。最好使用SqlParameter

cmd.CommandText="insert into trans values(@label, @date)";
cmd.Parameters.AddWithValue("label", int.Parse(label9.Text));
cmd.Parameters.AddWithValue("date", DateTime.Now);
cmd.Connection = con;
con.Open();
int x= cmd.ExecuteNonQuery();


您是否可以尝试先将日期存储在变量中,然后将其插入数据库?您的commandText语句可能就是问题所在此标签中的文本是什么?您应该看看这个:首先,您应该说明错误,您是在日期字段中插入字符串吗?字符串值应该在单引号中,d标签中的文本是一个整数值@Paddyc您是否可以尝试先将日期存储在变量中,然后将其插入数据库?您的commandText语句可能是问题所在此标签中的文本是什么?您应该看看这个:首先,您应该说明错误,您是在日期字段中插入字符串吗?字符串值应该在单引号中,d标签中的文本是一个整数值@PaddyThis仍然容易受到SQL注入的影响-这不是一个好主意!而且:由于将SQL语句连接在一起,因此需要知道目标SQL Server使用的是什么日期格式——再说一次:这不是一个好主意。最好使用DateTime类型的SQL参数来解决这两个问题,因为它仍然容易受到SQL注入的影响—这不是一个好主意!而且:由于将SQL语句连接在一起,因此需要知道目标SQL Server使用的是什么日期格式——再说一次:这不是一个好主意。最好使用DateTime类型的SQL参数来解决easeFor语言和dateformat独立日期字符串的问题,使用不带破折号的短ISO-8601格式,即YYYYMMDD!例如,您的解决方案将无法与任何欧洲语言(英国、德国、法国、意大利)一起使用-该日期格式将在此类SQL Server实例上失败…@marc_s好的,很酷,谢谢您的编辑。在我使用过的每一个SQL实例上,这种格式都是有效的——但那是因为它们一直都是相同的语言环境——顺便说一句,这无疑是英国的语言环境。最好不要在SQL中使用字符串来存储日期/时间!使用datetime列和sql参数。@ChrisDunaway,当然,最终这种数据库访问方法很糟糕!事实上,我刚刚意识到需要在datetime literalFor language和dateformat独立日期字符串周围加引号,使用短ISO-8601格式,即YYYYMMDD,不带任何破折号!例如,您的解决方案将不适用于任何欧洲语言—英国、德国、法国、意大利—该日期格式在这样的SQL Server实例上将失败…@marc_s好的,很酷,谢谢哈
我编辑过。在我使用过的每一个SQL实例上,这种格式都是有效的——但那是因为它们一直都是相同的语言环境——顺便说一句,这无疑是英国的语言环境。最好不要在SQL中使用字符串来存储日期/时间!使用datetime列和sql参数。@ChrisDunaway,当然,最终这种数据库访问方法很糟糕!事实上,我刚刚意识到需要在datetime文字周围加上引号