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

时间:2012-07-11 14:42:51

标签: c# sql delete-row

我尝试编写然后从SQL表中删除。我的WRITE代码没问题,但是我的DELETE代码不能正常工作。

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

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

6 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

您的插入工作是因为您正在使用SQL参数将值传递给SQL,这很棒。您的DELETE可能在语法错误上失败(如果您包含错误的文本会很好),因为您正在构建一个字符串并尝试执行它。

您可以通过在日期周围添加单引号来修复删除字符串,但我甚至不想向您显示正确的语法。我更愿意再次使用SQL参数,原因有两个:

  1. SQL会为您做正确的转换 - 无需担心文本正确。
  2. 您正在保护自己免受SQL注入 - 通过构建SQL字符串并执行它们而导致的主要安全问题。

答案 2 :(得分:0)

请尝试将DateTime.Now格式化为Sql proc作为字符串

e.g。像这样

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

答案 3 :(得分:0)

如果您的自动提交未启用,则应键入connection.transaction.commit。我认为如果你抓住一个状态并最终像这样测试会更好:

finally
{
  if (status)
  {
    connection.transaction.commit;
  }
  else
  {
    connection.transaction.rollback;
  }
}

也许你的代码试图删除由于没有提交而未插入的行。 但通常它应该是日期时间问题; - )

答案 4 :(得分:0)

好的, 所以根据n8wrl的建议,我不会将字符串用于我的SQL DELETE代码。我改成了:

        //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的帮助。我认为最好避免凌乱的字符串方法。我不想要任何注射攻击。如果发生这种情况,我将成为任何主要问题。我的意思是,真的很重要。

答案 5 :(得分:-1)

两个不同的 DateTimeNow变量可能包含两个略有不同的值,这会使“完全匹配”失败。

删除阴影外部变量的UPDATE try/catch中的嵌套版本;我怀疑它可能会“起作用”。

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

此外,DATE和TIME列在哪里被送入DateTime?它们代表什么数据库类型?

并且修复 DELETE以使用像UPDATE这样的参数。当.NET框架处理它们时,没有必要回归到不使用参数。