0

ユーザーがさまざまなデータ ソースを予測不可能な列スキーマにマップするオプションを持つプログラムがあります。そのため、10 個のフィールドを持つ SQL Server データベースまたは 20 個の Excel ファイルを持つ可能性があります。名前は何でもかまいませんし、フィールドのデータ型はテキストと数値、日付などの混合にすることができます。

次に、ユーザーは各フィールドの意味のマッピングを提供する必要があります。したがって、列 4 は「LocName」、列 2 は「LocX」、列 1 は「LocDate」などです。マップ先のオプションとしてユーザーに提示される名前とデータ型は、DataSet DataTable ( XSD xchema ファイル)。

たとえば、ソースに次のような形式のデータが含まれている場合:

User Column 1: "LocationDate" of type string
User Column 2: "XCoord" of type string
User Column 3: "YCoord" of type string
User Column 4: "LocationName" of type int

ユーザーは、アプリケーションが必要とする DataTableに対してこれに変換する必要があるマッピングを提供します。

Application Column "LocName" of type string   = Column **4** of user table
Application Column "LocX" of type double      = Column **2** of user table
Application Column "LocY" of type double      = Column **3** of user table
Application Column "LocDate" of type datetime = Column **1** of user table

ソースに接続し、ユーザー クエリのデータを「生の」形式で DataTable として引き出すルーチンがあるため、ソースのスキーマを使用します。

私の質問は、データを生の DataTable から必要なアプリケーションの DataTable に「変換」する最良の方法は何ですか?

foreach は明らかに機能しますが、各行のすべてのループでデータ型を考慮する必要があるため、力ずくのように思えます。LINQまたはADO.NETでそれを行う「巧妙な」方法はありますか?

4

1 に答える 1

0

私は通常、宛先テーブルに「似ている」ものを選択しますが、ソーステーブルからのデータを使用します。必要に応じて、データ変換も適用します。

Select
  Cast (LocationNameLocationName As varChar(...) As LocName
, LocX  As XCoord
, ...
From SourceTable

簡単な答えで説明するのは難しいです。私が過去に行ったことは、「Select * From sourcetable Where 1=0」のような「空の」クエリを発行することで、行は返されませんが、すべての列とそのタイプが結果セットで利用可能になります。列 ADO オブジェクトを循環して、それぞれの型を取得できます。次に、その情報を使用して、変換を使用して実際の SQL ステートメントを動的に構築できます。

変換を決定するためのロジックはまだたくさんありますが、それらはすべて、テーブルが読み取られているときではなく、ステートメントを作成しているときに発生します。コードで「ソース列が整数で、宛先列が文字の場合、選択に生成したい '、キャスト(Varcharとして)'」と言う必要があります

選択のテキストの作成が完了すると、ADO で実行して行を取得できる選択が作成され、実際の移動は、必要に応じてフィールドを読み書きできるようになります。その選択を「選択への挿入...」に使用することもできます。

これが理にかなっていることを願っています。概念は、説明するより実行する方が簡単です。

于 2013-07-24T14:24:41.860 に答える