1

我正在将数据从 CSV 文件转换为数据库。我将 CSV 文件中的数据放入 aDataTable并尝试验证数据。

我要检查的一件事是DataTable(我们称之为PersonID)的某一列中的所有值都可以在我正在转换到的数据库中的表的列中找到(我们称之为PeopleID)。

所以,我想检查表中PersonID是否列出了所有的值PeopleId

我的结果DataTable如下:

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

我查询数据库以获取PeopleId列的值:

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

在 C# 中进行检查的最佳方法是什么?我意识到这是一个有点基本的问题,但我正在考虑这样做的方式是使用两个数组。将每个结果读入一个数组,然后循环遍历数组 1 的每个值以检查它是否在数组 2 中。

我觉得我在重新发明轮子。如果有的话,我真的很想知道一种更好的方法。如果有人可以提供任何建议,我将不胜感激。

4

2 回答 2

1

如果您使用的是 SQL 2008,我建议您将 DataTable 作为参数作为表值参数传递给存储过程或参数化查询,然后使用 Anti Join 或 Not In 或 Not Exists 来确定是否有任何DataTable 中不在 SQL 表中的行。

例如

创建类型

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 回答