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

就在第二个循环之前,您尝试使用逗号作为分隔符拆分字符串“site_id=1” - 结果将是一个包含两个字符串的数组,第二个字符串为空。只需将您的内部 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 个不同的值(计数、计数)使用相同的变量名称,即使它在语法上是正确的,这也可能会造成混淆。

其次,您应该在访问数组之前检查 kv 长度是否 > 1

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

如果我按照你程序的逻辑,给定字符串“site_id=1,\n”,在拆分后,result = {"site_id=1","\n"},对于第二个字符串 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 回答