Проверьте, соответствует ли тип данных из схемы и пользовательских данных - PullRequest
1 голос
/ 26 сентября 2011

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

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

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

Теперь я хочу проверить, соответствует ли данный пользовательский ввод типу данных .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");
    }
}

, чем t не распознается как тип данных, и команда "is" не используется должным образом.

Я также попробовал более прямой подход с

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

и много похожих строк, но кажется, что эта команда "is" работает только с типами, на которые непосредственно ссылается форма System.Type, как в "is String".

Как можно решить эту проблему?

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

Ответы [ 2 ]

0 голосов
/ 26 сентября 2011

Как-то так может быть полезно

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

        // Its not a type
    }
0 голосов
/ 26 сентября 2011

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

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

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

Для всех ожидаемых типов данных с 'string' в качестве catch all. Немного приказал от Integer плавать и т. Д., Чтобы типы данных были немного ограничены с некоторыми типами Money и Date, добавленными для полноты.

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

...