c# - 使用 SqlBulkCopy 将 CSV 文件导入 SQL Server

标签 c# .net sql-server winforms ado.net

我有这个功能可以创建一个表,然后接收一个 CSV 文件。我需要一个自动递增的 ID 列,供以后使用。因此,我使用 ID 字段运行了以下查询。在它不起作用之前,因为最初 CSV 文件没有 ID 列,所以当它被发送到数据库时会出现错误。所以我的下一个想法是向 CSV 文件添加一个没有值的空白 ID 列,然后再次尝试查询。仍有问题。我的 C# 代码中的错误是:“从 bcp 客户端接收到 colid 1 的无效列长度。”我猜是 ID 列。有没有办法同时插入此 ID 列并自动递增?

private void button2_Click(object sender, EventArgs e)
    {
        string connectionString = "Data Source=LPMSW09000012JD\\SQLEXPRESS;Initial Catalog=Pharmacies;Integrated Security=True";
        string query = "CREATE TABLE [dbo].[" + textBox1.Text + "](" +"ID int IDENTITY (1,1) PRIMARY KEY," + "[Code] [varchar] (13) NOT NULL," +
       "[Description] [varchar] (50) NOT NULL," + "[NDC] [varchar] (50) NULL," +
        "[Supplier Code] [varchar] (38) NULL," + "[UOM] [varchar] (8) NULL," + "[Size] [varchar] (8) NULL,)";


        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            SqlCommand command = new SqlCommand(query, connection);
            command.Connection.Open();
            command.ExecuteNonQuery();
        }

        SqlConnection con = new SqlConnection("Data Source=LPMSW09000012JD\\SQLEXPRESS;Initial Catalog=Pharmacies;Integrated Security=True");
        string filepath = textBox2.Text; //"C:\\Users\\jdavis\\Desktop\\CRF_105402_New Port Maria Rx.csv";
        StreamReader sr = new StreamReader(filepath);
        string line = sr.ReadLine();
        string[] value = line.Split(',');
        DataTable dt = new DataTable();
        DataRow row;
        foreach (string dc in value)
        {
            dt.Columns.Add(new DataColumn(dc));
        }

        while (!sr.EndOfStream)
        {
            value = sr.ReadLine().Split(',');
            if (value.Length == dt.Columns.Count)
            {
                row = dt.NewRow();
                row.ItemArray = value;
                dt.Rows.Add(row);
            }
        }
        SqlBulkCopy bc = new SqlBulkCopy(con.ConnectionString, SqlBulkCopyOptions.TableLock);
        bc.DestinationTableName = textBox1.Text;
        bc.BatchSize = dt.Rows.Count;
        con.Open();
        bc.WriteToServer(dt);
        bc.Close();
        con.Close();

    }

最佳答案

我想你在 SQL Server 中有一个你用这种方式创建的表:

CREATE TABLE [dbo].[Table1] (
    [Column1]   INT           IDENTITY (1, 1) NOT NULL,
    [Column2]   NVARCHAR (50) NOT NULL
);

包含此类值的文件:

Column1,Column2
1,N1
2,N2
3,N3

所以要向表中批量插入值,您可以使用 SqlBulkCopy这样:

var lines = System.IO.File.ReadAllLines(@"d:\data.txt");
if (lines.Count() == 0) return;
var columns = lines[0].Split(',');
var table = new DataTable();
foreach (var c in columns)
    table.Columns.Add(c);

for (int i = 1; i < lines.Count() - 1; i++)
    table.Rows.Add(lines[i].Split(','));

var connection = @"your connection string";
var sqlBulk = new SqlBulkCopy(connection);
sqlBulk.DestinationTableName = "Table1";
sqlBulk.WriteToServer(table);

关于c# - 使用 SqlBulkCopy 将 CSV 文件导入 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40664203/

相关文章:

c# - 数据库删除后 SQL Server 2008 关闭连接

c# - 多列的sql合并语句

c# - 使用动态参数从 C# 调用 javascript 方法

c# - Visual Studio C# 到 MS Access 连接失败

c# - IIS WCF 服务托管与 Windows 服务

c# - 按属性值查找类属性

c# - Linq:按年月分组,管理空月

c# - 重复执行一段代码而没有超时。窗口服务

.net - WCF:不支持没有参数的操作

sql - 为什么 IF(查询)需要一个多小时,而查询只需要不到一秒?