2014-06-20 71 views
0

C#中有一種方式可以確定數據庫字段在相對數據庫/平臺不可知的情況下是否爲空?換句話說,在Oracle我可以做這樣的事情:使用C#數據讀取器檢查數據庫字段是否可爲空使用C#數據讀取器檢查數據庫字段是否可空

select column_name, nullable 
from all_tab_columns 
where table_name = :TABLE 

但這種方法是拴在甲骨文,我不得不拿出等同於其他平臺。

我希望通過數據提供者來做到這一點。我能夠使用類似於這樣提取的數據類型:

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,但方法是多態的跨其他平臺,至少我一直在使用的數據塊。

我唯一缺少的是該字段是否可以爲空。

+0

也許這[鏈接]的重複[1]除了平臺無關的部分。 [1]:http://stackoverflow.com/questions/3253943/c-sharp-performance-gain-returning-a-nullable-type-from-a-sqldatareader – RetroCoder

+0

感謝您的鏈接。不幸的是,這有助於我在處理值爲空時的值,但它不告訴我該字段是否可能爲空。不過,這實際上是值得一讀的。 – Hambone

+0

@ChrisHamel我的回答是你在找什麼? – Austinh100

回答

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

+0

感謝您的回覆。無論出於何種原因,我無法讓這個工作。我很好奇,如果只指定一個列名,數據庫/模式和表名是如何識別的。如果有任何變化,這將是完美的解決方案。 – Hambone

+0

@ChrisHamel我已經添加了一個更完整的示例,但您應該查看底部的鏈接以獲取更多信息。 – Austinh100

+0

謝謝 - 我會看看我能否得到這個工作。我沒有看到GetSchema()作爲DataTable類的可用方法(至少不是通過Intellisense)。它的確顯示了與連接的關係,但沒有其他對象。如果我能做到,我會給予反饋。 – Hambone

相關問題