使用 SqlBulkCopy 将 CSV 文件导入 SQL 服务器
Import a CSV file to SQL Server using SqlBulkCopy
我有创建 table 然后接收 CSV 文件的功能。我需要一个自动递增的 ID 列,供以后使用。因此,我 运行 下面的查询带有 ID 字段。在它不起作用之前,因为最初 CSV 文件没有 ID 列,所以当它被发送到数据库时会出现错误。所以我的下一个想法是向 CSV 文件添加一个没有值的空白 ID 列,然后再次尝试查询。仍有问题。我的 C# 代码中的错误是:"Received an invalid column length from the bcp client for 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 服务器中有一个 table,你是这样创建的:
CREATE TABLE [dbo].[Table1] (
[Column1] INT IDENTITY (1, 1) NOT NULL,
[Column2] NVARCHAR (50) NOT NULL
);
包含此类值的文件:
Column1,Column2
1,N1
2,N2
3,N3
因此,要向 table 批量插入值,您可以使用 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);
我有创建 table 然后接收 CSV 文件的功能。我需要一个自动递增的 ID 列,供以后使用。因此,我 运行 下面的查询带有 ID 字段。在它不起作用之前,因为最初 CSV 文件没有 ID 列,所以当它被发送到数据库时会出现错误。所以我的下一个想法是向 CSV 文件添加一个没有值的空白 ID 列,然后再次尝试查询。仍有问题。我的 C# 代码中的错误是:"Received an invalid column length from the bcp client for 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 服务器中有一个 table,你是这样创建的:
CREATE TABLE [dbo].[Table1] (
[Column1] INT IDENTITY (1, 1) NOT NULL,
[Column2] NVARCHAR (50) NOT NULL
);
包含此类值的文件:
Column1,Column2
1,N1
2,N2
3,N3
因此,要向 table 批量插入值,您可以使用 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);