我正在向数据库发送一个命令,它返回1行受到影响,但是当我查看数据库时,没有记录。我没有收到任何错误。我检查以确保字符串正确构建,它是。有任何想法吗?我知道,我在这里没有使用参数化查询。我会晚点。以下是数据库层的代码:
public int InsertStartTime(certificate cert, DateTime startTime, string lineNumber)
{
string sql = "INSERT INTO checkLog(userID,lineNumber,startTime) VALUES(" +
cert.userID + ", '" + lineNumber + "', '" + startTime + "');";
int result = 0;
try
{
conn.Open();
comm.CommandText = sql;
result = comm.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
conn.Close();
}
MessageBox.Show(result.ToString() + " rows affected");
return result;
}
使用access 2000 db文件:
string connStr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\assets\users.mdb;Persist Security Info=True";
答案 0 :(得分:5)
右键单击VS中的数据库文件,然后查看属性。它是否设置为“始终复制”?默认情况下,visual studio将制作数据库的副本以进行调试,并且只对此副本进行任何更改,并且不会反映在原始数据库中。如果要在调试模式下处理“真实”数据库文件,可以将其设置为“从不”。
答案 1 :(得分:1)
根据您使用的数据库/数据提供程序,您的SQL命令可能无法在自动提交模式下执行。
尝试明确提交您的交易。像这样:
conn.Open();
using (var tran = conn.BeginTransaction()) {
comm.Transaction = tran; // Possibly redundant, depending on database.
comm.CommandText = sql;
result = comm.ExecuteNonQuery();
tran.Commit();
}
答案 2 :(得分:1)
没有其他人指出这一点,所以我会。请不要这样使用SQL。使用参数。否则你会对sql攻击敞开大门。
string sql = "INSERT INTO checkLog(userID,lineNumber,startTime) VALUES(@ID, @line, @starttime);
try
{
conn.Open();
comm.CommandText = sql;
comm.Parameters.Add("ID").Value = cert.userID;
comm.Parameters.Add("line").Value = lineNumber ;
comm.Parameters.Add("starttime").Value = startTime ;
result = comm.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}