2015-04-16 56 views
4

我有一個來自SQL請求的數據表。雖然我真的在使用OLEDB工作,但即使我從我的SQL服務器獲取表格,我也遇到了同樣的問題。C# - 如何判斷DataColumn是否支持空值?

如果我填充數據表,然後查詢DataColumns - 他們都說AllowDBNull == true和allowNull == true。但是如果我看看SSMS中的表格,那就說明了。

string selectStmt= "Select * from foobar; " 
DataSet NewData = new DataSet(); 
using (SqlConnection DataConn = new SqlConnection(MyConnectionString)) 
{ 
    SqlDataAdapter DataAdapter = new SqlDataAdapter(selectStmt, DataConn); 
    var Results = DataAdapter.Fill(NewData, tableName); 
} 
DataColumn Col = NewData.Tables[0].Columns[0]; 
// Col.AllowDBNull is always true as is Col.AllowNull 

我也似乎無法弄清楚在哪裏得到一個字符串字段的長度。

這使得在嘗試上傳數據之前實現一些簡單的客戶端錯誤檢查有點困難。

如果我只是處理基於SQL Server的表,我可以使用Microsoft.SqlServer.Management.Sdk和Microsoft.SqlServer.Management.Smo。由於我不是,那已經結束了。

+0

要說清楚的是,當你說「但是如果我在MS SQL SMS中查看錶格時,它會指出其他情況」,你說列的SQL不允許NULL('NOT NULL')服務器定義? – DWright

+0

是的 - SQL定義清楚地表明,有些是有的,有些則不是 - 但是當查看數據表列時,每列都說明支持空值。 – JustMeToo

回答

2

嘗試

var Results = DataAdapter.FillSchema(NewData, SchemaType.Source, tableName); 

看看,讓你的架構細節,你所需要的水平。

+0

這樣做!結果看起來幾乎與我所得到的一樣,但在這種情況下,MaxLength和allowNull設置正確!可能還有一些其他的。謝謝! – JustMeToo

1

ResultSet不會像那樣知道列模式數據,每次執行命令時都會執行過多的操作,相反,運行時將僅使用它返回的數據即時創建模式信息數據/結果集。對於全面的模式,你必須使用類似EF的代碼或者自己編寫模式。運行時模式的唯一依賴是數據類型(除非數據列是用它們的屬性專門編碼的)。

要正確測試的DBNull你這樣做:

if (dataRow[colNameOrIndex].Value == DbNull.Value){ 
    //null 
} 
+0

1)請參閱前面提供架構的響應,完全按照我需要的方式。 2)你的方法並不告訴我列是否允許空值。它只讓我知道當前值是否爲空。 – JustMeToo

+0

我明白,但是在adhoc調用期間,獲取該模式是一個錯誤,每次調用操作都會太昂貴。如果我把你的問題看作「我如何得到一個表格模式」,我會用相同的答案作出回答,但我讀到了你的問題,因爲我如何在一次通話中使用。 –

相關問題