Я пытаюсь перенести данные с Sql Server в базу данных Sybase 16.0 с использованием .net DLL, поставляемых с установкой Sybase (версия Sybase.AdoNet4.AseClient.dll 16.0.02).Sybase Bulk Copy через DLL: значение не попадает в ожидаемый диапазон
Для простоты я пытаюсь скопировать значения из таблицы с одного столбца INT
--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'
Я использую код:
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();
}
Исключение System.ArgumentException запускается при вызове WriteToServer()
с сообщением «Value does not fall within the expected range
". Трассировка стека интересен тем, что он выглядит как Sybase DLL не может разрешить columnn имя БД с помощью индекса, представленную в отображении, что кажется странным:
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)
Я следовал один и тот же процесс для Sybase> Sql Server (довольно много строк за строкой, но с соответствующими DLL-переключателями), и это работает.
Я пропустил что-то очевидное?
Я думал, что был покрыт ColumnMappings. Должны ли исходные и целевые таблицы иметь одинаковые имена и одинаковые имена столбцов, типы и порядок? – Badgerspot
Получается, что исходные и целевые таблицы не должны иметь одинаковые имена и точно одинаковые имена и порядок столбцов. – Badgerspot