2013-07-10 57 views
1

以下代碼獲取Excel文件並將其加載到DataTable中。如果文件列中的值與DataTable列的DataType不匹配,則程序將拋出一個System.ArgumentException在填寫DataTable之前驗證數據?

例如,DataTable中的QTY列是Int32,但電子表格中的第5行的值是40O而不是400.如何在數據加載到DataTable之前或之中時檢查數據,並通知用戶哪一行/列有無效值?

//"file" = c:\myfile.xlsx 

string strConn = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + file + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1;TypeGuessRows=0;ImportMixedTypes=Text\"", file); 

using (OleDbConnection dbConnection = new OleDbConnection(strConn)) 
{ 
    using (OleDbDataAdapter dbAdapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", dbConnection)) 
    { 
     dbAdapter.Fill(InputTable); 
    } 
} 

的列有:

ColumnName DataType 
ID   System.String 
QTY   System.Int32 
DOS   System.DateTime 

謝謝!

回答

2

在這種情況下,除非您以DataTable爲基礎,否則您將無法執行此類驗證。此外,在失敗之前,您將能夠獲得該陣列的唯一方法是隱藏類似LoadDataRow的方法。簡而言之,以現在加載數據的方式來捕獲這些信息是不現實的。

有一點要考慮的是這個。而不是利用Fill,得到一個DbDataReader並手動運行每一行。這可以讓你做這樣的事情:

int val; 
if (!int.TryParse(qtyValFromReaderRow, out val)) 
{ 
    // handle the error 
} 
+0

謝謝..我現在正在調查。因此,基本上是通過'DbDataReader'逐行驗證,然後將該行添加到'DataTable'? –

+1

@JeffBrady,這是絕對正確的!你應該可以使用'LoadRow'或'ImportRow'並且傳遞一個簡單的'object []'。 –

+0

明白了..我重寫了我的代碼以使用'DbDataReader',創建'DataRow'並執行'DataTable.Rows.Add(DataRow)'並且它可以工作。現在我只需要爲每個DataRow項目編寫驗證,我應該沒問題。再次感謝! –