Внутреннее объединение нескольких таблиц в C # с SQLite - PullRequest
0 голосов
/ 30 апреля 2019

Мне нужно выполнить внутреннее соединение с несколькими таблицами в моей программе на C #.

Я пытался выполнить мой запрос с использованием DBeaver в той же базе данных, и он работает. Но когда я использую тот же запрос в своем коде C #, он ничего не возвращает. Я знаю, что соединение работает, так как я получаю данные из одной из таблиц, и она заполняется. Кроме того, это сработало, просто сделав одно внутреннее соединение. Я использую SQLite NuGet Package.

Это мой запрос (тот, который я использовал в DBeaver):

SELECT mcc.ModeloId, t.FctrlClusterId, mcc.FctrlClusterDescription, cl.ClusterId, cl.ClusterName, 
t.Command, co.CommandName, t.AttributeId, at.AttributeName, t.DataPosition, t.DataType, t.TramaData
FROM Trama t
INNER JOIN ModeloClusterCanal mcc ON t.FctrlClusterId = mcc.FctrlClusterId 
INNER JOIN Cluster cl ON mcc.ClusterId = cl.ClusterId
INNER JOIN Command co ON t.Command = co.CommandId
INNER JOIN Attribute at ON t.AttributeId = at.AttributeId
WHERE RxTx LIKE 'Tx'

А это мой код C # (с тем же запросом, но с использованием String.Format()):


private static readonly string tablaCluster = "Cluster";
private static readonly string tablaCommand = "Command";
private static readonly string tablaAttribute = "Attribute";
private static readonly string tablaModeloClusterCanal = "ModeloClusterCanal";
private static readonly string tablaTrama = "Trama";

CommandText = String.Format("SELECT mcc.ModeloId, t.FctrlClusterId, mcc.FctrlClusterDescription, cl.ClusterId, cl.ClusterName, t.Command, " +
    "co.CommandName, t.AttributeId, at.AttributeName, t.DataPosition, t.DataType, t.TramaData " +
    "FROM {0} t " +
    "INNER JOIN {1} mcc ON t.FctrlClusterId = mcc.FctrlClusterId " +
    "INNER JOIN {2} cl ON mcc.ClusterId = cl.ClusterId " +
    "INNER JOIN {3} co ON t.Command = co.CommandId " +
    "INNER JOIN \"{4}\" at ON t.AttributeId = at.AttributeId " +
    "WHERE t.RxTx LIKE 'Tx'", 
    tablaTrama,
    tablaModeloClusterCanal,
    tablaCluster,
    tablaCommand,
    tablaAttribute);

    SqliteAdapter = new SQLiteDataAdapter(CommandText, SqliteConnection);
    SqliteAdapter.Fill(DataSet, "TramasTx");

(перед этим кодом я открываю соединение и заполняю DataSet другой таблицей)

Я также пытался использовать строку запроса напрямую, без ее форматирования, но он дал тот же результат.

В DBeaver я получаю нужные столбцы и нужные мне строки.

В C # Table, которым я заполняю DataSet, имеет 0 строк.

Я пытался использовать круглые скобки, как сказано в INNER JOIN для более чем одной таблицы , но это тоже не сработало. Я действительно не вижу, что может вызвать это.

В случае, если диаграмма ER БД может помочь, я могу отредактировать вопрос и добавить его.


РЕДАКТИРОВАТЬ: Я редактировал CommandText, так как я оставил некоторые круглые скобки, которых не должно быть, и я также попытался сбросить переменную SqliteCommand (потому что я использовал ее раньше, с другой командой), но это не тоже не работает. Я попытаюсь использовать другую переменную для SQLiteCommand, так как я не знаю, может ли ее повторное использование повлиять на результат?


EDIT2: Я вообще не использовал переменную SQLiteCommand, поэтому избавился от нее. Я попытался избавиться от SQLiteAdapter (так как я использую его для данных таблицы, которые я получал раньше), но он тоже не работал. Это не дает мне никакой ошибки или исключения, оно просто создает таблицу внутри DataSet, но количество строк равно 0.


EDIT3: Не удалось найти проблему с запросом. Я разговаривал с коллегой, и они сказали мне, что, поскольку запрос работает в таких программах, как DBeaver, это может быть потому, что драйвер в .NET работает по-другому. В конце я просто собрал каждую таблицу в разные DataTables и получил информацию, которую мне нужно было перебрать и использовать операторы if. Надеюсь, это кому-нибудь поможет.

1 Ответ

0 голосов
/ 30 апреля 2019

есть 2 вопроса

  1. Почему вы использовали кавычки в имени таблицы (Attribute), удалите кавычки.
  2. В предложении where добавьте псевдоним или имя таблицы перед именем столбца WHERE table.RxTx LIKE 'Tx'"

Надеюсь, это поможет вам полностью

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