0

を使用して、Oracle から SQL Server にデータをコピーしようとしていますbulkcopy。問題は、Oracle のブール データは として格納さvarchar2(1)tfSQL Server のブール データ型はおよびbitとして格納されることです。したがって、次のエラーが発生しました。10

データ ソースからの String 型の指定された値を、指定されたターゲット列の bit 型に変換できません。
System.InvalidOperationException: データ ソースからの String 型の指定された値を、指定されたターゲット列の bit 型に変換できません。
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キャストが T を 1 に、F を 0 に変換することを期待して、 toをキャストしたことに注意してくださいIDataReader。明らかにそうではありません。

どんな助けでも大歓迎です。

ありがとう、

4

1 に答える 1

0

get data の前に値の型を変更してみてはいかがでしょうか。お気に入り :

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

id は、oracle と sqlserver の間でデータ型が異なる列です。

于 2013-05-04T01:51:03.737 に答える