Как устранить неверную синтаксическую ошибку при синтаксическом анализе XML-документа
У меня есть программа для импорта данных из XML-файла в таблицу SQL Server. Когда я отлаживаю программу, я получаю ошибку "неправильный синтаксис рядом с" транзакцией"", когда поток начинает создавать таблицу . Мой XML структурирован следующим образом :
<?xml version="1.0" encoding="utf-16"?> <EXPORT_HEADER xmlns="http://www.sir.com/SFI/Export/GL_Export/20051005" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sir.com/SFI/Export/GL_Export/20051005 GL_EXPORT.xsd" total_transactions="4616" total_accnts="2000"> <TRANSACTION business_type_code="DIRECT" term="NB" /> <TRANSACTION business_type_code="DIRECT" term="NB" /> </EXPORT_HEADER>
Однако когда я использую раздел тега транзакции который содержит фактические данные которые я хочу зафиксировать я получаю синтаксическую ошибку выше
DataSet DS = new DataSet(); DS.ReadXml(XMlFile); DataTable dt = DS.Tables[1]; if (dt.Columns.Count == 0) dt.ReadXmlSchema(XMlFile); dt.ReadXml(XMlFile);
Это мой код для импорта XML - файла в таблицу Sql server :
private void btnImport_Click(object sender, EventArgs e) { const string XMlFile = @"C:\Users\tshumae\Documents\MyProjects\MyProject\GL_Export_54_201907081053.xml"; // string XMlFile = txtFilePath.Text; if (File.Exists(XMlFile)) { // Conversion Xml file to DataTable DataSet DS = new DataSet(); DS.ReadXml(XMlFile); DataTable dt = DS.Tables[0]; if (dt.Columns.Count == 0) dt.ReadXmlSchema(XMlFile); dt.ReadXml(XMlFile); // Creating Query for Table Creation string Query = CreateTableQuery(dt); SqlConnection con = new SqlConnection(StrCon); con.Open(); // Deletion of Table if already Exist SqlCommand cmd = new SqlCommand("IF OBJECT_ID('dbo." + dt.TableName + "', 'U') IS NOT NULL DROP TABLE dbo." + dt.TableName + ";", con); cmd.ExecuteNonQuery(); // Table Creation cmd = new SqlCommand(Query, con); int check = cmd.ExecuteNonQuery(); if (check != 0) { // Copy Data from DataTable to Sql Table using (var bulkCopy = new SqlBulkCopy(con.ConnectionString, SqlBulkCopyOptions.KeepIdentity)) { foreach (DataColumn col in dt.Columns) { bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName); } bulkCopy.BulkCopyTimeout = 600; bulkCopy.DestinationTableName = dt.TableName; bulkCopy.WriteToServer(dt); } MessageBox.Show("Table Created Successfully"); } con.Close(); } }
Что я уже пробовал:
В качестве проверки я попробовал использовать раздел EXPORT_HEADER, и данные в заголовке успешно зафиксированы, а таблица также создана:
DataSet DS = new DataSet(); DS.ReadXml(XMlFile); DataTable dt = DS.Tables[0]; if (dt.Columns.Count == 0) dt.ReadXmlSchema(XMlFile); dt.ReadXml(XMlFile);<pre lang="c#">
Afzaal Ahmad Zeeshan
Исправляя синтаксис, я полагаю. :-)
И мальчик, ты подвергаешь свою систему тяжелой SQL-инъекции, причем не из одного, а из двух регионов! :Д
Maciej Los
Ух ты! Это выглядит очень подозрительно:
SqlCommand cmd = new SqlCommand("IF OBJECT_ID('dbo." + dt.TableName + "', 'U') IS NOT NULL DROP TABLE dbo." + dt.TableName + ";", con);
и это может быть очень опасно.