Мне нужно выполнить внутреннее соединение с несколькими таблицами в моей программе на 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. Надеюсь, это кому-нибудь поможет.