我尝试编写然后从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类型)上接收它。但是,要删除该特定行,值必须匹配(不进行转换),我不知道如何正确获取值。
答案 0 :(得分:2)
您正在检查非常具体的日期时间值。除非您的表记录完全相同的日期和时间,否则这将永远不会有效。
此外,您正在检查我假设的日期字段和日期时间的时间字段。你为什么不只是比较一个日期时间字段?
答案 1 :(得分:2)
您的插入工作是因为您正在使用SQL参数将值传递给SQL,这很棒。您的DELETE可能在语法错误上失败(如果您包含错误的文本会很好),因为您正在构建一个字符串并尝试执行它。
您可以通过在日期周围添加单引号来修复删除字符串,但我甚至不想向您显示正确的语法。我更愿意再次使用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框架处理它们时,没有必要回归到不使用参数。