2016-07-16 2 views
0

Я делаю генератор запросов SQLite в C# для проекта таймера по пересеченной местности. Он генерирует запросы в соответствии с информацией, которую вы выбираете в ComboBoxes.C# SQL - Загрузка DataTable в DataGridView изменяет данные SQL-запроса

С самого начала моего проекта, я использую следующую функцию

private static DataTable ExecuteTableQuery(String query) 
{ 
    DataTable dt = new DataTable(); 
    using (SQLiteCommand cmd = new SQLiteCommand(query, CONNECTION)) 
    { 
     SQLiteDataReader reader = cmd.ExecuteReader(); 
     dt.Load(reader); 
     return dt; 
    } 
} 

для того, чтобы установить DataSource мой DataGridView формы.

Но, чем сложнее мои сгенерированные запросы, тем больше я начал сталкиваться с нечетными ситуациями.

Пример запроса:

SELECT "No. Arrived", "Status", "Time", "Time Total", "No. Runner" // [A] 
FROM (
    SELECT `Runner_no` AS "No. Runner", // Runner_no is a PK 
      `Result_time` AS "Time", 
      `Result_totaltime` AS "Time Total", 
      `Result_status` AS "Status", 
      `Result_registered` AS "No. Arrived" // Result_registered is a PK 
      // [B] 
    FROM `Result`, `Runner`, `City` 
    WHERE `Runner_City_id` = `City_id` // City_id is a PK 
     AND `Result_id` = `Runner_no` 
     AND (`Runner_gender` = "F" OR `Runner_gender` = "M") 
     AND (`Result_status` = "hurt" OR `Result_status` = "disq" OR `Result_status` = "OK") 

    UNION // Some people may have not reached the finish line. 

    SELECT `Runner_no` AS "No. Runner", 
      NULL AS "Time", 
      NULL AS "Time Total", 
      NULL AS "Status", 
      NULL AS "No. Arrived" 
    FROM `Result`, `Runner`, `City` 
    WHERE `Runner_City_id` = `City_id` 
     AND `Runner_no` NOT IN (SELECT `Result_id` FROM `Result`) 
     AND (`Runner_gender` = "F" OR `Runner_gender` = "M") 
    GROUP BY "Runner_no" 
) 
ORDER BY "No. Arrived" ASC 

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

МОЕЙ ПРОБЛЕМА: Большая часть времени (я думаю), когда мои сгенерированные запросы имеют первичные ключи в некоторых пунктах (например, в моем примере), некоторые результаты опущены, упорядочение пренебрегает, а иногда, выбрав другую строку [A] может заставить запрос работать снова.

В моем примере: No. Arrived столбец не упорядочен, некоторая строка исчезает и добавление столбца City_id в [A] и [B] решает все.

NOTA BENE: В любом запросе, создаваемом моим приложением, нет никаких ошибок. Выполнение их в любом внешнем программном обеспечении SQLite (например, http://sqlitebrowser.org/) всегда успешное.

МОИ ВОПРОСЫ: Почему это происходит, когда я загружаю данные в DataTable? Как я могу избежать этого? Как я могу получить в C# тот же результат, который я бы получил, используя программное обеспечение на базе C++, такое как SQLiteBrowser?

ответ

0

Я получил мой ответ Спасибо за help Мне кажется, что (в моем случае) я не могу использовать SQLiteCommand, так как он будет опускать некоторые основные правила SQL (не уверен, что именно точно) во время чтения, чтобы уменьшить перегрев.

Для сложных запросов, подобных моим, используя SQLiteDataAdapter отлично работает.

private static DataTable ExecuteTableQuery(String Query) 
{ 
    using (SQLiteDataAdapter adapter = new SQLiteDataAdapter(Query, CONNECTION)) 
    { 
     DataTable dt = new DataTable(); 
     adapter.Fill(dt); 
     return dt; 
    } 
} 
-1

я нашел столбцы в вашем заявлении союза не соответствует столбцы в [A]

SELECT `Runner_no` AS "No. Runner", 
     NULL AS "Time", 
     NULL AS "Time Total", 
     NULL AS "Status", 
     NULL AS "No. Arrived" 

Является ли это естественно?

или это может быть:

SELECT NULL AS "No. Arrived" , 
    NULL AS "Status", 
    NULL AS "Time", 
    NULL AS "Time Total", 
    `Runner_no` AS "No. Runner" 

......

Если вы уверены, что SQL заявление дает ожидаемый результат, так что проблема может быть в DataTble Загрузка:

Я предлагаю:

-Отдай DataTble имя:

DataTable dt = новый DataTable («MyTable»);

имена использование псевдонимов без пробелов или точек на внешнем SQL [A]:

SELECT "No. Приехали", как no_arrived, "Статус", "Время", "Время Total", как time_total «No.Runner», как no_runner -! [A]

Кстати, если вы используете имена псевдонимов во внешнем SQL [A], вам не нужно использовать имена псевдонимов внутренней SQL

+0

если мой ответ sati вы хотите, отметьте это как ответ –

Смежные вопросы