Рейтинг:
2
OriginalGriff
Две основные вещи здесь не так:
1) Не устанавливайте жесткие кодовые соединения - всегда считывайте их из конфигурационного файла, иначе вам придется менять свое приложение во многих местах каждый раз, когда вы его выпускаете, - и это означает, что Менас выпускает непроверенный код, который однажды потерпит неудачу, или развивается против "живой" базы данных, что гораздо, гораздо хуже. Когда вы делаете ошибку в коде yoru, вы можете испортить производственную базу данных далеко, слишком легко. Всегда используйте конфигурационный файл, чтобы изменить соединение в одном месте.
2) Никогда не используйте строки для построения 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;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.
Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?
Я бы также предложил вам посмотреть здесь:
Где я должен хранить свои данные?[
^] и используйте это, чтобы найти базу данных SQLite - вы можете использовать тот же код в своей программе установки, чтобы скопировать файл туда.
Member 10943256
Спасибо за хорошую информацию.
что касается первого совета, то каков адрес моего конфигурационного файла?
я не мог его найти.
Спасибо
OriginalGriff
Как ты думаешь, откуда мне знать?
Google "конфигурационный файл" и тип вашего приложения и посмотреть, что он возвращается. На первый взгляд, у вас его нет - или вы не знаете об этом, - поэтому посмотрите на результаты, чтобы узнать, как использовать его в своей среде (например, Winapps и Web используют совершенно разные механизмы настройки).
Member 10943256
Я думал, вы видели мое приложение для windows!
я загрузил его на google Диск и поделился им над текстом :"что я пробовал:"
https://drive.google.com/file/d/1XV0GtTODcVJQW1gyI6xvZXUWQ1JvS7ua/view?usp=sharing
OriginalGriff
Нет. Очень немногие из нас отправляются на случайные сайты, чтобы пробраться через gawd-знает-сколько-кода в поисках чего-то, что может быть релевантным. Мы все добровольцы, и это сокращает реальную оплачиваемую работу. Мы не собираемся тратить наше время на то, чтобы пробираться через ваш код, потому что вы не можете потрудиться показать нам только соответствующие биты.
Member 10943256
я думаю, что сначала я должен физически добавить базу данных в свою visual studio, а затем я могу увидеть конфигурационный файл, ?
Member 10943256
Извините, почему вы используете "мы" вместо "Я" ?!
у меня есть проблема, и я написал свой вопрос с полной информацией там. я даже отправил полный исходный файл из моей проблемы, и я любезно попросил о помощи. Если кто-нибудь знает и поможет, я буду очень признателен!
Но вы, если вы не хотите помочь или вы не знаете ответа, пожалуйста, ничего не пишите!
Richard MacCutchan
Успокойтесь, вернитесь и прочитайте предложения, которые вам были даны. Мы здесь, чтобы помочь людям с их проблемами, но мы ожидаем, что вы предоставите всю необходимую информацию здесь, в вашем вопросе.
Member 10943256
Дорогой Ричард,
Спасибо за ваш комментарий.
со своей стороны, я думаю, что написал всю соответствующую информацию, но если я пропустил sth или есть какая-то неопределенная часть в моем объяснении, пожалуйста, скажите мне, тогда я напишу/добавлю это.
Richard MacCutchan
Ну, OriginalGriff уже объяснил, чего не хватает, так что нет смысла мне это повторять.
Richard MacCutchan
Просто глядя на ваш код, я вижу две проблемы.
1. Использование конкатенации строк, как уже указывал OriginalGriff, сопряжено с риском для целостности ваших данных. Но я заметил, что вы также добавляете два значения параметров в свою команду, не используя имена значений в операторе insert.
2. Вы не проверяете результат своей команды ExecuteNonQuery, чтобы увидеть, удалось ли это, но вы все равно публикуете сообщение об успехе. Таким образом, ваш код может работать в течение нескольких недель, даже не вставляя запись, и вы никогда не узнаете.
Я бы предложил потратить некоторое серьезное учебное время на изучение того, как правильно использовать SQL.
Member 10943256
он получает значения из текстовых файлов и сохраняет их в двух столбцах базы данных с одинаковым именем!
Richard MacCutchan
Вы смешиваете методы. Если вы используете конкатенацию строк (что вы и делаете), то добавление параметров не имеет никакой цели. Ваша команда должна быть:
SQLiteCommand cmd = new SQLiteCommand("insert into [Table](name,code) VALUES (@name, @code)", con);
cmd.Parameters.AddWithValue("@name", textBox1.Text);
cmd.Parameters.AddWithValue("@code", textBox2.Text);
И вам все еще нужно обратиться к пункту 2.
Member 10943256
Спасибо за объяснение.
Насчет последнего предложения, я не понял вашу точку зрения. не могли бы вы сказать мне, что такое адрес point2...?
Richard MacCutchan
Я имею в виду пункт номер 2 в моем послании выше. Вы должны проверить результаты системных вызовов, которые возвращают значение, которое говорит вам, был ли метод успешным или нет; не просто предполагайте, что он был успешным.
Member 10943256
в данном случае я написал именно так :)
Правильно ли это? Спасибо
int i = 0;
i = cmd.Метод executenonquery();
если (i > 0)
{
Ящик для сообщений.Показать("Вставлено");
DisplayData();
}
еще
{
Ящик для сообщений.Показать("Не Вставлено");
}
кон.Рядом();
Richard MacCutchan
Почти. Вы должны переместить con.Close
за пределами города if
блок, так его всегда называют.
Member 10943256
Спасибо. я его отредактировал.
о решении моей основной проблемы для запуска программного обеспечения после установки, не могли бы вы, пожалуйста, направлять меня больше?
Я не знаю, как мне найти адрес моего конфигурационного файла, чтобы исправить эту проблему.
Member 10943256
Спасибо Ричарду, а также спасибо @OriginalGriff.
я добавил SQLite в sql-соединение, но строка подключения по-прежнему совпадает с адресом расположения файла. но если я правильно понял, вы имели в виду, что я должен изменить его(не быть в C/desktop...), да?
2) и все же он не работает после того, как я его установил.(как и раньше. я просто нажимаю на ярлык и ничего не происходит)
OriginalGriff
Чтобы вернуться первое что я тебе сказал:
"Не устанавливайте жесткие кодовые соединения - всегда считывайте их из конфигурационного файла, иначе вам придется менять свое приложение во многих местах каждый раз, когда вы его выпускаете, - и это означает выпуск непроверенного кода, который однажды потерпит неудачу, или разработку против "живой" базы данных, что гораздо, гораздо хуже. Когда вы делаете ошибку в коде yoru, вы можете испортить производственную базу данных далеко, слишком легко. Всегда используйте конфигурационный файл, чтобы изменить соединение в одном месте."
Затем последовал первый ответ:
"Google "конфигурационный файл" и тип вашего приложения и посмотреть, что он возвращается. На первый взгляд, у вас его нет - или вы не знаете, что у вас есть, - поэтому посмотрите на результаты, чтобы узнать, как использовать его в своей среде"
Вы уже пробовали Google? очень простой поиск "конфигурационный файл winforms c#" дал бы вам массу информации, например такую:
https://docs.microsoft.com/en-us/dotnet/framework/winforms/advanced/how-to-read-settings-at-run-time-with-csharp
И тогда - шесть часов назад - у вас будет необходимая информация ...
Member 10943256
@OriginalGriff: еще раз спасибо за помощь.
я сделал то, что вы упомянули, и теперь он снова работает, как раньше.я имею в виду, когда я сделал установочный файл и установил его, дважды щелкнув по ярлыку, ничего не произойдет!
Не могли бы вы сказать, что я пропустил?
Спасибо.
1)мой код в App.config выглядит следующим образом:
<конфигурация>
<startup>
<supportedruntime version="v4.0" sku=".NETFramework,версия=v4.6.1">
<соединительные нити>
&ЛТ;добавить имя="строкой connection_string" имя_поставщика="системы.Данных.sqlclient как" свойства connectionString="источник данных=С:\\Пользователи\\МОЙ_ЛОГИН\\рабочий стол\\simpleDatabase8 файл SQLite - копия\\simpleDatabase7\\бин\\отладки\\файл sqlitedb.DB3, в;Версия=3"и GT;
2) и я написал, как это в моей форме:
статическая строка conn_string = System.Конфигурация.Конфигурационный менеджер.Выберите["строкой connection_string"].Параметр connectionString;
public static SQLiteConnection con = new SQLiteConnection(conn_string);
OriginalGriff
Потому что ваша строка подключения в системе, на которую вы ее устанавливаете, не будет иметь пользователя под названием "MYUSER", и файл, вероятно, не существовал бы на его рабочем столе, если бы он это сделал. Кроме того, ваше приложение, вероятно, не будет иметь разрешения на доступ к нему, если это другой пользователь в любом случае.
Вот в чем смысл конфигурационного файла: его можно изменить, чтобы отразить локальную ситуацию, не меняя EXE-файл.
Существует также то, что ваше приложение не будет там, если ваша программа установки "нормальная", она будет находиться в разделе Program Files, и вы вообще не сможете писать туда файлы по соображениям безопасности.
И не храните файлы данных на рабочем столе: Windows предоставляет множество "разумных" мест для их размещения.
https://www.codeproject.com/Tips/370232/Where-should-I-store-my-data
Member 10943256
Спасибо за объяснение.
Что касается первого абзаца в вашем комментарии, не могли бы вы сказать, что я должен сделать, чтобы решить его?
OriginalGriff
Измените программу установки, чтобы она записывала правильный путь в конфигурационный файл при копировании БД ...
Member 10943256
Ричард твой ответ был неверен!
Как я уже упоминал в своем вопросе, если вы запустите его из visual studio, он будет работать хорошо, и все данные будут сохранены в базе данных правильно. я не знаю, почему вы написали этот код, который не будет работать в течение нескольких недель.....
Richard MacCutchan
Это не то, что я сказал.