C# 从SQL表中删除行(日期和时间值错误)
我尝试从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_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 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重复使用该格式。该代码中有错误。这是约会时间