c# - DataGridView:确定 SQL 键值或关系?

标签 c# sql sql-server datagridview datatable

有没有办法判断 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) 是一个 hack,我知道它只在某些情况下有效。

我找到了帖子 How to determine a primary key for a table in SQL Server?展示了如何编写 SQL 查询来确定这一点,但是我可以使用提供给 DataGridViewDataTable 以某种方式告诉我吗?

我也看到帖子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/

相关文章:

sql - 在 SSIS 表达式中查找前一周的第一天和最后一天

c# - 在不触发验证客户端的情况下检查验证组是否有效

c# - C 和 C# 实现之间的 AES/CBC 加密差异

c# - 软件架构设计: Number of classes

sql - 使用查询 SQL Server 2008 选择 DATEADD 分钟

sql - 如何更新表格以在数字的固定位置插入小数点?

sql - 如何使用 MySQL 计算移动平均线?

c# - 如何最小化文件搜索运行时的复杂性?

sql - 对于星期一,我需要将应用程序的默认日期设置为上星期五吗?

sql - 使用 t-SQL 检索 XML 元素名称