2011-09-26 39 views
1

我在檢查用戶輸入時遇到了一些問題。我想檢查輸入是否是「給定」數據類型。問題出在「給定」,你可能已經猜到了:-)檢查模式表和用戶數據的數據類型是否匹配

我通過Datareader獲得SQLschematable。該數據庫可以交換,因爲該程序應該能夠與任何外國數據庫一起工作。所以我不知道任何其他事情。模式表列出數據庫表中的所有列。它包含一個「DataType」列,其中列出了與數據庫列數據類型對應的.Net數據類型。

用戶可以爲datagridview中的每個列指定一個數據輸入。即:給用戶模式表和可編輯的額外列。

現在我想檢查給定的用戶輸入是否與.Net數據類型匹配。 Normaly我會使用類似

Input is String 

String test = Input as String; 
if (test = null) .... 

檢查這一點,但問題是在創建數據類型(即字符串)

,如果我做這樣的事情:

foreach (DataRow row in MyDataTable.Rows){ 
    System.Type t = (System.Type) row["DataType"]; 
    if (! (((Object) row["Input"]) is t)){ 
     MessageBox.Show("Error"); 
    } 
} 

比t不被識別爲數據類型並且「is」命令使用不當。

我也試圖與

foreach (DataRow row in MyDataTable.Rows){ 
    if (! (row[Input] is ((System.Type) row["DataType"]))) ... 

和許多類似的行更直接的形式給出,但似乎這個「是」命令只適用於那些直接引用的形式System.Type的,就像類型「爲String 」。

怎麼能解決這個問題?

在此先感謝, 彼得

回答

0

像這樣的東西可能會有所幫助

try 
    { 
     object o = Convert.ChangeType(row["Input"], Type.GetType(row["DataType"])); 
    } 
    catch (Exception ex) 
    { 

     // Its not a type 
    } 
+0

這個伎倆,謝謝。 – ThatBigGuy

0

這取決於有點實際行柱是否有一個有效的數據類型(從數據庫)或全部列包含字符串類型(如通用用戶輸入型)

在實踐中我會去的

Try 
    Convert.ToX 
Catch 
'oops not type X 
End try 

對於「字符串」作爲一個包羅萬象的所有預期的數據類型的列表。從整數有點浮點數等,所以數據類型有點限制,爲了完整性添加了一些Money和Date類型。

確定這是一個骯髒的列表,但沒有任何其他方式,我知道。

+0

的MyDataTable列「數據類型」是System.Type的,所以它應該只包含有效的.NET類型。所以通過遵循你的想法,我可以使用這樣的東西? if(row [「DataType」]。toString()==「String」){try {Convert.ToString(Input);} catch ...'? – ThatBigGuy

+0

這很大程度上取決於用戶是否可以在內容爲雙打/數字時提供「字符串」或「對象」。或者,如果它總是一個有效的.net數據類型鍵入正確的類型。 – CodingBarfield