2016-11-17 3 views
1

У меня есть эта функция, которая создает таблицу, а затем получает файл CSV. Мне нужен столбец идентификатора, который автоматически увеличивается, что будет использоваться для последующего использования. Поэтому я выполнил указанный ниже запрос с полем ID. Прежде чем он не работал, потому что изначально в файле CSV не было столбца идентификатора, поэтому, когда пришло время его отправки в базу данных, произошла ошибка. Поэтому моя следующая идея заключалась в том, чтобы добавить пустой столбец идентификатора без значений в файл CSV, а затем снова выполнить запрос. Все еще проблема. Ошибка в моем коде C#: «Получена недопустимая длина столбца от клиента bcp для colid 1.» Который догадывается, это столбец идентификатора. Есть ли способ, чтобы этот столбец идентификатора вставлен и автоматически увеличивался в одно и то же время?Импорт CSV-файла в SQL Server с использованием SqlBulkCopy

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(); 

    } 
+1

Кол-во столбцов sh ould будет автоматически создан для вас, и вы не будете вставлять что-либо в него. Какой именно код не работал, когда вы пытаетесь сделать первый шаг - сосредоточьтесь на этом - это должно работать нормально. – Hogan

+0

То же самое 'Получено недопустимое значение длины столбца из bcp-клиента для colid 1.' – Jevon

+0

Эта ссылка может помочь: http://stackoverflow.com/questions/6651809/sqlbulkcopy-insert-with-identity-column С нормальной вставкой, вы не добавляете столбец автоматической идентификации в «DataTable» вообще - база данных не нуждается в нем, если вы не укажете, что хотите указать явные значения. –

ответ

4

Я полагаю, у вас есть таблица в 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 

так объемных значений для вставки в таблицу, могут использовать такой код:

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); 
+0

Как примечание стороны: ** 1) ** При отправке вопроса, пожалуйста, рассмотрите возможность публикации [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). Просто сравните мой ответ с вашим вопросом, чтобы узнать, как вы можете написать код, который может использовать просто другой. ** 2) ** Форматирование кода действительно важно, поэтому всегда старайтесь форматировать свой код и сделать его максимально читаемым. ** • ** Я надеюсь, что эти советы помогут вам лучше использовать сайт :) –

+1

очень хороший ответ. – Hogan

+0

@Hogan Спасибо за отзыв :) –

Смежные вопросы