如何在 .NET 中获取外键信息
How To Get Foreign Key Information In .NET
我正在尝试使用 .NET GetSchema
方法检索有关 SQL 服务器中某些 table 的元数据。
我可以取回列信息,例如数据类型和大小,但是当我尝试 "ForeignKeys" 时,它没有告诉我相关 table 的名称或相关列名称。
下面是我当前的代码。
这可以用 GetSchema
来完成吗?如果没有,我将求助于在系统 tables 或信息 tables 上使用 SQL 查询,无论它们叫什么。
如果您不知道 GetSchema
答案,请随时提出一个好的 SQL 查询。
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
string[] restrictions = new string[4];
restrictions[1] = schemaName;
restrictions[2] = tableName;
DataTable schema = connection.GetSchema("ForeignKeys", restrictions);
}
请记住,外键关系可以由多个列组成。这是我用于 FK 列映射的查询:
select
IS_KCU1.CONSTRAINT_SCHEMA,
IS_KCU1.CONSTRAINT_NAME,
IS_KCU1.TABLE_SCHEMA FK_TABLE_SCHEMA,
IS_KCU1.TABLE_NAME FK_TABLE_NAME,
IS_KCU1.COLUMN_NAME FK_COLUMN_NAME,
IS_KCU2.TABLE_SCHEMA REFERENCED_TABLE_SCHEMA,
IS_KCU2.TABLE_NAME REFERENCED_TABLE_NAME,
IS_KCU2.COLUMN_NAME REFERENCED_COLUMN_NAME
from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS IS_RC
inner join INFORMATION_SCHEMA.KEY_COLUMN_USAGE IS_KCU1
on IS_KCU1.CONSTRAINT_CATALOG = IS_RC.CONSTRAINT_CATALOG
and IS_KCU1.CONSTRAINT_SCHEMA = IS_RC.CONSTRAINT_SCHEMA
and IS_KCU1.CONSTRAINT_NAME = IS_RC.CONSTRAINT_NAME
inner join INFORMATION_SCHEMA.KEY_COLUMN_USAGE IS_KCU2
on IS_KCU2.CONSTRAINT_CATALOG = IS_RC.UNIQUE_CONSTRAINT_CATALOG
and IS_KCU2.CONSTRAINT_SCHEMA = IS_RC.UNIQUE_CONSTRAINT_SCHEMA
and IS_KCU2.CONSTRAINT_NAME = IS_RC.UNIQUE_CONSTRAINT_NAME
and IS_KCU2.ORDINAL_POSITION = IS_KCU1.ORDINAL_POSITION
我想我会使用 SMO 对象,如果我可以在我的网络主机上 运行 获取它们的话。我收到无法找到 SqlClrProvider 的新错误。我在我的本地机器上找不到那个 dll,但 SMO 在我的本地机器上工作。编辑:我找到了 SqlClrProvider.dll,添加了参考,重新发布到我的虚拟主机,它 运行 完美。使用 SMO 对象获取外键元数据的问题已解决。
我正在尝试使用 .NET GetSchema
方法检索有关 SQL 服务器中某些 table 的元数据。
我可以取回列信息,例如数据类型和大小,但是当我尝试 "ForeignKeys" 时,它没有告诉我相关 table 的名称或相关列名称。
下面是我当前的代码。
这可以用 GetSchema
来完成吗?如果没有,我将求助于在系统 tables 或信息 tables 上使用 SQL 查询,无论它们叫什么。
如果您不知道 GetSchema
答案,请随时提出一个好的 SQL 查询。
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
string[] restrictions = new string[4];
restrictions[1] = schemaName;
restrictions[2] = tableName;
DataTable schema = connection.GetSchema("ForeignKeys", restrictions);
}
请记住,外键关系可以由多个列组成。这是我用于 FK 列映射的查询:
select
IS_KCU1.CONSTRAINT_SCHEMA,
IS_KCU1.CONSTRAINT_NAME,
IS_KCU1.TABLE_SCHEMA FK_TABLE_SCHEMA,
IS_KCU1.TABLE_NAME FK_TABLE_NAME,
IS_KCU1.COLUMN_NAME FK_COLUMN_NAME,
IS_KCU2.TABLE_SCHEMA REFERENCED_TABLE_SCHEMA,
IS_KCU2.TABLE_NAME REFERENCED_TABLE_NAME,
IS_KCU2.COLUMN_NAME REFERENCED_COLUMN_NAME
from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS IS_RC
inner join INFORMATION_SCHEMA.KEY_COLUMN_USAGE IS_KCU1
on IS_KCU1.CONSTRAINT_CATALOG = IS_RC.CONSTRAINT_CATALOG
and IS_KCU1.CONSTRAINT_SCHEMA = IS_RC.CONSTRAINT_SCHEMA
and IS_KCU1.CONSTRAINT_NAME = IS_RC.CONSTRAINT_NAME
inner join INFORMATION_SCHEMA.KEY_COLUMN_USAGE IS_KCU2
on IS_KCU2.CONSTRAINT_CATALOG = IS_RC.UNIQUE_CONSTRAINT_CATALOG
and IS_KCU2.CONSTRAINT_SCHEMA = IS_RC.UNIQUE_CONSTRAINT_SCHEMA
and IS_KCU2.CONSTRAINT_NAME = IS_RC.UNIQUE_CONSTRAINT_NAME
and IS_KCU2.ORDINAL_POSITION = IS_KCU1.ORDINAL_POSITION
我想我会使用 SMO 对象,如果我可以在我的网络主机上 运行 获取它们的话。我收到无法找到 SqlClrProvider 的新错误。我在我的本地机器上找不到那个 dll,但 SMO 在我的本地机器上工作。编辑:我找到了 SqlClrProvider.dll,添加了参考,重新发布到我的虚拟主机,它 运行 完美。使用 SMO 对象获取外键元数据的问题已解决。