有没有办法判断 DataGridView
列是 PRIMARY KEY
还是 FOREIGN KEY
?
我问的原因是因为我想将这些 DataGridViewDataColumns
设置为 ReadOnly
。
加载 DataTable
后,我可以看到类似 SQL 的属性,例如 AllowDBNull、AutoIncrement 和 Unique ;但我如何判断哪些列是键?
private void GetData(string tableName, SqlConnection con) {
bool wasOpen = (con.State == ConnectionState.Open);
DataTable table = new DataTable(tableName);
string sqlText = string.Format(SQL_SELECT_COMMAND, tableName);
SqlCommand cmd = new SqlCommand(sqlText, con);
if (!wasOpen) {
con.Open();
}
table.Load(cmd.ExecuteReader());
if (!wasOpen) {
con.Close();
}
dataGridView1.DataSource = table.DefaultView;
for (int i = 0; i < table.Columns.Count; i++) {
DataColumn tblC = table.Columns[i];
DataGridViewColumn dgvC = dataGridView1.Columns[i];
dgvC.ReadOnly = (!tblC.AllowDBNull && tblC.AutoIncrement && tblC.Unique);
}
}
上面最后一行的测试 (!tblC.AllowDBNull && tblC.AutoIncrement && tblC.Unique
) 是一个 hack,我知道它只在某些情况下有效。
我找到了帖子 How to determine a primary key for a table in SQL Server?展示了如何编写 SQL 查询来确定这一点,但是我可以使用提供给 DataGridView
的 DataTable
以某种方式告诉我吗?
我也看到帖子C# Linq-to-SQL: Refectoring this Generic GetByID method使用 Linq-to-SQL,但是(虽然我尝试过)我只是不明白 Linq 的胡言乱语。
如果不支持确定 key ,最好的方法是什么?两个查询,一个用于架构,另一个用于数据,然后使用收集的架构遍历数据?
编辑:我注意到在查看数据表的模式时使用:
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Table1'
我返回了一个 COLUMN_FLAGS
值。我正在查看的表显示该表上我的 Primary Key 的值为 18
。这是一个好的测试吗?
最佳答案
DataTable
有一个属性 PrimaryKey
这是 DataColumns
的集合。
如果在调用ExecuteReader
时设置了CommandBehavior
参数给KeyInfo
,那么就可以从主键属性中获取主键列信息.
table.Load(cmd.ExecuteReader(CommandBehavior.KeyInfo));
使用集合中每一列的 ColumnName
属性,然后您可以设置 DataGridView
列的 Readonly
属性。
foreach (DataColumn d in dt.PrimaryKey)
{
if (dataGridView1.Columns[d.ColumnName] != null)
{
dataGridView1.Columns[d.ColumnName].ReadOnly = true;
}
}
CommandBehaviour 还有其他有用的值,例如 SchemaOnly,您可以将它们组合起来,如下所示:
table.Load(cmd.ExecuteReader(CommandBehavior.KeyInfo | CommandBehaviour.SchemaOnly));
关于c# - DataGridView:确定 SQL 键值或关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6523299/