Member 11220730 Ответов: 3

Слово, содержащее одинарную кавычку, разбивается на следующий столбец после одинарной кавычки при заполнении набора данных oledb в импорте csv-файла


Слово, содержащее одинарную кавычку, разбивается на следующий столбец после одинарной кавычки при заполнении набора данных OleDb в импорте csv-файла
Word - 4' 9 тест июнь 2019

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

string sql = @"SELECT * FROM [" + this.FileName + "]";
            using (OleDbConnection objConnection = new OleDbConnection(ConnectionString))
            using (OleDbCommand command = new OleDbCommand(sql, objConnection))
            using (OleDbDataAdapter objDataAdapter = new OleDbDataAdapter(command))
            {

                try
                {
                    objConnection.Open();
                    objDataAdapter.Fill(dsData);
                }
                catch (Exception ex)
                {}
}

CHill60

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

Member 11220730

Моя проблема заключается в том, что слово, содержащее одинарные кавычки, разрывается на следующий столбец после одинарной кавычки при заполнении набора данных oledb в импорте csv-файла

Richard MacCutchan

Какое слово, где, какая строка кода? Пожалуйста, отредактируйте свой вопрос и предоставьте правильную информацию о вашей проблеме.

Patrice T

Покажите пример записи, которая делает ошибку.

3 Ответов

Рейтинг:
2

OriginalGriff

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

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

И в то же время ваша проблема исчезнет...


Рейтинг:
2

Afzaal Ahmad Zeeshan

Цитата:
Слово, содержащее одинарную кавычку, разбивается на следующий столбец после одинарной кавычки при заполнении набора данных OleDb в импорте csv-файла
Причина в том, как описано в решении 1, что ваши входные данные не очищены. Ваш запрос выглядит примерно так,
SELECT * FROM ['Employee];
INSERT INTO ...
Как вы можете видеть, ваша SQL-команда, построенная с использованием конкатенации строк, оставляет строковые значения неэкранированными, а строка (как в вашем случае), если она не заключена в правильные кавычки, может перетекать в следующие строки.

Решение этой проблемы заключается в использовании параметров в качестве входных данных, которые могут помочь вашему построителю SQL-запросов правильно очистить входные данные и избежать любых нежелательных значений. Это может привести к предотвращению SQL-инъекции и такого рода проблемных входных данных, не связанных с SQL-инъекцией. Вполне возможно, что пользователь может ввести эти значения непреднамеренно Прочтите этот забавный комикс для юмора, xkcd: подвиги мамы[^].

Ознакомьтесь с этой страницей документации в Microsoft Docs, чтобы узнать, как это может работать в реальном решении, Объект oledbcommand.Свойство Параметров (System.Data.OleDb) | Microsoft Docs[^]


Рейтинг:
0

Patrice T

Цитата:
Слово, содержащее одинарную кавычку, разбивается на следующий столбец после одинарной кавычки при заполнении набора данных OleDb в импорте csv-файла

Когда я импортирую csv-файл (например) в Excel, меня спрашивают, Что такое разделитель полей и что такое разделитель строк.
Где вы говорите эти 2 информации в этом коде?
Мой опыт заключается в том, что я получаю наименьшие проблемы с вкладками в качестве разделителя полей и ничего для разделителя строк.

Вы все еще не показали примерные данные.