0

我有一个包含大约 21 个 lac 条目的文本文件,我想将所有这些条目插入一个表中。最初我在 c# 中创建了一个函数,它逐行读取并插入到表中,但这需要太多时间。请建议一种插入这些批量数据的有效方法,并且该文件包含 TAB(4 个空格)作为分隔符。
该文本文件还包含一些重复的条目,我不想插入这些条目。

4

1 回答 1

4

将所有数据加载到一个DataTable对象中,然后用于SqlBulkCopy批量插入它们:

DataTable dtData = new DataTable("Data");

// load your data here

using (SqlConnection dbConn = new SqlConnection("db conn string"))
{
    dbConn.Open();

    using (SqlTransaction dbTrans = dbConn.BeginTransaction())
    {
        try
        {
            using (SqlBulkCopy dbBulkCopy = new SqlBulkCopy(dbConn, SqlBulkCopyOptions.Default, dbTrans))
            {
                dbBulkCopy.DestinationTableName = "intended SQL table name";
                dbBulkCopy.WriteToServer(dtData );
            }

            dbTrans.Commit();
        }
        catch
        {
            dbTrans.Rollback();
            throw;
        }
    }

    dbConn.Close();
}

我已经包含了将其包装到 a 中的示例,SqlTransaction因此如果在此过程中出现故障,将会完全回滚。为了帮助您入门,这里有一篇很好的 CodeProject 文章,介绍了将分隔数据加载到DataSet对象中。

加载前清理数据

好的,我认为您的数据如下所示:

CC_FIPS    FULL_NAME_ND 
AN         Xixerella
AN         Vila 
AN         Sornas
AN         Soldeu
AN         Sispony
... (cut down for brevity)

在这种情况下,您想创建DataTable这样的:

DataTable dtData = new DataTable("Data");
dtData.Columns.Add("CC_FIPS");
dtData.Columns.Add("FULL_NAME_ND");

然后你想迭代每一行(假设你的制表符分隔的数据由回车逐行分隔)并检查该数据是否已经存在于DataTable使用.Select方法中以及是否存在匹配项(我正在检查两个值,是否要执行其他操作取决于您)然后不要添加它,从而防止重复。

using (FileStream fs = new FileStream("path to your file", FileMode.Open, FileAccess.Read))
{
    int rowIndex = 0;
    using (StreamReader sr = new StreamReader(fs))
    {
        string line = string.Empty;
        while (!sr.EndOfStream)
        {
            line = sr.ReadLine();

            // use a row index to skip the header row as you don't want to insert CC_FIPS and FULL_NAME_ND
            if (rowIndex > 0)
            {
                // split your data up into a 2-d array tab delimited
                string[] parts = line.Split('\t');

                // now check whether this data has already been added to the datatable
                DataRow[] rows = dtData.Select("CC_FIPS = '" + parts[0] + "' and FULL_NAME_ND = '" + parts[1] + "'");
                if (rows.Length == 0)
                {
                    // if there're no rows, then the data doesn't exist so add it
                    DataRow nr = dtData.NewRow();
                    nr["CC_FIPS"] = parts[0];
                    nr["FULL_NAME_ND"] = parts[1];
                    dtData.Rows.Add(nr);
                }
            }

            rowIndex++;
        }
    }
}

在此结束时,您应该有一个DataTable可以批量插入的消毒。请注意,此代码未经测试,但它是您应该如何做的最佳猜测。有很多方法可以做到这一点,并且可能比这种方法(特别是 LINQ)要好得多——但这是一个起点。

于 2013-01-03T09:25:24.423 回答