2016-07-31 2 views
1

, впервые обратившись за помощью.MySqlDataReader не читает мой запрос, как если бы не было возвращенных строк, но PHPMyAdmin возвращал строки с тем же запросом

Я знаю, что мое название ошибочно, я изменю его, если мы подумаем, в чем проблема, на данный момент я его потерял.

Хорошо, сначала мы хотим выбрать всех пользователей из моей базы данных, находящихся в диапазоне текущего пользователя.

Если я выполнить запрос он возвращает 4 строки из PHPMyAdmin, о я должен упомянуть, им с помощью MariaDB

Вот запрос:

SET @orig_lat=45.820904; 
SET @orig_lon=-73.760549; 
SET @dist=1000 * 5;//5 KM 
SET @accountId=9; 

SELECT SQL_CALC_FOUND_ROWS *, (((acos(sin((@orig_lat*pi()/180)) * sin((account.latitude*pi()/180))+cos((@orig_lat*pi()/180))*cos((account.latitude*pi()/180))*cos(((@orig_lon-account.longitude)*pi()/180))))*180/pi())*60*1.1515*1609.344) AS distance FROM accounts AS account HAVING distance <= @dist AND account.id <> @accountId ORDER BY distance ASC LIMIT 50 OFFSET 0;0 

Теперь из C# вот как это выглядит:

public static Dictionary<List<AccountData>, int> SearchAccounts(string accountId, double latitude, double longitude, int rangeInKM, int limit, int page = 1){ 
List<AccountData> returnList = new List<AccountData>(); 
int total_count = 0; 
query = "SELECT SQL_CALC_FOUND_ROWS *, (((acos(sin((@orig_lat*pi()/180)) * sin((account.latitude*pi()/180))+cos((@orig_lat*pi()/180))*cos((account.latitude*pi()/180))*cos(((@orig_lon-account.longitude)*pi()/180))))*180/pi())*60*1.1515*1609.344) AS distance FROM accounts AS account HAVING distance <= @dist AND account.id <> @accountId ORDER BY distance ASC LIMIT @limit OFFSET @page;"; 
var rows = Database.ExecuteQuery(query, 
       new QueryParameter("accountId", accountId), 
       new QueryParameter("orig_lat", latitude), 
       new QueryParameter("orig_lon", latitude), 
       new QueryParameter("dist", 1000 * rangeInKM), 
       new QueryParameter("limit", limit), 
       new QueryParameter("page", page - 1)); 

функция ExecuteQuery код:

public override DatabaseRow[] ExecuteQuery (string query, params QueryParameter[] parameters) 
    { 
     try 
     { 
      using (MySqlConnection connection = new MySqlConnection (connectionString)) 
      { 
       using (MySqlCommand command = new MySqlCommand (query, connection)) 
       { 
        foreach (QueryParameter parameter in parameters) 
         command.Parameters.AddWithValue(parameter.name, parameter.obj); 

        connection.Open(); 
        using (MySqlDataReader reader = command.ExecuteReader()) 
        { 
         int fieldCount = reader.FieldCount; 
         List<DatabaseRow> rows = new List<DatabaseRow>(); 

         while (reader.Read()) 
         { 
          //For each row create a DatabaseRow 
          DatabaseRow row = new DatabaseRow(); 

          //And add each field to it 
          for (int i = 0; i < fieldCount; i++) 
          { 
           row.Add(
            reader.GetName(i), 
            reader.GetValue(i) 
           ); 
          } 

          //Add it to the rows 
          rows.Add(row); 
         } 

         return rows.ToArray(); 
        } 
       } 
      } 
     } 
     catch(MySqlException e) 
     { 
      throw new DatabaseException(e.Message, e); 
     } 
    } 

Обратите внимание, что цикл while (reader.read()) ... никогда не срабатывает, как если бы они не соответствовали запросу.

Теперь, я потерял то, что я должен был сделать, чтобы исправить эту проблему, вся помощь приветствуется!

Большое спасибо за вашу помощь :)

ответ

0

Хорошо я понял, что мой вопрос, я был разборе широты как долготы в параметрах запроса.

Я оставляю его на случай, если кому-то нужен код. Всегда дважды проверить параметры;)

Необходимо, чтобы изменить

var rows = Database.ExecuteQuery(query, 
      new QueryParameter("accountId", accountId), 
      new QueryParameter("orig_lat", latitude), 
      new QueryParameter("orig_lon", latitude), 
      new QueryParameter("dist", 1000 * rangeInKM), 
      new QueryParameter("limit", limit), 
      new QueryParameter("page", page - 1)); 

Для

var rows = Database.ExecuteQuery(query, 
      new QueryParameter("accountId", accountId), 
      new QueryParameter("orig_lat", latitude), 
      new QueryParameter("orig_lon", longitude), 
      new QueryParameter("dist", 1000 * rangeInKM), 
      new QueryParameter("limit", limit), 
      new QueryParameter("page", page - 1)); 
Смежные вопросы