使用SQLite

时间:2019-04-30 10:46:13

标签: c# wpf sqlite

我需要在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控制语句的信息。我希望这对某人有帮助。

2 个答案:

答案 0 :(得分:0)

有2个问题

  1. 为什么要在表名(Attribute中使用反引号除去引号。
  2. 在where子句中,在列名WHERE table.RxTx LIKE 'Tx'"之前添加别名或表名

希望这对您有帮助

答案 1 :(得分:0)

这是一个老问题,我想我没有找到合适的答案,但我正在复制粘贴我的最后一次编辑,因为这似乎是我解决问题的方式。

<块引用>

我找不到查询的问题。我与一位同事交谈,他们告诉我,由于查询适用于 DBeaver 等程序,可能是因为 .NET 中的驱动程序工作方式不同。最后,我只是收集了不同 DataTable 中的每个表,并获得了我需要迭代和使用 if 控制语句的信息。

我将此标记为我的答案,但不会关闭帖子,以防有人在某个时候发现真正的问题。