Простой пример OracleBulkCopy ошибочно добавляет к уже определенному имени целевой таблицы мое собственное имя схемы.C#

Место общения программистов C#
Ответить
Anonymous
 Простой пример OracleBulkCopy ошибочно добавляет к уже определенному имени целевой таблицы мое собственное имя схемы.

Сообщение Anonymous »

Я пытаюсь выполнить простую массовую вставку Oracle в следующую таблицу.

Код: Выделить всё

CREATE TABLE TARGETSCHEMA.JUNK1
(COL1 VARCHAR2(255));
Я получаю следующую ошибку при выполнении метода WriteToServer массовой вставки.

Код: Выделить всё

ORA-39831: Direct path load failed, (MYSCHEMA.TARGETSCHEMA.JUNK1) is not a table. https://docs.oracle.com/error-help/db/ora-39831/

Когда я подключаюсь к базе данных Oracle с помощью Oracle.ManagedDataAccess.Core и C#, строка подключения имеет следующий формат:

Код: Выделить всё

user id=MySchema;password=MyPassword;data source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=servername.sys.mycompany.com)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=mydb_adhoc.mycompany.com)))

Вот код, который в этом примере начинается с CallingProcedure:

Код: Выделить всё

public static void CallingProcedure()
{
string targetTableName = "TARGETSCHEMA.JUNK1";
DataTable UploadDataTable = GetDataTableForTable(targetTableName);
UploadDataTable.Rows.Add("1");
BulkInsert(UploadDataTable, targetTableName);
}

public static DataTable GetDataTableForTable(string tableName)
{
OracleConnection sqlConnection = (OracleConnection)GetConnection();
sqlConnection.Open();

OracleCommand sqlCommand = new OracleCommand
{
Connection = sqlConnection,
CommandText = $"SELECT * FROM {tableName} WHERE 1 = 0",
CommandType = CommandType.Text
};

DataSet dataSet = new DataSet();

using (var sqlDataAdapter = new OracleDataAdapter { SelectCommand = sqlCommand })
{
sqlDataAdapter.Fill(dataSet);
}

DataTable dataTable = dataSet.Tables[0];
dataTable.TableName = tableName;
return dataTable;
}

public static void BulkInsert(DataTable cvrgTypData, string targetTableName)
{
var oracleConnection = (OracleConnection)GetConnection();
oracleConnection.Open();

using (OracleBulkCopy bulkCopy = new OracleBulkCopy(oracleConnection))
{
bulkCopy.DestinationTableName = targetTableName;
bulkCopy.ColumnMappings.Add("COL1", "COL1");
bulkCopy.WriteToServer(cvrgTypData);
}

oracleConnection.Close();
oracleConnection.Dispose();
}

Я рассматривал возможность изменения схемы по умолчанию на целевую схему и не уточнять свойство BulkCopy.DestinationTableName именем схемы, но мне кажется, что это неуклюже и в этом нет необходимости. Меня также беспокоит, будет ли удалена настройка по умолчанию, поскольку я открываю новое соединение каждый раз, когда вызываю GetConnection, отвечая на базу данных, используя пул соединений.
Я ожидал, что BulkCopy Для .DestinationTableName должно быть установлено полное имя таблицы, и чтобы моя схема по умолчанию не добавлялась поверх уже полного имени таблицы, что делало бы ее двойной.
Мы используем Oracle 19. .
Как я могу предотвратить такое поведение?

Подробнее здесь: https://stackoverflow.com/questions/789 ... d-target-t
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»