DataGridView:确定SQL键值或关系
本文关键字:关系 键值 SQL 确定 DataGridView | 更新日期: 2023-09-27 18:00:37
有没有办法判断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
)是一个破解,我知道它只在某些情况下有效。
我找到了"如何在SQL Server中确定表的主键?"?展示了如何编写SQL查询来确定这一点,但我能用我提供给DataGridView
的DataTable
来判断吗?
我还看到了C#Linq-to-SQL的帖子:使用Linq-to-SQL引用这个Generic GetByID方法,但(尽管我尝试了)我只是不明白Linq-jibberish。
如果不支持确定密钥,最佳方法是什么?两个查询,一个用于模式,另一个用于数据,然后使用收集的模式遍历数据?
EDIT:我注意到,当使用查看数据表的模式时
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Table1'
返回一个COLUMN_FLAGS
值。我正在查看的表显示了此表上主键的值18
。这是一个好的测试吗?
DataTable
具有属性PrimaryKey
,该属性是DataColumns
的集合。
如果在将ExecuteReader
调用为KeyInfo
时设置了CommandBehavior
参数,则可以从主键属性中检索主键列信息。
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;
}
}
CommandBehavior还有其他有用的值,例如SchemaOnly,您可以按如下所示进行组合:
table.Load(cmd.ExecuteReader(CommandBehavior.KeyInfo | CommandBehaviour.SchemaOnly));