Как вставить XML в Mysql? - PullRequest
       33

Как вставить XML в Mysql?

2 голосов
/ 17 августа 2010

этот вопрос выглядит очень просто, но я новичок в C ++ и MySQL, поэтому он все еще не работает.

Вот сделка: У меня есть строка (_bstr_t), которая содержит xml, и я хочу сохранить ее в столбце longblolb в MySql.

Способы, которые я попробовал, но не удалось:

  1. записать мой xml в локальный файл и использовать команду mysql LOAD_FILE, это работало локально, но не на сервере, и использование этого метода с сервером небезопасно
  2. использовать mysql_real_escape_string () Я думаю, что это путь, но эта функция принимает char *, и у меня есть многобайтовая строка, поэтому она не работает

Существуют ли другие способы хранения xml в MySQL или есть функция, такая как mysql_real_escape для многобайтовой обработки.

strcpy не работает, он дает мне «Место чтения нарушения доступа ...» Когда я попробовал приведение, он выглядит хорошо, но в итоге у меня возникла ошибка MySql:

"Ошибка: у вас есть ошибка в вашем SQL синтаксис; проверьте руководство, которое соответствует вашему серверу MySQL версия для правильного использования синтаксиса рядом с '? xml version = \ "1.0 \" encoding = \ "UTF-16 \"?> \ r \ n XV_Object noNamespaceSchem 'в строке 1 "

И, наконец, для первого решения, которое вы мне дали, я новичок в C ++, и я не знаю, куда поместить :: char *, я не могу скомпилировать.

char *to = new char[xml.length() * 2 + 1];  
char* from = (char*)xml::char*;  
mysql_real_escape_string(conn,to,from,xml.length());

Большое спасибо за вашу помощь!

1 Ответ

0 голосов
/ 17 августа 2010

Насколько я знаю, это действительно легко, поскольку Microsoft предоставляет для этого :: char *.

Если у вас есть строка в объекте _bstr_t, просто выполните mysql_real_escape_string (your_object :: char *), что должно помочь.

Если это не помогло, вы также можете использовать strcncpy. Вы можете сделать это так:

char xml[200];
_bstr_t the_xml_you_loaded;
strcncpy(xml,(char*)the_xml_you_loaded, sizeof(xml));

И последнее, но не менее важное: вы можете просто привести из _bstr_t к символу *:

char* xml = (char*)the_xml_you_loaded;
mysql_real_escape_string(xml);

Редактировать: (после комментариев)

Ник, всякий раз, когда вы используете "new", обязательно вызывайте delete в конце, чтобы избавиться от нежелательных ошибок памяти. Это не имеет ничего общего с вашей проблемой, это просто общий совет, которому вы должны следовать.

Для моего первого решения, поместите :: char * за объектом _bstr_t. например если это так:

_bstr_t xml;

Тогда сделайте это.

xml::char*

и использовать его в качестве параметра в строке mysql_real_escape. И снова на кастинг, сделай так, как я написал, просто

char* somevar = (char*)xml;

и передайте его mysql_real_escape_string. В следующий раз, когда что-то не скомпилируется, также опубликуйте сообщение об ошибке, а не только, что это не так.

...