【问题标题】:Check if Datatype from schematable and user data match检查模式表中的数据类型和用户数据是否匹配
【发布时间】:2011-09-26 11:00:20
【问题描述】:

我在检查用户输入时遇到了一点问题。我想检查输入是否属于“给定”数据类型。正如您可能已经猜到的那样,问题出在“给定”中:-)

我通过 Datareader 获得了一个 SQLschematable。数据库可以交换,因为程序应该能够与任何外国数据库一起工作。因此,我对此一无所知。架构表列出了数据库表中的所有列。它包含一列“DataType”,其中列出了与数据库列数据类型对应的 .Net 数据类型。

用户可以为 datagridview 中的每一列指定一个数据输入。也就是说:给用户一个模式表和一个可编辑的额外列。

现在我想检查给定的用户输入是否与 .Net 数据类型匹配。通常我会使用类似的东西来检查这个

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");
    }
}

than t 未被识别为数据类型且“is”命令未正确使用。

我也尝试了更直接的方法

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

还有许多类似的行,但似乎这个“is”命令只适用于直接从 System.Type 引用的类型,例如“is String”。

如何解决这个问题?

提前致谢, 彼得

【问题讨论】:

    标签: c# types user-input getschematable


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      在实践中,我会选择一个列表

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

      对于所有预期的数据类型,“字符串”作为包罗万象。从 Integer 到 float 等排序,因此数据类型受到一些限制,为完整性添加了一些 Money 和 Date 类型。

      当然,这是一个脏列表,但我不知道有任何其他方式。

      【讨论】:

      • MyDataTable 列“DataType”属于 System.Type,因此它应该只包含有效的 .Net 类型。所以按照你的想法,我可以使用这样的东西吗? if (row["DataType"].toString() == "String"){ try {Convert.ToString(Input);}catch...?
      • 这在很大程度上取决于用户在内容是双精度数/数字时是否提供“字符串”或“对象”。或者,如果它始终是作为正确类型键入的有效 .net 数据类型。
      猜你喜欢
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-14
      • 2018-01-16
      • 1970-01-01
      相关资源
      最近更新 更多