Вставить XML-данные SQL Server - Проблема с кодировкой - PullRequest
0 голосов
/ 29 сентября 2011

Я сериализую некоторые данные перед тем, как вставить их в БД.

Dim insertString As String = "INSERT INTO GP_SELECTION(SOCIETE, NAME, OBJECT_TYPE, DATA) VALUES ('{0}','{1}',{2},'{3}')"
Dim xmlData As String = .XmlFromFilters()
insertString = String.Format(insertString, societe, .Name, CInt(.ObjectType), xmlData)

Теперь, когда я делаю вставку, sql похож на

INSERT INTO GP_SELECTION(SOCIETE, NAME, OBJECT_TYPE, DATA) VALUES ('01','hello world!!!',0,
'<?xml version="1.0" encoding="utf-16"?>
<ArrayOfPropertyFilter xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <PropertyFilter>
    <AndOr>SOME DATA</AndOr>
    <Value xsi:type="xsd:string" />
  </PropertyFilter>
</ArrayOfPropertyFilter>')

и сервер SQl дает мне:

Синтаксический анализ XML: строка 1, символ 38, невозможно переключить кодировку

Интересно, как этого избежать ... Стоит ли конвертировать Unicode (UTF) insertString? Как? Или, может быть, я должен использовать метод SQL для преобразования?

Может быть, решением будет удалить из сериализованной строки "encoding="utf-16"" (тогда вставка работает без проблем) ...?

PS. Для предотвращения необычных комментариев, на самом деле, я не использую хранимые процедуры и использую прямой код INSERT. Я признаю, что это не лучший способ сделать это, но, тем не менее, это мой выбор в настоящее время.

1 Ответ

0 голосов
/ 29 сентября 2011

Я не знаю, почему это имеет значение :-), но если вы приведете свой XML к NVARCHAR(MAX), а затем вернетесь к XML, это, похоже, сработает (по крайней мере, в моем тестовом примере):

DECLARE @tmp TABLE (ID INT, XmlCol XML)

INSERT INTO @tmp 
VALUES (1, CAST(CAST('<?xml version="1.0" encoding="utf-16"?>
                      <ArrayOfPropertyFilter xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                         <PropertyFilter>
                              <AndOr>SOME DATA</AndOr>
                              <Value xsi:type="xsd:string" />
                         </PropertyFilter>
                      </ArrayOfPropertyFilter>' AS NVARCHAR(MAX)) AS XML))

Ваша большая проблема заключается в том, что ваш подход открыт для SQL-инъекций - вы должны использовать параметризованный запрос вместо того, чтобы объединять ваш SQL-оператор в виде строки!

Используйте что-то вроде:

INSERT INTO GP_SELECTION(SOCIETE, NAME, OBJECT_TYPE, DATA) 
VALUES (@Societe, @Name, @ObjectType, @Data)

, затем определите параметры SQL для вашего запроса и заполните их значениями.Намного безопаснее !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...