2011-09-26 42 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