Я поддерживаю устаревший код oracle proc C/C++
, который обрабатывает текстовый файл и обновляет базу данных. В коде они готовят оператор SELECT
, который выглядит примерно так
SELECT 'ERROR_ID=§' || ERROR_ID || '§' || ' AND ' ...
и после выполнения оператора select они получают данные, как показано ниже, в массиве символов.
ERROR_ID=§ASI:10§ AND
позже они заменяют разделительный символ (§) одинарными кавычками, как показано ниже.
if((char)file_str.arr[k]=='§')
{
strncpy((char*)&file_str.arr[k],"'",1);
}
В основном они получают первичные ключи из БД (старый первичный ключ) и сравнивают первичный ключ, который присутствует в текстовом файле (новые ключи). Они используют простой strcmp
для сравнения этих первичных ключей.
Теперь у меня возникает проблема. Несмотря на то, что старые и новые первичные ключи совпадают, если я посмотрю файл журнала, вместо одинарных кавычек появятся эти вопросительные знаки.
ERROR_ID=?ASI:10? AND FORM_ID=?064956? - old key
ERROR_ID='ASI:10' AND FORM_ID='064956' - new key
Я предполагаю, что, поскольку они используют sectional symbol(§)
в коде, который является non ASCII char
, он терпит неудачу.
Пожалуйста, предложите.
Обновление. Один и тот же двоичный файл развернут в разных средах. В некоторых средах разделительный символ (§) заменяется на '?' отметки, а на некоторых работает нормально. Вопрос. Существуют ли какие-либо параметры среды, влияющие на это? Если да, то что мне искать.
ОС во всех средах: SunOS 5.10
char
/char*
. Почему неfile_str.arr[k] = '\'';
(а неstrncpy
) - person Martin Bonner supports Monica   schedule 22.03.2018std::replace(file_str.arr, file_str.arr+length, '§', '\'');
, чтобы сделать все за один раз. - person Martin Bonner supports Monica   schedule 22.03.2018'§'
– это многосимвольный литерал (на большинстве целевых ), имеет типint
и значение, определяемое реализацией. - person YSC   schedule 26.09.2018