我正在尝试使用 .将数据从 Oracle 复制到 SQL Server bulkcopy
。问题是 Oracle 的布尔数据存储为varchar2(1)
和t
,f
而 SQL Server 布尔数据类型是bit
和存储为1
和0
。因此我收到以下错误。
来自数据源的 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();
}
}
请注意,我已将转换转换SqlDataReader
为IDataReader
,希望转换将 T 转换为 1 并将 F 转换为 0。显然不是。
请任何帮助将不胜感激。
谢谢,