2015-01-12 5 views
0

Sybase 설치와 함께 제공된 .net DLL (Sybase.AdoNet4.AseClient.dll 버전)을 사용하여 Sql Server에서 Sybase 16.0 데이터베이스로 데이터를 마이그레이션하려고합니다. 16.0.02).Sybase 대량 복사 : DLL을 통한 복사 : 값이 예상 범위를 벗어남

내가 코드를 사용하고

--source table (MSSQL) 
CREATE TABLE [dbo].[TO_INTS](
    [TO_INT] [int] NULL, 
    [TO_INT2] [int] NULL, 
    [NAME] [varchar](50) NULL, 
    [DT] [datetime] NULL 
) ON [PRIMARY] 

--target table (Sybase) 
CREATE TABLE dbo.TO_INTS 
    (
    FROM_INT INT NOT NULL 
    ) 
    ON 'default' 

에 나는 하나의 INT 열이있는 테이블에서 값을 복사하려고 간단하게 유지하려면 :

public void BulkCopyFromSqlServer(string sourceConnectionString, string targetConnectionString) 
{ 
    SqlConnection sourceConnection = null; 
    AseConnection targetConnection = new AseConnection(targetConnectionString); 
    IDataReader dataSource=null; 
    try 
    { 
     targetConnection.Open(); 
     MssqlCommand.GetDataReader(sourceConnectionString, out sourceConnection, out dataSource); //see below 
     AseBulkCopy blk = new AseBulkCopy(targetConnection); 
     blk.BulkCopyTimeout = 1200; 
     blk.DestinationTableName = "TO_INTS"; 
     blk.ColumnMappings.Clear(); 
     blk.ColumnMappings.Add(new AseBulkCopyColumnMapping(0,0)); 
     blk.WriteToServer(dataSource); // System.ArgumentException thrown here. 
     blk.Close(); 

    } 
    catch (AseException ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
    finally 
    { 
     sourceConnection.Dispose(); 
     targetConnection.Dispose();    
    } 

} 

//MssqlCommand.GetDataReader(sourceConnectionString, out sourceConnection, out dataSource): 
public static void GetDataReader(string sqlServerConnectionString, out SqlConnection conn, out IDataReader reader) 
{ 
    conn = new SqlConnection(sqlServerConnectionString); 
    conn.Open(); 

    SqlCommand cmd = new SqlCommand("select * from TO_INTS", conn); 
    cmd.CommandTimeout = 60; 

    reader = cmd.ExecuteReader(); 
} 

WriteToServer()이 호출되어 ""라는 메시지와 함께 System.ArgumentException이 throw됩니다.". 내가베이스> SQL 서버에 대해 동일한 과정을 따랐다

at Sybase.Data.AseClient.AseBulkCopy.GetDBColName(String clientColName, Int32 clientColInx) 
    at Sybase.Data.AseClient.AseBulkCopy.GenerateInsertCmdByReaderMetaInfo(DataTable rowFmt) 
    at Sybase.Data.AseClient.AseBulkCopy.WriteToServer(IDataReader reader) 

: 그것은 이상한 것 같다 매핑에 제공되는 인덱스를 사용하여 DB columnn 이름을 확인할 수는 Sybase DLL과 같은 점에서 스택 추적은 재미있다 (줄 단위로 꽤 많이 있지만 관련 DLL이 전환되어 있음)이 작동합니다.

나는 분명한 뭔가를 놓치고 있습니까?

답변

0

지금 수정 한 것 같습니다.

내 코드에 2 개의 오류가 있습니다.

EnableBulkLoad 매개 변수를 연결 문자열에 넣는 것에 대해 몰랐기 때문에 초기 오류가 발생했습니다. 내 작업 연결 문자열은 다음과 같습니다

string SybaseConnectionString = "Data Source=server1;Initial Catalog=mydb;persist security info=False;User Id=sa;Password=password1;Port=5000;EnableBulkLoad=2" 

그 두 번째 오류가 발생 된 추가 일단 :

Bad row data received from the client while bulk copying into object 2080007410 partition 2080007410 in database 6. Received a row of length 11 whilst maximum or expected row length is 6. 

이이 발생한 테이블 이름을 사용하여 설정 되었기 때문에 :

blk.DestinationTableName = "TO_INTS"; 

때 다음과 같아야합니다.

blk.DestinationTableName = "dbo.TO_INTS"; 

일단 소유자를 추가하면 BulkCopy가 작동합니다.

ref에서는 이제 작업이 완료되어 다른 이름을 가진 테이블간에 WriteToServer 호출을 완료 할 수있게되었습니다.또한, 열 이름이 각 테이블에 고유 한, 즉, 소스 SQL Server 테이블 :

CREATE TABLE [dbo].[SOURCE_INTS](
    [TO_INT] [int] NULL, 
    [TO_INT2] [int] NULL, 
    [NAME] [varchar](50) NULL, 
    [DT] [datetime] NULL 
) ON [PRIMARY] 

대상 사이베이스 테이블 :

CREATE TABLE dbo.TO_INTS 
    (
    THE_STRING VARCHAR(50) NOT NULL, 
    THE_INT INT NOT NULL, 
    THE_DT DATETIME NOT NULL 
    ) 
    LOCK ALLPAGES 
    ON 'default' 
GO 

또한 순서가 WriteToServer을 제외한 다른 것을 볼과 함께이 잘 처리 매핑 : 당신이 C 번호는 Sybase 데이터 공급자에 대한 추가 정보가 필요하면

blk.ColumnMappings.Add(new AseBulkCopyColumnMapping(2, 0)); //string col 
blk.ColumnMappings.Add(new AseBulkCopyColumnMapping(1, 1)); //int col 
blk.ColumnMappings.Add(new AseBulkCopyColumnMapping(3, 2)); //datetime col 

, Sybase Books Online

012,351,641 시도

희망이 있으면 도움이됩니다.

0

내가 이외의 즉각적인 관찰이없는이 하나

  1. 이이 적은 열과

  2. : MS SQL에서 소스 테이블은 두 가지 방법으로 ASE에서 대상 테이블에서 다른
  3. ASE의 열 이름이 MS SQL의 열 이름과 다릅니다.

여기서 진행되는 내용의 전체 범위와 컨텍스트를 이해하지 않으면 소스 테이블과 목표 테이블간에 불일치가 발생한다고 상상하기가 어렵지 않습니다.

+0

나는 이것이 ColumnMappings에 의해 다루어 졌다고 생각했다. 소스 W 목표 테이블이 동일한 이름과 정확히 같은 컬럼 이름, 유형 W 순서를 가져야합니까? – Badgerspot

+0

소스 테이블과 목표 테이블의 이름과 순서가 완전히 동일 할 필요는 없습니다. – Badgerspot