如何查找绑定的DataGridView列的DataBase类型

时间:2014-04-30 14:12:19

标签: c# sql winforms datagridview sqldatatypes

我需要知道DataGridView中每列的原始类型。

它与动态SQL选择绑定,比如"SELECT * FROM artists;"

我想在网格上方添加数据的表单视图,并以编程方式创建标签和文本框,然后使用一些来保存字段。我将它们添加到FlowLayoutPanel但我想调整大小,特别是多行属性和高度,以容纳200-500个字符的长注释和描述字段。

我在查看文本列时找到的只是数据类型string

我知道我可以通过查询systable来查找列,但是找到原始数据类型比这更接近会很好;我也在使用MYSQL atm,而且不需要查询数据库的解决方案也可能是DBMS独立的。

修改1

我没有花哨的东西填充DGV:

DBDA = new MySqlDataAdapter(sql, DBC);
MySqlCommandBuilder cb = new MySqlCommandBuilder(DBDA);
DBDS = new DataSet(ddlb_tables.Text);
DBDA.FillSchema(DBDS, SchemaType.Mapped);  //<- This was the missing piece of code!!
DBDA.Fill(DBDS, ddlb_tables.Text);
dataGridView1.DataSource = DBDS;
dataGridView1.DataMember = ddlb_tables.Text;

修改2

在接受的答案(DBDA.MissingSchemaAction)的帮助下,我可以解决我的问题。以下是第一个原始版本中的结果函数:

public int getColumnSize(DataGridViewColumn dc)
{
  try
  {
    DataGridView DGV = dc.DataGridView;
    DataSet DS = (DataSet)DGV.DataSource;
    DataTable DT = DS.Tables[0];
    DataColumn DC = DT.Columns[dc.Name];
    return DC.MaxLength;
  } catch { }
  return -1;
}

只要我知道字段的长度,就不会得到原始类型。

1 个答案:

答案 0 :(得分:1)

使用DataSet代替DataGrid:

foreach (DataColumn col in DBDS[ddlb_tables.Text].Text.Columns)
{
    if (col.DataType == typeof(string))
    {
        var len = col.MaxLenght;
        ...
    }
}

编辑:

您可能需要在填写前添加以下行:

   DBDA.MissingSchemaAction = MissingSchemaAction.AddWithKey;

来源:The DataAdapter.Fill method does not set all of the properties of the DataTable and DataColumn objects

编辑2:

或者没有键的结果集:

   DBDA.FillSchema(DBDS, SchemaType.Source);

或者:

   DBDA.FillSchema(DBDS, SchemaType.Mapped);