DataGridView:确定SQL键值或关系

本文关键字:关系 键值 SQL 确定 DataGridView | 更新日期: 2023-09-27 18:00:37

有没有办法判断DataGridView列是PRIMARY KEY还是FOREIGN KEY

我之所以这么问,是因为我想把这些DataGridViewDataColumns设置为ReadOnly

加载DataTable后,我可以看到类似SQL的属性,如AllowDBNullAutoIncrementUnique;但是我该如何判断哪些列是键呢?

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查询来确定这一点,但我能用我提供给DataGridViewDataTable来判断吗?

我还看到了C#Linq-to-SQL的帖子:使用Linq-to-SQL引用这个Generic GetByID方法,但(尽管我尝试了)我只是不明白Linq-jibberish。

如果不支持确定密钥,最佳方法是什么?两个查询,一个用于模式,另一个用于数据,然后使用收集的模式遍历数据?

EDIT:我注意到,当使用查看数据表的模式时

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Table1'

返回一个COLUMN_FLAGS值。我正在查看的表显示了此表上主键的值18。这是一个好的测试吗?

DataGridView:确定SQL键值或关系

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));