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이 전환되어 있음)이 작동합니다.
나는 분명한 뭔가를 놓치고 있습니까?
나는 이것이 ColumnMappings에 의해 다루어 졌다고 생각했다. 소스 W 목표 테이블이 동일한 이름과 정확히 같은 컬럼 이름, 유형 W 순서를 가져야합니까? – Badgerspot
소스 테이블과 목표 테이블의 이름과 순서가 완전히 동일 할 필요는 없습니다. – Badgerspot