Проверьте, совпадают ли тип данных из схемы и пользовательских данных.

У меня небольшая проблема с проверкой пользовательского ввода. Я хочу проверить, относится ли ввод к «заданному» типу данных. Проблема в "данности", как вы могли догадаться :-)

Я получаю SQLschematable через Datareader. База данных может быть заменена, так как программа должна уметь работать с любой сторонней базой данных. Поэтому я больше ничего об этом не знаю. В схеме перечислены все столбцы из таблицы базы данных. Он содержит столбец «Тип данных», в котором перечислены типы данных .Net, соответствующие типам данных столбцов баз данных.

Пользователь может указать ввод данных для каждого столбца в datagridview. То есть: пользователю предоставляется схематический и редактируемый дополнительный столбец.

Теперь я хочу проверить, соответствует ли данный пользовательский ввод типу данных .Net. Обычно я бы проверил это, используя что-то вроде

Input is String

or

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".

Как это можно решить?

заранее спасибо, Питер


person gw0    schedule 26.09.2011    source источник


Ответы (2)


Что-то вроде этого может быть полезно

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

        // Its not a type
    }
person Apr    schedule 26.09.2011

Это немного зависит от того, имеют ли фактические столбцы строк допустимый тип данных (из базы данных) или все столбцы содержат строковые типы (как общий тип ввода пользователя)

На практике я бы пошел на список

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

Для всех ожидаемых типов данных с «строкой» в качестве универсального. Заказал бит из Integer для float и т. д., поэтому типы данных немного ограничены, добавлены некоторые типы Money и Date для полноты.

Конечно, это грязный список, но другого способа я не знаю.

person CodingBarfield    schedule 26.09.2011
comment
Столбец MyDataTable DataType имеет тип System.Type, поэтому он должен содержать только допустимые типы .Net. Итак, следуя вашей идее, я мог бы использовать что-то вроде этого? if (row["DataType"].toString() == "String"){ try {Convert.ToString(Input);}catch... ? - person gw0; 26.09.2011
comment
Это во многом зависит от того, может ли пользователь предоставить строку или объект, в то время как содержимое является двойным/числом. Или если это всегда допустимый тип данных .net, введенный как правильный тип. - person CodingBarfield; 26.09.2011