2012-05-13 3 views
2

У меня есть приложение, использующее соединение MySQL .Net, но по какой-то причине у меня возникают проблемы при разборе результатов, чтобы вернуть их,IndexOutOfRangeException Метательное для струнного .split C#

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, я хочу, чтобы добавить систему регистрации, которая регистрирует полный запрос, и это приводит к

EDIT ::

«счетчик» (в нижнем регистре) изменено на countResultRows

CallStack

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# 

Full Exception Detiails

http://i.stack.imgur.com/EST4w.png линия 52 является resultSet[countResultRows] = new NameValueCollection(); функция начинается в строке 26 заканчивается в 65

+0

IndexOutOfRangeException должны быть брошены на 'Resultset [число] = новый NameValueCollection()' – Leri

+0

Попробуйте использовать 'String [] = результаты theserows.Split ('\ п', StringSplitOptions.RemoveEmptyEntries); 'и' string [] result = s.Split (',', StringSplitOptions.RemoveEmptyEntries) 'и сообщить нам, что происходит ... – Marco

+1

Это ваш настоящий код? Наличие переменных с именем «count» и «Count» - действительно плохая идея. –

ответ

1

Вы не должны использовать одни и те же имена переменных для 2-х различных значений (досчитай), даже если это синтаксически правильно, это может привести к путанице.

Во-вторых, вы должны проверить, если длина киловольт составляет> 1, прежде чем получить доступ к массив

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

Если я следовать логике вас программы, учитывая строку «site_id = 1, \ п», после раскола , 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

+0

Оператор «<» не может применяться к операндам типа «int» и «группа методов» - ошибка компилятора (VS выделен я нажал кнопку «Отладка только для проверки») –

+0

Спасибо, что отправились на дополнительную милю +1 –

1

Непосредственно перед вторым контуром вы пытаетесь разделить строку «Site_ID = 1,» с запятой является разделителем - результат будет массив из двух строк, второй - пустым. Просто измените свой внутренний цикл Еогеасп к следующему:

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

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

. Вы указываете правильную ошибку, но ваш ответ не будет иметь «site_id = 1, anystringwithoutequal "string value. –

+0

Правда, в этом фрагменте кода отсутствует достаточно логики проверки ошибок. –

+0

Ошибка проверки по-прежнему, так как я бы хотел, чтобы она работала, прежде чем я начну ловить ошибки, которые не являются нормальными PS Это исправление не работает такая же ошибка –

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++; 
} 
+0

. Такая же ошибка еще –

+0

Спасибо для вашей помощи я реализовал часть вашего кода –