Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用SqlBulkCopy将CSV文件导入SQL Server_C#_.net_Sql Server_Winforms_Ado.net - Fatal编程技术网

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

C# 使用SqlBulkCopy将CSV文件导入SQL Server,c#,.net,sql-server,winforms,ado.net,C#,.net,Sql Server,Winforms,Ado.net,我有这个函数,它创建一个表,然后接收一个CSV文件。我需要一个ID列在它的自动增量将用于以后使用。因此,我使用ID字段运行了下面的查询。之前它不工作,因为最初CSV文件没有ID列,所以当它被发送到数据库时会出现错误。因此,我的下一个想法是在CSV文件中添加一个没有值的空白ID列,然后再次尝试查询。还是有问题。我的c#代码中的错误是:“从bcp客户端接收到的colid 1的列长度无效。”我猜测的是ID列。是否有一种方法可以同时插入此ID列并自动递增 private void button2_Cli

我有这个函数,它创建一个表,然后接收一个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
);
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);
包含以下值的文件:

Column1,Column2
1,N1
2,N2
3,N3
因此,要在表中批量插入值,可以使用以下方法:

CREATE TABLE [dbo].[Table1] (
    [Column1]   INT           IDENTITY (1, 1) NOT NULL,
    [Column2]   NVARCHAR (50) NOT NULL
);
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);
var lines=System.IO.File.ReadAllLines(@“d:\data.txt”);
如果(lines.Count()==0)返回;
变量列=行[0]。拆分(',');
var table=新数据表();
foreach(列中的var c)
表.栏.添加(c);
对于(int i=1;i
我想您在SQL Server中有一个表,您是这样创建的:

CREATE TABLE [dbo].[Table1] (
    [Column1]   INT           IDENTITY (1, 1) NOT NULL,
    [Column2]   NVARCHAR (50) NOT NULL
);
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);
包含以下值的文件:

Column1,Column2
1,N1
2,N2
3,N3
因此,要在表中批量插入值,可以使用以下方法:

CREATE TABLE [dbo].[Table1] (
    [Column1]   INT           IDENTITY (1, 1) NOT NULL,
    [Column2]   NVARCHAR (50) NOT NULL
);
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);
var lines=System.IO.File.ReadAllLines(@“d:\data.txt”);
如果(lines.Count()==0)返回;
变量列=行[0]。拆分(',');
var table=新数据表();
foreach(列中的var c)
表.栏.添加(c);
对于(int i=1;i
id列应该是自动创建的,您不需要在其中插入任何内容。当您尝试执行第一步时,没有工作的代码究竟是什么?请关注这一步,它应该可以正常工作。同样的,
从bcp客户端接收到一个无效的colid 1列长度。
此链接可能会有所帮助:使用普通插入,您根本不需要将自动标识列添加到
DataTable
中-除非您指示要提供显式值,否则数据库不需要它。不过,我需要它,如果输入了重复项,它将用作唯一标识符,我需要删除它(从我的c#应用程序,也就是说。这个链接没有解决我想要的问题,因为他的问题是SQLBulk Copy选项被设置为保留标识。@JohnDI有点困惑-你是想提供你自己的自动递增数字,还是想让数据库为你生成它们?如果你想让数据库为你生成它们,不要使用mention DataTable中的列-数据库不希望看到它,因为它承担生成自动递增数字的责任。id列应该为您自动创建,并且您不需要在其中插入任何内容。当您尝试执行第一步时,哪些代码不起作用?请关注该步骤d工作正常。同样的,
从bcp客户端接收到一个无效的colid 1列长度。
此链接可能会有所帮助:通过正常插入,您根本不需要将自动标识列添加到
数据表
中-除非您指示要提供显式值,否则数据库不需要它。不过,我需要它,它将用作如果输入了重复项且我需要删除它,则为唯一标识符(从我的c#应用程序,也就是说。这个链接没有解决我想要的问题,因为他的问题是SQLBulk Copy选项被设置为保留标识。@JohnDI有点困惑-你是想提供你自己的自动递增数字,还是想让数据库为你生成它们?如果你想让数据库为你生成它们,不要使用mentio在DATABATE中的列中,数据库不期望看到它,因为它承担生成自动递增编号的责任。正如一个旁注:1)当发布问题时,请考虑张贴A。只比较我的答案和你的问题,看看你如何编写一个其他人可以简单使用的代码。2)代码格式化非常重要,所以总是尝试格式化您的代码并使其尽可能的可读。(我希望这些提示能帮助您更好地使用站点:)非常好的答案。正如边注:1)当发布问题时,请考虑张贴A。将我的答案与你的问题进行比较,看看你如何编写一个其他人可以简单使用的代码。2) 代码格式非常重要,所以请始终尝试对代码进行格式设置,并使其尽可能可读我希望这些提示能帮助你更好地使用网站:)回答得很好。