非托管ODP.NET-BulkCopy引导至RAW(16)

时间:2018-08-03 15:39:22

标签: c# database oracle plsql guid

我正在尝试使用OracleBulkCopy将数据从CSV文件插入Oracle DB。

表架构:

CREATE TABLE CodeDictionary
(
    Id                      RAW(16) default SYS_GUID(),
    Code                    varchar2(100) NULL,
    Description             varchar2(300) NULL,
    Domain                  varchar2(100) NOT NULL,

    constraint PK_CodeDictionary PRIMARY KEY (Id)
) GO

我无法使用BulkCopy插入.Net Guid作为RAW(16)。

这是一段代码:

var dataTable = new DataTable(_tableName);
// csvMapping(dataTable);
dataTable.Columns.Add("Id", typeof(byte[]));
dataTable.Columns.Add("Description", typeof(string));
dataTable.Columns.Add("Code", typeof(string));
dataTable.Columns.Add("Domain", typeof(string));

using (var oracleConnection = new OracleConnection(_connectionString))
{
    oracleConnection.Open();
    // Create the bulk copy object
    var oracleBulkCopy = new OracleBulkCopy(oracleConnection, OracleBulkCopyOptions.UseInternalTransaction)
    {
        DestinationTableName = _tableName,
        BatchSize = _batchsize,
        BulkCopyTimeout = _oracleTimeOut
    };

    oracleBulkCopy.ColumnMappings.Add("Id", "Id");
    oracleBulkCopy.ColumnMappings.Add("Description", "Description");
    oracleBulkCopy.ColumnMappings.Add("Code", "Code");
    oracleBulkCopy.ColumnMappings.Add("Domain", "Domain");

    // WHILE (!textFieldParser.EndOfStream) 

    // Read CSV and Map data HERE.....

    dataTable.Rows.Add(formatRow);

    // **formatRow** is object[]
    // The first element of formatRow is 'Id' and is a byte[] generated in that way:
    // var guid = Guid.Parse("GUID_READ_FROM_CSV")
    // guid.ToByteArray();

    // END WHILE

    oracleBulkCopy.WriteToServer(dataTable);

    oracleConnection.Close();
}

这段代码给了我这个例外:
ORA-00600:内部错误代码,参数:[kpudpxp_isSid-2],[],[],[],[],[],[],[],[],[],[ ],[]

我试图创建没有RAW(16)的表,而BulkCopy可以完美地工作,所以我认为问题出在 Guid-> byte []-> RAW(16)

我也尝试过使用 OracleBinary 类型,但没有成功。

有人知道如何解决这个问题吗? 也许有人已经多次使用过此OracleBulkCopy。 对我来说,这是我第一次使用Oracle PL / SQL。

0 个答案:

没有答案