如何在c#中动态连接T-SQL表,ListView中的COLUMNS

本文关键字:ListView 中的 COLUMNS T-SQL 连接 动态 | 更新日期: 2023-09-27 18:04:02

是否有一种方法可以动态地连接SQL表?例如,查看所提供的表并在主键和外键之间生成连接语句的函数

我有项目在winform listview

 1. TABLE1.NAME
 1. TABLE2.AGE
 1. TABLE3.ADDRESS
在数据库中,我有3个表:
TABLE1
------
 - TBL1_ID 
 - NAME
TABLE2
------
 - TBL_ID2
 - TBL1_ID_FK
 - AGE
TABLE3
------
 - TBL_ID3
 - TBL2_ID_FK
 - ADDRESS

我想要达到的输出应该是这样的:

选择表。名称,表二。年龄,TABLE3。表1连接表2的地址ON TBL2_ID_FK = TBL1_ID JOIN TABLE3

如何在c#中动态连接T-SQL表,ListView中的COLUMNS

你可能不想这样做…如果你真的认为你需要这样做,把这看作是一种方法:

阅读并理解TSQL SELECT语法:https://msdn.microsoft.com/en-US/en-en/library/ms189499.aspx

把你的问题分解成语法的片段

你需要创建一个select_list,一个table_source和一个WHERE子句

创建一个表示模式的数据结构(如何连接表,哪些列在哪个表中)

为列选择,遍历所有选择的列,并找到它们所在的表。将表选择存储在临时列表中(请记住,列选择还需要保存与其他所选列的关联信息……例如,Person可以是某些商品的买方,也可以是卖方,而在这两种情况下,记录都存储在同一个表中。这些列本身并不包含关于以何种方式连接Person表的足够信息…买方还是卖方?)

对于表选择,选择其中一个表作为起始点,并将该表作为FROM子句的第一个表,遍历所有选定的表,并根据模式定义查找如何连接/连接它们的所有路径,并保留那些对列选择的关联有效的路径。沿着这些路径,将所有表及其关联的连接条件添加到from子句中,同时为每个表指定一个不同的名称。现在可以根据表和关联减少连接(每个表和关联只需要一对)

更新列选择以引用给连接表的名称,使用表的关联信息来匹配正确的列

最后,实际生成所有片段的文本,并将它们按正确的顺序放在一起…

正如你所看到的,一般的解决方案是努力工作…如果你可以降低你的期望,特别是在关联方面,你可以大大降低复杂性,但它并不适用于所有情况

或者使用ORM,这将为您节省数千小时…

以EF为例,您可以使用用户定义的表达式树来投影您想要的结果,EF会为您处理语句

仅举几个例子:

LINQ to SQL: https://msdn.microsoft.com/en-us/library/bb425822.aspx

实体框架:http://www.entityframeworktutorial.net/what-is-entityframework.aspx

我使用LINQ到SQL,我很高兴。因此,如果你想要编码而不是"设计"东西,我会推荐它。

虽然我认为这是一个不好的做法,但有时您必须动态创建SQL语句。在本例中,您将命令创建为字符串,然后使用SQL的EXEC命令运行它。

下面是一个例子(SQL Server严格的SQL语句):

declare @cmd varchar(max) = 'Select * from Name'
-- apply your logic to modify the select statement and create the final query
EXEC (@cmd)