检查架构表和用户数据中的数据类型是否匹配

时间:2011-09-26 11:00:20

标签: c# types user-input getschematable

我在检查用户输入方面遇到了一些问题。我想检查输入是否为“给定”数据类型。问题在于您可能已经猜到的“给定”: - )

我通过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"] ))) ...

和许多类似的行,但似乎这个“is”命令只适用于直接从System.Type引用的类型,就像在“is String”中一样。

怎么能解决这个问题?

提前谢谢, 彼得

2 个答案:

答案 0 :(得分:0)

这取决于实际的行列是否具有有效的数据类型(来自数据库)或所有列是否包含字符串类型(作为通用用户输入类型)

在实践中,我会找一个

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

对于所有预期的数据类型,将'string'作为catch all。从Integer到float等有序,所以数据类型有点受限制,添加了一些Money和Date类型以保证完整性。

当然这是一个肮脏的清单,但我没有其他任何方式。

答案 1 :(得分:0)

这样的事情可能会有所帮助

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

        // Its not a type
    }