C# 从SQL表中删除行(日期和时间值错误)

C# 从SQL表中删除行(日期和时间值错误),c#,sql,delete-row,C#,Sql,Delete Row,我尝试从SQL表中写入然后删除。我的写代码是可以的,但是我的删除代码不能像我想要的那样工作 //SQL_ConnectionString defined above SqlConnection SQL_Connection = new SqlConnection(SQL_ConnectionString) string INSERT = "INSERT INTO " + tbTable_DAQ.Text + " (Date, Time, Comment)"; string VALUE

我尝试从SQL表中写入然后删除。我的写代码是可以的,但是我的删除代码不能像我想要的那样工作

//SQL_ConnectionString defined above
SqlConnection SQL_Connection = new SqlConnection(SQL_ConnectionString)

string   INSERT =  "INSERT INTO " + tbTable_DAQ.Text + " (Date, Time, Comment)";
string   VALUES =  "VALUES " + " (@Date,    @Time,   @Comment)";
string   SQL_WriteString =  INSERT + VALUES;

DateTime DateTimeNow = DateTime.Now;

try
{
   //get time
   DateTimeNow = DateTime.Now;

   //create SQL command object
   SqlCommand SQL_Write = new SqlCommand(SQL_WriteString, SQL_Connection);

   //attach values
   SQL_Write.Parameters.AddWithValue("@Date", DateTimeNow);
   SQL_Write.Parameters.AddWithValue("@Time", DateTimeNow);
   SQL_Write.Parameters.AddWithValue("@Comment", "Table Access Test. ");

   SQL_Write.ExecuteNonQuery();

   //dispose & nullify SQL_Write
   SQL_Write.Dispose();
   SQL_Write = null;
}

catch (Exception eWrite) 
{ 
   MessageBox.Show(eWrite.ToString(), "SQL WRITE ERROR", MessageBoxButtons.OK, 
                                       MessageBoxIcon.Exclamation); 
}

//now delete inserted row from SQL table            
string DELETE = "DELETE FROM " + tbTable_DAQ.Text + " ";
string FROM =  "WHERE " + "Date = " + DateTimeNow  + "AND " + "Time = " + DateTimeNow 
               + "AND " + "Comment='Table Access Test.'"; //not working
string   SQL_DeleteString  = DELETE + FROM;

try 
{ 
   //create SQL command object
   SqlCommand SQL_Delete = new SqlCommand(SQL_DeleteString, SQL_Connection);
   SQL_Delete.ExecuteNonQuery();
   //dispose & nullify SQL_Delete
   SQL_Delete.Dispose();
   SQL_Delete = null;
}

catch (Exception eDelete)     
{ 
     MessageBox.Show(eDelete.ToString(), "SQL DELETE ERROR", MessageBoxButtons.OK, 
                       MessageBoxIcon.Exclamation); 
}

这给了我一个错误。我认为错误是由于日期和时间列的值造成的。在编写代码时,我认为SQL表将
DateTimeNow
转换为在
Date
(日期类型)和
Time
(时间7类型)接收到它时。但是,要删除特定行,值必须匹配(未进行转换),我不知道如何正确获取值。

您正在检查非常特定的日期时间值。除非您有完全相同的日期和时间的表记录,否则这将永远不起作用


另外,您正在根据datetime检查我假设的日期字段和时间字段。为什么不只是比较一个日期时间字段?

您正在检查非常具体的日期时间值。除非您有完全相同的日期和时间的表记录,否则这将永远不起作用


另外,您正在根据datetime检查我假设的日期字段和时间字段。为什么不比较一个日期时间字段呢?

您的插入工作正常,因为您正在使用SQL参数将值传递给SQL,这非常好。您的删除可能会因语法错误而失败(如果包含错误的文本就更好了),因为您正在构建一个字符串并试图执行它

