Member 10943256 Ответов: 1

Сделайте установочный файл из проекта, который включает в себя базу данных sqlite! ! !


I have a simple form with one button and two texrfield. i want to save data from the textfields to SQLite database by pressing the button. i created SQLite database and i wrote my code as below. when i run the code from Visual studio (Start), it works correctly But if i create a setup file from my project and installed it, then i can not even open the software which i published! when i double click on the icon of my software, nothing will happen! (it doesn't open!).I know The problem is ONLY because of SQLite part because if i delete the code from SQLite and install the setup file, the software Run correctly (but without database!). Does anyone know how can i fix this problem? i also uploaded my project in google drive below, if it helps... Thanks

simpleDatabase8 SQLite - Test.7z - Google Диск[^]

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

<pre>and this is again my connection code:
<pre> public static SQLiteConnection con = new SQLiteConnection("Data Source= C:\\Users\\...\\sqliteDB.db3");

    private void button1_Click(object sender, EventArgs e)
    {


        con.Open();
        SQLiteCommand cmd = new SQLiteCommand("insert into [Table](name,code) VALUES ('" + textBox1.Text + "', '" + textBox2.Text + "')", con);


        cmd.Parameters.AddWithValue("@name", textBox1.Text);
        cmd.Parameters.AddWithValue("@code", textBox2.Text);

        SQLiteDataAdapter da = new SQLiteDataAdapter(cmd);
        cmd.ExecuteNonQuery();

        con.Close();
        MessageBox.Show("Inserted");

    }

1 Ответов

Рейтинг:
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

Спасибо. я его отредактировал.
о решении моей основной проблемы для запуска программного обеспечения после установки, не могли бы вы, пожалуйста, направлять меня больше?
Я не знаю, как мне найти адрес моего конфигурационного файла, чтобы исправить эту проблему.

Richard MacCutchan

Видеть Использование Visual Studio для поиска строки подключения к базе данных[^], нашим хорошим другом @OriginalGriff.

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

Это не то, что я сказал.