C# OleDB查询不返回所有结果
我希望我的代码能够收集SQLMigrationFl字段中具有“I”的前十条记录,然后通过删除该“I”值来处理这十条记录。下面是处理此问题的代码部分C# OleDB查询不返回所有结果,c#,oledb,oledbcommand,C#,Oledb,Oledbcommand,我希望我的代码能够收集SQLMigrationFl字段中具有“I”的前十条记录,然后通过删除该“I”值来处理这十条记录。下面是处理此问题的代码部分 string inProgressQuery = "SELECT TOP 10 IDType, ID, Program, Date, Body, AcctNo, ANPACAcctID, ANPACClientID, TEAMID, Impor
string inProgressQuery = "SELECT TOP 10 IDType, ID, Program, Date, Body,
AcctNo, ANPACAcctID, ANPACClientID, TEAMID,
ImportDate, AnnualReview, TeamGUID,
ANPACClientLastName, ANPACClientFirstName, " +
"PolicyNumber, AccountOwnerLastName,
AccountOwnerFirstName, SCRACF, SCDateTime, NoteID
FROM NoteTable WHERE SQLMigrationFl = ?";
command = new OleDbCommand(inProgressQuery, connection);
command.Parameters.AddWithValue("SQLMigrationFl", "I");
reader = command.ExecuteReader();
if(reader.HasRows)
{
while(reader.Read())
{
//clear the In Progress flag
query = "UPDATE NoteTable SET SQLMigrationFl = ? WHERE
NoteTable.NoteID = " + reader[19].ToString();
command = new OleDbCommand(query, connection);
command.Parameters.AddWithValue("SQLMigrationFl", DBNull.Value);
reader = command.ExecuteReader();
}
}
我发现查询返回一个值,并对其进行处理。然后在五秒钟内找到另一条记录并重新处理该记录*5秒只是我们在代码中设置的一个延迟,用于检查是否有更多记录需要处理。它一次处理一条记录,而不是在同一while循环中一次抓取十条并处理这些记录。我的代码或查询有问题吗
感谢您的帮助。罪魁祸首是您使用
reader=command.ExecuteReader()重新分配了数据读取器代码>。现在它将返回1个结果,并且您的下一个循环将覆盖该1个结果。不管如何,对于非选择查询,请改用ExecuteOnQuery
您可以将代码更新为“更好”的其他地方有
只要有要在sql语句中使用的值,就使用参数
始终为所有参数指定类型
始终使用
块包装在中实现IDisposable的类型实例,以确保清理资源
我还建议您不要共享连接实例,下面可能有一个静态连接。最好不要共享一个,在需要时创建/打开一个,然后关闭/处置它
string inProgressQuery = "SELECT TOP 10 IDType, ID, Program, Date, Body,
AcctNo, ANPACAcctID, ANPACClientID, TEAMID,
ImportDate, AnnualReview, TeamGUID,
ANPACClientLastName, ANPACClientFirstName, " +
"PolicyNumber, AccountOwnerLastName,
AccountOwnerFirstName, SCRACF, SCDateTime, NoteID
FROM NoteTable WHERE SQLMigrationFl = ?";
using(var command = new OleDbCommand(inProgressQuery, connection))
{
// I guessed on the type and length
command.Parameters.Add(new OleDbParameter("SQLMigrationFl", OleDbType.VarChar, 10)).Value = "I";
using(var reader = command.ExecuteReader())
{
while(reader.Read())
{
//clear the In Progress flag
const string UpdateQuery = "UPDATE NoteTable SET SQLMigrationFl = ? WHERE NoteTable.NoteID = ?";
using(var commandUpdate = new OleDbCommand(UpdateQuery, connection))
{
commandUpdate.Parameters.Add(new OleDbParameter("SQLMigrationFl", OleDbType.VarChar, 10)).Value = DBNull.Value;
commandUpdate.Parameters.Add(new OleDbParameter("NoteId", OleDbType.Int)).Value = reader[19];
commandUpdate.ExecuteNonQuery();
}
}
}
}
使用AddWithValue
或根本不使用AddWithValue
时,应指定类型。它可能导致意外的结果。使用指定类型。SQLMigrationFl
是否也是一个单值字段,或者如果I
包含在该字段的某个位置,您是否打算写入该字段?最后,您还可以在UPDATE
语句中为NoteId
使用一个参数。您能提供一个OleDbType用法的示例吗?SQLMigrationFl是一个单值字段。while循环中的读卡器行可能应该是一个命令。ExecuteOnQuery。(@CharlesMay该命令。ExecuteOnQuery()解决了我遇到的问题。在将其放入while循环后,成功地处理了所有十条记录。SQLMigrationFl是密钥吗?如果是这样,则每次都要更新同一行。