0

次のasp.netコードは、CSV ファイルからデータをフェッチし、それを SQL Server 2005 テーブルに挿入します。

ただし、テーブル名、データがフェッチされるフィールド名、およびマッピング情報 (「CSV の列名」と「テーブルの列名」の間のマッピング) をコードで静的に指定する必要があります。

以下のコードを変更して、どのテーブル名でも機能するようにするにはどうすればよいですか。
つまり、テーブル名とマッピングは動的に処理する必要があります。

public class CsvBulkCopyDataIntoSqlServer
{

    protected const string _truncateLiveTableCommandText = @"TRUNCATE TABLE Account";
    protected const int _batchSize = 100000;

    static void Main(string[] args)
    {
        LoadCsvDataIntoSqlServer();

    }

    public static void LoadCsvDataIntoSqlServer()
    {
        // This should be the full path
        var fileName = @"D:\output.csv";
        var createdCount = 0;

        using (var textFieldParser = new TextFieldParser(fileName))
        {
            textFieldParser.TextFieldType = FieldType.Delimited;
            textFieldParser.Delimiters = new[] { "," };
            textFieldParser.HasFieldsEnclosedInQuotes = true;

            // var connectionString = ConfigurationManager.ConnectionStrings["CMSConnectionString"].ConnectionString;
            string connectionString = "Data Source= 172.25.10.4" + ";Initial Catalog= SFdata" + ";Persist Security Info=True;User ID= sa" + ";Password= Newuser@123";


            var dataTable = new DataTable("Account");


            // Add the columns in the temp table
            dataTable.Columns.Add("Name");
            dataTable.Columns.Add("shippingstreet");
            dataTable.Columns.Add("shippingpostalcode");
            dataTable.Columns.Add("ShippingCountry");
            dataTable.Columns.Add("shippingstate");

            //dataTable.Columns.Add("LastName");

            using (var sqlConnection = new SqlConnection(connectionString))
            {
                sqlConnection.Open();

                // Truncate the live table
                using (var sqlCommand = new SqlCommand(_truncateLiveTableCommandText, sqlConnection))
                {
                    sqlCommand.ExecuteNonQuery();
                }

                // Create the bulk copy object
                var sqlBulkCopy = new SqlBulkCopy(sqlConnection)
                {
                    DestinationTableName = "Account"
                };

                // Setup the column mappings, anything ommitted is skipped
                sqlBulkCopy.ColumnMappings.Add("Name", "Name");
                sqlBulkCopy.ColumnMappings.Add("shippingstreet", "shippingstreet");
                sqlBulkCopy.ColumnMappings.Add("shippingpostalcode", "shippingpostalcode");
                sqlBulkCopy.ColumnMappings.Add("ShippingCountry", "ShippingCountry");
                sqlBulkCopy.ColumnMappings.Add("shippingstate", "shippingstate");

                // Loop through the CSV and load each set of 100,000 records into a DataTable
                // Then send it to the LiveTable
                while (!textFieldParser.EndOfData)
                {
                    dataTable.Rows.Add(textFieldParser.ReadFields());

                    createdCount++;

                    if (createdCount % _batchSize == 0)
                    {
                        InsertDataTable(sqlBulkCopy, sqlConnection, dataTable);

                        break;
                    }
                }

                InsertDataTable(sqlBulkCopy, sqlConnection, dataTable);

                sqlConnection.Close();
            }
        }
    }

    protected static void InsertDataTable(SqlBulkCopy sqlBulkCopy, SqlConnection sqlConnection, DataTable dataTable)
    {
        sqlBulkCopy.WriteToServer(dataTable);

        dataTable.Rows.Clear();
    }

}
4

1 に答える 1

0

SQL Server Integration Services を使用してみませんか?

于 2013-10-15T12:41:11.490 に答える