2016-01-07 2 views
0

Я использую код массовой копии с веб-сайта MSDN, ничего не изменилось. У меня есть таблица с правильными столбцами в БД (SQLServer 2008 R2 Management Studio 10). Но когда я попытался запустить этот код на линии addColumnMetadata сгенерирует исключение:не может вставить более 16 столбцов, используя SQLServerBulkCopy

com.microsoft.sqlserver.jdbc.SQLServerException: Колонка 17 недействительна. Пожалуйста, проверьте соответствия столбцов. на com.microsoft.sqlserver.jdbc.SQLServerBulkCopy.validateColumnMappings (SQLServerBulkCopy.java:1747) на com.microsoft.sqlserver.jdbc.SQLServerBulkCopy.writeToServer (SQLServerBulkCopy.java:1514) на com.microsoft.sqlserver. jdbc.SQLServerBulkCopy.writeToServer (SQLServerBulkCopy.java:628)

Я не могу найти ошибку. Кто-нибудь может мне помочь, пожалуйста! Ниже приведена часть кода, скопированного из MSDN. Для цикла цикла и файла - это единственные вещи, которые я изменил.

public static void main(String[] args) 
{ 
    String connectionString = GetConnectionString(); 
    SQLServerBulkCSVFileRecord fileRecord = null; 
    try 
    {    
     // Get data from the source file by loading it into a class that implements ISQLServerBulkRecord. 
     // Here we are using the SQLServerBulkCSVFileRecord implementation to import the example CSV file. 
     fileRecord = new SQLServerBulkCSVFileRecord("F:/test/test1.csv", true);  

     // Set the metadata for each column to be copied. 
     for(int i = 0;i < 17;i++) 
     { 
      fileRecord.addColumnMetadata(i+1, null, java.sql.Types.VARCHAR, 10, 0); 
     } 

     // Open a destinationConnectio to the AdventureWorks database. 
     Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
     try (Connection destinationConnection = DriverManager.getConnection(connectionString)) 
     { 
      try (Statement stmt = destinationConnection.createStatement()) 
      { 
       // Perform an initial count on the destination table. 
       long countStart = 0; 
       try (ResultSet rsRowCount = stmt.executeQuery(
         "SELECT COUNT(*) FROM dbo.BulkCopyDemoDifferentColumns1;")) 
       { 
        rsRowCount.next(); 
        countStart = rsRowCount.getInt(1); 
        System.out.println("Starting row count = " + countStart); 
       } 

       // Set up the bulk copy object. 
       // Note that the column positions in the source 
       // data reader match the column positions in 
       // the destination table so there is no need to 
       // map columns. 
       try (SQLServerBulkCopy bulkCopy = 
          new SQLServerBulkCopy(destinationConnection)) 
       { 
        bulkCopy.setDestinationTableName("dbo.BulkCopyDemoDifferentColumns1"); 

        try 
        { 
         // Write from the source to the destination. 
         bulkCopy.writeToServer(fileRecord); 
        } 
        catch (Exception e) 
        { 
         // Handle any errors that may have occurred. 
         e.printStackTrace(); 
        } 
       } 

       // Perform a final count on the destination 
       // table to see how many rows were added. 
       try (ResultSet rsRowCount = stmt.executeQuery(
         "SELECT COUNT(*) FROM dbo.BulkCopyDemoDifferentColumns1;")) 
       { 
        rsRowCount.next(); 
        long countEnd = rsRowCount.getInt(1); 
        System.out.println("Ending row count = " + countEnd); 
        System.out.println((countEnd - countStart) + " rows were added."); 
       } 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     // Handle any errors that may have occurred. 
     e.printStackTrace(); 
    } 
    finally 
    { 
     if (fileRecord != null) try { fileRecord.close(); } catch(Exception e) {} 
    } 
} 

Все работает хорошо с менее чем 17 колоннами. Полный код находится на msdn

Вот структура таблицы: создать таблицу BulkCopyDemoDifferentColumns1
(
name1 VARCHAR (10),
name2 VARCHAR (10),
name3 VARCHAR (10),
Name4 VARCHAR (10),
name5 VARCHAR (10),
name6 VARCHAR (10),
name7 VARCHAR (10),
name8 VARCHAR (10),
name9 VARCHAR (10),
name10 VARCHAR (10),
name11 VARCHAR (10),
name12 VARCHAR (10),
name13 VARCHAR (10),
name14 VARCHAR (10),
name15 VARCHAR (10),
name16 VARCHAR (10),
name17 VARCHAR (10)
)

+0

Все работает хорошо с менее чем 17 колоннами. Полный код находится на https://msdn.microsoft.com/en-us/library/mt221490(v=sql.110).aspx – Vincent

+0

Какие данные содержатся в вашей 17-й колонке? Похоже, что это может быть больше, чем вы позволяете. –

+0

Все 17 столбцов - VARCHAR (10), а 17-е значение - «17». Эта ошибка не имеет никакого смысла, потому что она отлично работает для первых 16 столбцов, а 17-й столбец - это почти копия первых 16 столбцов. – Vincent

ответ

0

Вы упомянули о том, что файл CSV имеет 2 строки, первый из которых заголовок.
Объект SQLServerBulkCopy требует, чтобы строка заканчивалась \r\n, а не только \n. Убедитесь, что это соответствует вашему CSV.

+0

Спасибо за предложение. Но после того, как я убеждаюсь, что все две строки завершены с помощью \ r \ n. Фактически, я не могу понять, что он отлично работает для 16 столбцов, но для 17-го столбца он не работает. – Vincent

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