1

CSVファイルからデータベースにデータを変換しています。CSVファイルのデータをに入れて、データDataTableを検証しようとしています。

私がチェックしたいことの1つは、(それを呼びましょう)の特定の列のすべての値が、DataTable変換PersonID先のデータベース(それを呼びましょう)のテーブルの列にあることですPeopleID

PersonIDそこで、のすべての値が表にリストされているかどうかを確認したいと思いPeopleIdます。

私は次のような結果を持ってDataTableいます:

var listOfPersonIdsInData = arguments.DataTable.Select("PersonId");

そして、データベースにクエリを実行して、PeopleId列の値を取得します。

var listOfPeopleIdsInDatabase = checkQuery.Execute<DataColumn>(@"SELECT DISTINCT PeopleId FROM People");`

C#でこれをチェックするための最良の方法は何でしょうか?やや基本的な質問だと思いますが、私が考えているのは2つの配列を使用することです。それぞれの結果を配列に読み込み、配列1の各値を循環して、配列2にあるかどうかを確認します。

車輪の再発明をしているような気がします。もしあればもっと良い方法を知りたいです。誰かアドバイスをいただければ幸いです。

4

2 に答える 2

1

SQL 2008 を使用している場合は、DataTable をパラメーターとしてテーブル値パラメーターとしてストアド プロシージャまたはパラメーター化されたクエリに渡し、Anti Join または Not In または Not Exists を使用して、存在するかどうかを判断することをお勧めします。 SQL テーブルにない DataTable の行。

例えば

タイプを作成する

CREATE TYPE dbo.PersonTable AS TABLE
    ( PersonId int )

次に、プロシージャ

CREATE PROCEDURE usp_ValidateDataTable 
(@CheckTable dbo.PersonTable READONLY) as 

 BEGIN

     SELECT c.PersonID 
      FROM  
           @CheckTable  c
      WHERE
             c.Person NOT IN (SELECT PersonID from dbo.People)

 END

C# コード SP 呼び出し

  SqlCommand cmd= new SqlCommand("usp_ValidateDataTable" , cnn);
  SqlParameter tvpParam = cmd.Parameters.AddWithValue("@CheckTable", listOfPersonIdsInData );
  tvpParam.SqlDbType = SqlDbType.Structured;
  tvpParam.TypeName = "dbo.PersonTable";
  SqlDataReader rdr = cmd.ExcuteReader();

C# コードのパラメーター化されたクエリ呼び出し

 string query = @" SELECT c.PersonID 
                   FROM  @CheckTable  c
                   WHERE c.Person NOT IN (SELECT PersonID from dbo.People)";

  SqlCommand cmd= new SqlCommand(query  , cnn);
  SqlParameter tvpParam = cmd.Parameters.AddWithValue("@CheckTable", listOfPersonIdsInData );
  tvpParam.SqlDbType = SqlDbType.Structured;
  tvpParam.TypeName = "dbo.PersonTable";
  SqlDataReader rdr = cmd.ExcuteReader();
于 2012-10-10T05:32:28.263 に答える
0

多くの情報を移行する必要がありましたが、これまでのところ、次のものが最適だと思います。

  1. CSV からの情報を使用してフラット テーブルを作成し、そこにすべてのデータをロードします。
  2. 同じ SQL メソッドで作成して標準化された情報を抽出する
  3. 生データと正規化された情報を交差する同じ SQL でメソッドを構築する

特にレコード数が非常に多い (1M を超える) 場合は非常に高速で、さらに RAM 管理スクリプト/プログラムを最適化する問題を回避できます。また、CSVをMySQLデータにロードするのは本当に簡単ですこれを確認してください

ヒント: オフセットと制限値を使用してインポートおよび検証するためのパラメータ化されたメソッド

于 2012-10-10T05:33:49.647 に答える