2

MySQL .Net 接続を使用するアプリケーションがありますが、何らかの理由で、結果を解析して結果を返すのに問題があります。

public NameValueCollection[] query(string query)
{
    connect();
    NameValueCollection[] resultSet;

    MySqlCommand command = connection.CreateCommand();
    MySqlDataReader Reader;

    command.CommandText = query;
    connection.Open();
    Reader = command.ExecuteReader();
    string theserows = "";
    while (Reader.Read())
    {
        for (int i = 0; i < Reader.FieldCount; i++){
            theserows += Reader.GetName(i)+"="+Reader.GetValue(i).ToString() + ",";
            Count = i;
        }
        theserows += "\n";
    }
    connection.Close();
    string[] results = theserows.Split(new char[] {'\n'}, StringSplitOptions.RemoveEmptyEntries);
    int countResultRows = 0;
    resultSet = new NameValueCollection[Count];
    foreach (string s in results)
    {
        resultSet[countResultRows] = new NameValueCollection();
        string[] result = s.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries);
        foreach (string col in results)
        {
            if (string.IsNullOrEmpty(col))
                continue;

            string[] kv = col.Split('=');
            resultSet[countResultRows].Add(kv[0], kv[1]);
        }
        countResultRows++;
    }
    return resultSet;
}

これtheserows = "site_id=1,\n"には例外がありますが、例外がstring[] result = s.Split(',');ありますIndexOutOfRangeException

このエラーが発生する理由について、誰かが洞察を与えることができますか?

別のメモとして、私がそれをすべて読んでから NameValueCollection を構築している理由は、完全なクエリとその結果をログに記録するログ システムを追加したいからです。

編集::

"count" (小文字) が countResultRows に変更されました

コールスタック

HTML5Streamer.exe!HTML5Streamer.Classes.MySQL.query(string query) Line 53   C#
HTML5Streamer.exe!HTML5Streamer.Classes.Query.getSiteId(string domain) Line 17 + 0x10 bytes C#
HTML5Streamer.exe!HTML5Streamer.Classes.Query.checkUserPass(string username, string password, string domain) Line 31 + 0xb bytes    C#
HTML5Streamer.exe!HTML5Streamer.Classes.Service.ProccessAdminRequest(System.Net.HttpListenerContext context) Line 239 + 0xd9 bytes  C#
HTML5Streamer.exe!HTML5Streamer.Classes.Service.ProcessRequest(System.Net.HttpListenerContext context) Line 176 + 0xb bytes C#
HTML5Streamer.exe!HTML5Streamer.Classes.Service.ListenerCallback(System.IAsyncResult result) Line 150 + 0xb bytes   C#

完全な例外の詳細

http://i.stack.imgur.com/EST4w.png 行 52 はresultSet[countResultRows] = new NameValueCollection(); 関数で、行 26 で開始し、行 65 で終了します

4

3 に答える 3

1

2 番目のループの直前に、文字列 "site_id=1" をコンマで区切り、分割しようとします。結果は 2 つの文字列の配列になり、2 番目の文字列は空になります。内部の foreach ループを次のように変更するだけです。

foreach (string col in result)
{
    if (string.IsNullOrEmpty(col))
        continue;

    string[] kv = col.Split('=');
    resultSet[count].Add(kv[0], kv[1]);
}
于 2012-05-13T13:40:11.737 に答える
1

2 つの異なる値 (count、Count) に同じ変数名を使用しないでください。構文的に正しい場合でも、混乱を招く可能性があります。

次に、配列にアクセスする前に、kv の長さが > 1 であるかどうかを確認する必要があります。

resultSet[count].Add(kv[0], kv[1]);

あなたのプログラムのロジックに従うと、文字列 "site_id=1,\n" が与えられ、分割後、結果 = {"site_id=1","\n"}、2 番目の文字列 kv = {"\n "} したがって、kv[1] は OutOfRangeException を返します。

これが私があなたのコードを書いた方法です

string[] results = theserows.Split(new char[]{'\n'},StringSplitOptions.RemoveEmptyEntries);
resultSet = new NameValueCollection[Count];
for(int i = 0; i < results.Length && i < Count; i++)
{
    string s = results[i];
    resultSet[i] = new NameValueCollection();
    string[] result = s.Split(new char[]{','},StringSplitOptions.RemoveEmptyEntries);
    foreach (string col in result) // As pointed by other users, this should be result insead of results, again bad var name choice
    {
        string[] kv = col.Split('=');
        if(kv.Length >= 2)
        resultSet[i].Add(kv[0], kv[1]);
    }
 }

OutOfRangeExceptions の可能性を回避する

于 2012-05-13T13:41:16.487 に答える
1

末尾のコンマとスペースに問題があります。さらに、 を反復するresults必要があるときに反復してresultいます。これを試して。

string[] results = theserows.Trim().Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries); ;
int count = 0;
resultSet = new System.Collections.Specialized.NameValueCollection[results.Length];
foreach (string s in results)
{
    resultSet[count] = new System.Collections.Specialized.NameValueCollection();
    string[] result = s.Trim().Split(new string[] { ","}, StringSplitOptions.RemoveEmptyEntries);
    foreach (string col in result)
    {
        string[] kv = col.Split('=');
        resultSet[count].Add(kv[0], kv[1]);
    }
    count++;
}
于 2012-05-13T13:46:10.083 に答える