SivaKrishna Lavidi Ответов: 2

Как вставить XML в таблицу SQL server


у меня есть XML, и я хочу вставить этот XML в таблицу sql server с помощью встроенного запроса

Что я уже пробовал:

strQuery = "insert into tblTransaction (DeliveryNo,Date,AccountNo,Carrier,Service,Status,Manifest,ManifestDate,MasterTracking,Tracking,xmlData) values('" + resxml.GetElementsByTagName("ShipmentID")(0).InnerText + "','" + mxml.GetElementsByTagName("ShipDate")(0).InnerText + "','" + mxml.GetElementsByTagName("AccountNumber")(0).InnerText + "','" + mxml.GetElementsByTagName("Carrier")(0).InnerText + "','" + mxml.GetElementsByTagName("ServiceType")(0).InnerText + "','" + mxml.GetElementsByTagName("Action")(0).InnerText + "','','','" + resxml.GetElementsByTagName("MasterTracking")(0).InnerText + "','" + myxmllist(0).SelectSingleNode("TrackingNumber").InnerText + "','" + mxml.InnerXml + "')"


в столбце данных xmlData я должен вставить xml-данные

PIEBALDconsult

Во-первых, научитесь использовать параметризованные операторы-они все упрощают.
И если вы предоставите примерный фрагмент XML, я, вероятно, смогу показать вам, как удивить ваших друзей-вы слишком много работаете.

2 Ответов

Рейтинг:
8

Patrice T

strQuery = "insert into tblTransaction (DeliveryNo,Date,AccountNo,Carrier,Service,Status,Manifest,ManifestDate,MasterTracking,Tracking,xmlData) values('" + resxml.GetElementsByTagName("ShipmentID")(0).InnerText + "','" + mxml.GetElementsByTagName("ShipDate")(0).InnerText + "','" + mxml.GetElementsByTagName("AccountNumber")(0).InnerText + "','" + mxml.GetElementsByTagName("Carrier")(0).InnerText + "','" + mxml.GetElementsByTagName("ServiceType")(0).InnerText + "','" + mxml.GetElementsByTagName("Action")(0).InnerText + "','','','" + resxml.GetElementsByTagName("MasterTracking")(0).InnerText + "','" + myxmllist(0).SelectSingleNode("TrackingNumber").InnerText + "','" + mxml.InnerXml + "')"

Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]
Цитата:
Как вставить XML в таблицу SQL server

Как только вы используете параметры, вы вставляете XML-строки точно так же, как и любые другие строки, содержание не имеет значения.


Рейтинг:
15

Richard Deeming

Начните с фиксации SQL-инъекция[^] уязвимость в вашем коде:

const string Query = "INSERT INTO tblTransaction (DeliveryNo, Date, AccountNo, Carrier, Service, Status, Manifest, ManifestDate, MasterTracking, Tracking, xmlData) VALUES (@DeliveryNo, @Date, @AccountNo, @Carrier, @Service, @Status, @Manifest, @ManifestDate, @MasterTracking, @Tracking, @xmlData)";

using (var connection = new SqlConnection("..."))
using (var command = new SqlCommand(Query, connection))
{
    command.Parameters.AddWithValue("@DeliveryNo", resxml.GetElementsByTagName("ShipmentID")(0).InnerText);
    command.Parameters.AddWithValue("@Date", mxml.GetElementsByTagName("ShipDate")(0).InnerText);
    command.Parameters.AddWithValue("@AccountNo", mxml.GetElementsByTagName("AccountNumber")(0).InnerText);
    command.Parameters.AddWithValue("@Carrier", mxml.GetElementsByTagName("Carrier")(0).InnerText);
    command.Parameters.AddWithValue("@Service", mxml.GetElementsByTagName("ServiceType")(0).InnerText);
    command.Parameters.AddWithValue("@Status", mxml.GetElementsByTagName("Action")(0).InnerText);
    
    // TODO: Provide the correct value for these two columns:
    command.Parameters.AddWithValue("@Manifest", ???);
    command.Parameters.AddWithValue("@ManifestDate", ???);
    
    command.Parameters.AddWithValue("@MasterTracking", resxml.GetElementsByTagName("MasterTracking")(0).InnerText);
    command.Parameters.AddWithValue("@Tracking", myxmllist(0).SelectSingleNode("TrackingNumber").InnerText);
    command.Parameters.AddWithValue("@xmlData", mxml.InnerXml);
    
    connection.Open();
    command.ExecuteNonQuery();
}

Теперь очевидно, что вы упускаете значение для двух столбцов - Manifest и ManifestDate Передайте правильное значение этим двум параметрам, и вы должны быть готовы к работе.


Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]