Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OleDB查询不返回所有结果_C#_Oledb_Oledbcommand - Fatal编程技术网

C# OleDB查询不返回所有结果

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

我希望我的代码能够收集SQLMigrationFl字段中具有“I”的前十条记录,然后通过删除该“I”值来处理这十条记录。下面是处理此问题的代码部分

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是密钥吗?如果是这样,则每次都要更新同一行。