0

我尝试编写然后从 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 表会在(日期类型)和(time7 类型)DateTimeNow接收到它时转换为。但是,要删除该特定行,值必须匹配(未完成转换),我不知道如何正确获取值。DateTime

4

6 回答 6

2

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

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

于 2012-07-11T14:46:29.047 回答
2

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

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

  1. SQL 将为您进行正确的转换——不用担心得到正确的文本。
  2. 您正在保护自己免受 SQL 注入 - 由构建 SQL 字符串并执行它们引起的主要安全问题。
于 2012-07-11T14:47:27.087 回答
0

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

比如像这样

string formatted = dateNow.ToString("yyyyMMdd");
于 2012-07-11T14:47:28.727 回答
0

如果你的自动提交不是你应该输入connection.transaction.commit。我认为如果您捕获状态并最终像这样进行测试会更好:

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

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

于 2012-07-11T14:56:40.987 回答
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 的帮助。我认为最好避免使用凌乱的字符串方法。我不想要任何注入攻击。如果发生这种情况,我将成为任何主要问题。我的意思是,真的很重要。

于 2012-07-11T17:46:49.377 回答
-1

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

删除try/catchUPDATE 中隐藏外部变量的嵌套一个;我怀疑它可能会“工作”。

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

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

并且请修复DELETE 以使用像 UPDATE 那样的参数.. 当 .NET 框架很好地处理它们时,不使用参数是没有意义的。

于 2012-07-11T17:54:12.540 回答