1

ユーザー入力の確認に少し問題があります。入力が「指定された」データ型であるかどうかを確認したいと思います。あなたが推測したかもしれないように、問題は「与えられた」にあります:-)

Datareaderを介してSQLschematableを取得します。プログラムは任意の外部データベースと連携できる必要があるため、データベースは交換できます。したがって、私はそれについて他に何も知りません。スキーマテーブルには、データベーステーブルのすべての列が一覧表示されます。これには、データベースの列データ型に対応する.Netデータ型がリストされている列「DataType」が含まれています。

ユーザーは、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");
    }
}

tよりもデータ型として認識されず、「is」コマンドが正しく使用されていません。

私はまた、より直接的なアプローチを試みました

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

および多くの同様の行ですが、この「is」コマンドは、「isString」のようにSystem.Typeから直接参照される型でのみ機能するようです。

どうすればこれを解決できますか?

よろしくお願いします、ピーター

4

2 に答える 2

0

これは、実際の行-列が(データベースからの)有効なデータ型を持っているか、すべての列が(一般的なユーザー入力型として)文字列型を含んでいるかに少し依存します

実際には、私はのリストに行きます

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

'string'をキャッチオールとして使用するすべての予想されるデータ型。整数から浮動小数点数などにビットを並べたため、データ型は少し制限されており、完全を期すためにいくつかのMoney型とDate型が追加されています。

確かにこれは汚いリストですが、私が知っている他の方法はありません。

于 2011-09-26T11:16:37.270 に答える
0

このようなものが役立つかもしれません

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

        // Its not a type
    }
于 2011-09-26T11:58:43.820 に答える