3

奇妙な問題があります。私は MySQL Connector.NET を使用していますが、MySqlReader.Read()時々 true を返したり、時には false を返したりします。MySqlReader.HasRowsどちらの場合も true であり、VisualStudio では、リーダー オブジェクトがすべての値を保持していることがわかります。

なぜそれが起こり得るのですか?

これが私のコードです:

MySqlCommand sqlCommand = new MySqlCommand(sqlCode, this._conn);
MySqlDataReader rdr = sqlCommand.ExecuteReader();
PopulateMessage("--> " + serverName + ": " + dbName);
int fields = rdr.VisibleFieldCount;

//make headers
int[] fmaxl = new int[fields];
string[] headers = new string[fields];
List<string[]> vals = new List<string[]>();
if (rdr.HasRows)
{
        for (int hi = 0; hi < fields; hi++)
        {
                string val = rdr.GetName(hi);
                headers[hi] += val;
                fmaxl[hi] = val.Length;
        }
        while (rdr.HasRows && rdr.Read()) // <-- here the Read() method returns 
                                          //     false or true sometimes
                                          //     while HasRows is true
        {
                ...

EIDT:rdrたとえば、99 行の値を保持し (VS でチェック)、最初の呼び出しでRead()メソッドは false を返します。この有益な通知を私にさせてくれた Joachim に感謝します。

4

1 に答える 1

1

この HasRows プロパティは、.net のすべてのバージョンにあるわけではありません。このようにコードを再キャストしてみませんか?

boolean firstRow = true;
while (rdr.Read()) 
{
   if (firstRow) {   // get the column names, but only once 
       firstRow = false;
       for (int hi = 0; hi < fields; hi++)
       {
            string val = rdr.GetName(hi);
            headers[hi] += val;
            fmaxl[hi] = val.Length;
       }
    }

    ... //process each row.
}

この種のことを大量に行ってきたので、これがかなりうまくいくことを私は知っています。

于 2013-07-15T12:19:19.353 に答える