您可能可以通过在日期周围加上单引号来修复删除字符串,但我甚至不想向您展示正确的语法。出于两大原因,我希望您再次使用SQL参数:

  • SQL将为您进行正确的转换-无需担心文本是否正确
  • 您正在保护自己不受SQL注入的影响—这是由构建SQL字符串并执行它们引起的一个主要安全问题

  • 插入之所以有效,是因为您正在使用SQL参数将值传递给SQL,这非常好。您的删除可能会因语法错误而失败(如果包含错误的文本就更好了),因为您正在构建一个字符串并试图执行它

    您可能可以通过在日期周围加上单引号来修复删除字符串,但我甚至不想向您展示正确的语法。出于两大原因,我希望您再次使用SQL参数:

  • SQL将为您进行正确的转换-无需担心文本是否正确
  • 您正在保护自己不受SQL注入的影响—这是由构建SQL字符串并执行它们引起的一个主要安全问题

  • 请尝试发送日期时间。现在已格式化为Sql proc字符串

    e、 像这样

    string formatted = dateNow.ToString("yyyyMMdd");
    

    请尝试发送日期时间。现在已格式化为Sql proc字符串

    e、 像这样

    string formatted = dateNow.ToString("yyyyMMdd");
    

    如果自动提交未打开,则应键入connection.transaction.commit。我认为,如果您了解一个状态并最终进行如下测试会更好:

    finally
    {
      if (status)
      {
        connection.transaction.commit;
      }
      else
      {
        connection.transaction.rollback;
      }
    }
    
    可能您的代码试图删除一行,该行由于没有提交而未插入。
    但通常情况下,这应该是日期时间问题;-)

    如果自动提交未打开,则应键入connection.transaction.commit。我认为,如果您了解一个状态并最终进行如下测试会更好:

    finally
    {
      if (status)
      {
        connection.transaction.commit;
      }
      else
      {
        connection.transaction.rollback;
      }
    }
    
    可能您的代码试图删除一行,该行由于没有提交而未插入。 但通常情况下,这应该是日期时间问题;-)

    好吧, 因此,根据n8wrl的建议,我不在SQL删除代码中使用字符串。我把它改成:

            //now delete inserted row from SQL table            
            string DELETE = "DELETE FROM " + tbTable_DAQ.Text + " ";
            string FROM = "WHERE " + "Date = @Date" + " AND " + "Time = @Time" + " AND " + "Comment = @Comment";
            string SQL_DeleteString = DELETE + FROM;
    
            try
            {
               //create SQL command object
               SqlCommand SQL_Delete = new SqlCommand(SQL_DeleteString, SQL_Connection);
    
               //attach values
               SQL_Delete.Parameters.AddWithValue("@Date",               DateTimeNow.Date);
               SQL_Delete.Parameters.AddWithValue("@Time",               DateTimeNow.TimeOfDay);
               SQL_Delete.Parameters.AddWithValue("@Comment",            "Table Access Test.");
    
               SQL_Delete.ExecuteNonQuery();
    
               //dispose & nullify SQL_Delete
               SQL_Delete.Dispose();
               SQL_Delete = null;
            }
    
            catch (Exception eDelete) { MessageBox.Show(eDelete.ToString(), "SQL DELETE ERROR", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); }
    
    事情进展顺利。感谢Hatsoft的帮助。我认为最好避免使用凌乱的字符串方法。我不想要任何注射攻击。如果发生这种情况,我会成为任何大问题的解决者。我是说,真的很专业。

    好吧, 因此,根据n8wrl的建议,我不在SQL删除代码中使用字符串。我把它改成:

            //now delete inserted row from SQL table            
            string DELETE = "DELETE FROM " + tbTable_DAQ.Text + " ";
            string FROM = "WHERE " + "Date = @Date" + " AND " + "Time = @Time" + " AND " + "Comment = @Comment";
            string SQL_DeleteString = DELETE + FROM;
    
            try
            {
               //create SQL command object
               SqlCommand SQL_Delete = new SqlCommand(SQL_DeleteString, SQL_Connection);
    
               //attach values
               SQL_Delete.Parameters.AddWithValue("@Date",               DateTimeNow.Date);
               SQL_Delete.Parameters.AddWithValue("@Time",               DateTimeNow.TimeOfDay);
               SQL_Delete.Parameters.AddWithValue("@Comment",            "Table Access Test.");
    
               SQL_Delete.ExecuteNonQuery();
    
               //dispose & nullify SQL_Delete
               SQL_Delete.Dispose();
               SQL_Delete = null;
            }
    
            catch (Exception eDelete) { MessageBox.Show(eDelete.ToString(), "SQL DELETE ERROR", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); }
    

    事情进展顺利。感谢Hatsoft的帮助。我认为最好避免使用凌乱的字符串方法。我不想要任何注射攻击。如果发生这种情况,我会成为任何大问题的解决者。我的意思是,非常重要。

    有两个不同的
    DateTimeNow
    变量可能包含两个稍有不同的值,这将导致“精确匹配”失败

    删除更新的
    try/catch
    中隐藏外部变量的嵌套变量;我怀疑这可能会“起作用”

    然而,寻找这样一个“精确”的时间通常是错误的。也许你的意思是寻找“同一分钟”或类似的

    另外,日期和时间列都在哪里输入日期时间?它们代表什么样的数据库类型


    修复删除操作,以便像更新一样使用参数。。当.NET framework处理得相当好时,回归到不使用参数是没有意义的。

    有两个不同的
    DateTimeNow
    变量可能包含两个稍有不同的值,这将导致“精确匹配”失败

    删除更新的
    try/catch
    中隐藏外部变量的嵌套变量;我怀疑这可能会“起作用”

    然而,寻找这样一个“精确”的时间通常是错误的。也许你的意思是寻找“同一分钟”或类似的

    另外,日期和时间列都在哪里输入日期时间?它们代表什么样的数据库类型


    修复删除操作,以便像更新一样使用参数。。如果.NET framework能够很好地处理参数,那么回归到不使用参数是没有意义的。

    该代码中存在错误。是DateTime。例如现在。还有,为什么要分隔字符串?为什么选择“WHERE”+“Date=”?此外,删除中where中的注释与插入的注释不同(末尾缺少空格),因此它不会删除任何内容。为了便于查看,我拆分了字符串。稍后,我可以对其他列ID重复使用该格式。该代码中有错误。这是约会时间