0

我正在尝试使用 .将数据从 Oracle 复制到 SQL Server bulkcopy。问题是 Oracle 的布尔数据存储为varchar2(1)tf而 SQL Server 布尔数据类型是bit和存储为10。因此我收到以下错误。

来自数据源的 String 类型的给定值无法转换为指定目标列的类型位。
System.InvalidOperationException:来自数据源的 String 类型的给定值无法转换为指定目标列的类型位。
System.FormatException:无法将参数值从字符串转换为布尔值。
System.FormatException:字符串未被识别为有效的布尔值。

有没有办法解决这个问题?

using (OracleConnection srcConn = new OracleConnection())
using (SqlConnection destConn = new SqlConnection())
{
    srcConn.ConnectionString = AppInfo.SrcConnStr;
    srcConn.Open();
    destConn.ConnectionString = AppInfo.DestConnStr;
    destConn.Open();
    using (SqlCommand destCmd = new SqlCommand("SET DATEFORMAT mdy;", destConn))
    using (OracleCommand srcCmd = new OracleCommand("ALTER SESSION SET NLS_DATE_FORMAT = 'yyyy-mm-dd hh24:mi:ss'", srcConn))
    {
        srcCmd.CommandText = "select * from test";
        rd = srcCmd.ExecuteReader();
        SqlBulkCopy copy = new SqlBulkCopy(destConn);
        // ColumnMappings property is used to map column positions, not data type
        copy.DestinationTableName = "test";
        copy.NotifyAfter = 2000;
        copy.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
        copy.BulkCopyTimeout = 10000000;
        try { copy.WriteToServer((IDataReader)rd); }
        TargetCount = (Int32)(typeof(SqlBulkCopy).GetField("_rowsCopied", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance)).GetValue(copy);
        copy.Close();
        rd.Close();
    }
}

请注意,我已将转换转换SqlDataReaderIDataReader,希望转换将 T 转换为 1 并将 F 转换为 0。显然不是。

请任何帮助将不胜感激。

谢谢,

4

1 回答 1

0

为什么不尝试在获取数据之前更改值类型。喜欢 :

select case when id='T' then 1 else 0 end as id from test

id 是 oracle 和 sqlserver 之间具有不同数据类型的列。

于 2013-05-04T01:51:03.737 回答