Home > Code Samples > Bulk Insert CSV File into SQL Server in C#

Bulk Insert CSV File into SQL Server in C#



C#
using (SqlConnection conn = new SqlConnection(@"Data Source=.\sql2014;Initial Catalog=Test;Integrated Security=True"))
{
    conn.Open();

    #region create table

    using (SqlCommand createTable = new SqlCommand(@"
        IF NOT EXISTS
        (
            SELECT *
            FROM
                sys.schemas s
                    INNER JOIN sys.tables t ON
                        t.[schema_id] = s.[schema_id]
            WHERE
                s.name = 'dbo' AND
                t.name = 'Products'
        )
        BEGIN
            CREATE TABLE dbo.Products
            (
                ProductID int NOT NULL,
                ProductName nvarchar(40) NOT NULL,
                SupplierID int NULL,
                CategoryID int NULL,
                QuantityPerUnit nvarchar(20) NULL,
                UnitPrice money NULL CONSTRAINT DF_Products_UnitPrice DEFAULT (0),
                UnitsInStock smallint NULL CONSTRAINT DF_Products_UnitsInStock DEFAULT (0),
                UnitsOnOrder smallint NULL CONSTRAINT DF_Products_UnitsOnOrder DEFAULT (0),
                ReorderLevel smallint NULL CONSTRAINT DF_Products_ReorderLevel DEFAULT (0),
                Discontinued bit NOT NULL CONSTRAINT DF_Products_Discontinued DEFAULT (0),
                Reorder bit NOT NULL
            );
        END", conn))
    {
        createTable.ExecuteNonQuery();
    }

    #endregion

    using (CsvDataReader reader = new CsvDataReader("../../products.csv"))
    using (SqlBulkCopy bcp = new SqlBulkCopy(conn))
    {
        reader.Settings.HasHeaders = true;

        reader.Columns.Add("int", "ProductID");
        reader.Columns.Add("nvarchar", "ProductName");
        reader.Columns.Add("int", "SupplierID");
        reader.Columns.Add("int", "CategoryID");
        reader.Columns.Add("nvarchar", "QuantityPerUnit");
        reader.Columns.Add("money", "UnitPrice");
        reader.Columns.Add("smallint", "UnitsInStock");
        reader.Columns.Add("smallint", "UnitsOnOrder");
        reader.Columns.Add("smallint", "ReorderLevel");
        reader.Columns.Add("bit", "Discontinued");
        reader.Columns.Add("bit", "Reorder");

        reader.ReadRecord += delegate(DataReaderBase.ReadRecordEventArgs e)
            {
                bool discontinued = bool.Parse(e.Values["Discontinued"]);
                int unitsInStock = int.Parse(e.Values["UnitsInStock"]);
                int unitsOnOrder = int.Parse(e.Values["UnitsOnOrder"]);
                int reorderLevel = int.Parse(e.Values["ReorderLevel"]);

                bool needToReorder = false;

                if (
                    !discontinued &&
                    reorderLevel > 0 &&
                    unitsInStock + unitsOnOrder < reorderLevel
                )
                {
                    needToReorder = true;
                }

                e.Values["Reorder"] = needToReorder.ToString();
            };

        bcp.DestinationTableName = "dbo.Products";
        bcp.EnableStreaming = true;

        bcp.NotifyAfter = 10;
        bcp.SqlRowsCopied += delegate (object sender, SqlRowsCopiedEventArgs e)
            {
                Console.WriteLine(e.RowsCopied.ToString("#,##0") + " rows copied.");
            };
                    
        using (ValidatingDataReader validator = new ValidatingDataReader(reader, conn, bcp))
        {
            bcp.WriteToServer(validator);
        }
    }
}