我需要在C#程序中使用多个表进行内部联接。
我尝试在同一数据库中使用DBeaver执行查询,并且该查询有效。 但是,当我在C#代码中使用相同的查询时,它不返回任何内容。我知道连接的工作原理,因为我从其中一张表中获取数据,并且确实填满了。另外,它只做一个内部联接就起作用了。 我使用SQLite NuGet包。
这是我的查询(我在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
的{{1}}有0行。
我尝试按照INNER JOIN to more than one table中的说明使用括号,但是它也不起作用。 我真的看不到是什么原因造成的。
如果数据库的ER图可以解决问题,我可以编辑问题并将其添加。
编辑:我编辑了CommandText,因为我留下了一些不该出现的括号,并且我还尝试了重置SqliteCommand变量(因为我之前在另一个命令中使用了它)。也不起作用。我将尝试对SQLiteCommand使用另一个变量,因为我不知道重用它是否会影响结果?
EDIT2:我根本没有使用SQLiteCommand变量,所以摆脱了它。我尝试处置SQLiteAdapter(因为我确实将它用于我之前获得的表数据),但是它也不起作用。 它不会给我任何错误或异常,它只是在DataSet中创建Table,但是行数为0。
EDIT3:我找不到查询问题。我和一个同事聊天,他们告诉我,由于查询可在DBeaver之类的程序上运行,可能是因为.NET中的驱动程序工作不同。最后,我只是将每个表收集到不同的DataTables中,并获得了需要迭代和使用if控制语句的信息。我希望这对某人有帮助。
答案 0 :(得分:0)
有2个问题
Attribute
中使用反引号除去引号。WHERE table.RxTx LIKE 'Tx'"
之前添加别名或表名希望这对您有帮助
答案 1 :(得分:0)
这是一个老问题,我想我没有找到合适的答案,但我正在复制粘贴我的最后一次编辑,因为这似乎是我解决问题的方式。
<块引用>我找不到查询的问题。我与一位同事交谈,他们告诉我,由于查询适用于 DBeaver 等程序,可能是因为 .NET 中的驱动程序工作方式不同。最后,我只是收集了不同 DataTable 中的每个表,并获得了我需要迭代和使用 if 控制语句的信息。
我将此标记为我的答案,但不会关闭帖子,以防有人在某个时候发现真正的问题。