【问题标题】:Check if Database field is Nullable Using C# Data Reader使用 C# 数据阅读器检查数据库字段是否可以为空
【发布时间】:2014-06-24 21:44:15
【问题描述】:

在 C# 中是否有办法以相对于数据库/平台无关的方式确定数据库字段是否可以为空?换句话说,在 Oracle 中我可以这样做:

select column_name, nullable
from all_tab_columns
where table_name = :TABLE

但这种方法受限于 Oracle,我必须为其他平台想出一个等效方法。

我希望通过数据提供者来实现这一点。我能够使用类似的东西来提取数据类型:

AseCommand cmd = new AseCommand(sql, conn);
AseDataReader reader = cmd.ExecuteReader();

for (int i = 0; i < reader.FieldCount; i++)
{
    string name = reader.GetName(i);
    string dbTypeName = reader.GetDataTypeName(i);
    Type dbType = reader.GetFieldType(i);
}

在本例中是 Sybase,但该方法在其他平台上是多态的,至少对于我一直在使用的数据库而言。

我唯一缺少的是该字段是否可以为空。

【问题讨论】:

  • 可能与此 [link][1] 重复,但与平台无关的部分除外。 [1]:stackoverflow.com/questions/3253943/…
  • 感谢您的链接。不幸的是,当它为空时,这有助于我处理该值,但它并没有告诉我该字段是否可能为空。不过,这实际上是值得一读的。
  • @ChrisHamel 我的答案是你想要的吗?

标签: c# nullable


【解决方案1】:

C# 中的 OLEDB 是一种与数据库无关的数据交互方式,它还支持检查空列。

    string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\data.accdb;Persist Security Info=False;"; //This will be different for differing connection methods (you can find more on [ConnectionStrings.com][1]
    OleDbConnection conn = new OleDbConnection(connString);
    DataSet mainData = new DataSet();
    OleDbCommand accessCommand = new OleDbCommand("SELECT * FROM YOUR_TABLE_HERE", conn);
    OleDbDataAdapter dataAdapter = new OleDbDataAdapter(accessCommand); //create the SQL command
    conn.Open();
    dataAdapter.Fill(mainData, "YOUR_TABLE_HERE"); //fill the dataset with the data from our SQL
    DataTable dta = mainData.Tables[0];

    DataTable schema = conn.GetSchema();
    schema.Tables["YOUR_TABLE_HERE"].Columns["YOUR_COLUMN_HERE"].AllowDBNull; //gets or sets if the column allows nulls

    conn.close();

More info OLEDB from MS

GetSchema Docs

【讨论】:

  • 感谢您的回复。无论出于何种原因,我都无法让它发挥作用。如果您只指定列名,我很好奇如何识别数据库/模式和表名。如果此方法的任何变体有效,那将是完美的解决方案。
  • @ChrisHamel 我添加了一个更完整的示例,但您应该查看底部的链接以获取更多信息。
  • 谢谢你——我会看看我能不能让它工作。我没有将 GetSchema() 视为 DataTable 类的可用方法(至少不是通过 Intellisense)。它确实显示了连接,但没有显示其他对象。如果我得到它的工作,我会提供反馈。
  • @ChrisHamel 我的错,我不知道我在做什么,这个编辑应该会更好。
  • 另外,.Net 的 SQLDataReader 有一个 'FieldExists' 方法:if (reader.FieldExists("FieldName"))
猜你喜欢
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
  • 2010-10-20
相关资源
最近更新 更多