Делаю windows form связанную с БД xampp my sql, чтобы в форме можно было заполнять базу данных
Выдает ошибку в строе if (command.ExecuteNonQuery() == 1)
Исключение не обработано
System.InvalidOperationException: «Connection must be valid and open.»
Помогите пожалуйста
internal class DB
{
MySqlConnection connection = new MySqlConnection("datasource=127.0.0.1;port=3306;username=root;database=shop1;");
public void openConnection()
{
if (connection.State == System.Data.ConnectionState.Closed)
connection.Open();
}
public void closeConnection()
{
if (connection.State == System.Data.ConnectionState.Open)
connection.Close();
}
public MySqlConnection getConnection()
{
return connection;
}
}
private void button1_Click(object sender, EventArgs e)
{
DB db = new DB();
MySqlCommand command = new MySqlCommand("INSERT INTO products (name, price) VALUES('@name', '@price')");
command.Parameters.Add("@name", MySqlDbType.VarChar).Value = textBox1.Text;
command.Parameters.Add("@price", MySqlDbType.VarChar).Value = textBox2.Text;
db.openConnection();
if (command.ExecuteNonQuery() == 1)
MessageBox.Show("Товар добавлен");
else
MessageBox.Show("Товар не добавлен");
db.closeConnection();
}
aepot♦
45.3k5 золотых знаков22 серебряных знака51 бронзовый знак
задан 31 мая 2022 в 11:59
6
Вот вы создаете
MySqlCommand command = new MySqlCommand("текст запроса");
А как команда поймет, какое подключение к базе надо использовать, чтобы принести вам данные? Телепатически? 
То есть ей надо назначить подключение. У вас даже метод есть getConnection(), вы не находите странным, что ни разу его не использовали?
MySqlCommand command = new MySqlCommand("текст запроса", db.getConnection());
ответ дан 31 мая 2022 в 13:10
aepot♦aepot
45.3k5 золотых знаков22 серебряных знака51 бронзовый знак
7
https://metanit.com/sharp/entityframework/1.1.php
Добавлено через 11 минут
Если кратко и на Вашем примере:
В чем преимущества EF перед «обычными» методами работы ADO.NET ?
У Вас есть таблица в БД Users, хранящая информацию о пользователях. Для того, чтобы добавить в нее новую запись, не надо писать никаких запросов, заморачиваться с параметрами, открывать-закрывать соединения, отслеживать транзакции и тому подобное.
Вместо этого нужно добавить в Модель эту таблицу как сущность, воплощенную в классе Модели. Помимо самого класса-модели в контексте появится интерфейс DBSet<Users>, у которого имеется много «вкусных» вещей. Для добавления в таблицу нового пользователя нужно всего лишь создать новый экземпляр класса Users, заполнить его поля нужными значениями, привязать это экземпляр к контексту (DBSet) и выполнить SaveChanges
Добавлено через 8 минут
В дополнение:
Не забывайте обрабатывать исключения. Если новая запись не может быть добавлена в таблицу (конфликт ключей, дублирование значений для уникальных столбцов, нарушение ссылочной целостности, некорректный тип данных, отсутствие значения для обязательного поля и т.д.), то следует «неудачный» экземпляр отвязывать от контекста дабы он исчез из кэша EF, где накапливаются все изменения по всем таблицам.
В качестве иллюстрации посмотрите сюда
Проблема с SQLite — после исключения не добавляются данные в таблицу
- Remove From My Forums
-
Question
-
I have am using ExecuteNonQuery to get number of rows inserted But i found that it returns -1 even though rows are successfully inserted. When i searched in forum it was mentioned that set nocount on should not be used. But i am using only insert statement.But
still ExecuteNonQuery returning -1 . Why does it happen? How to solve?Thank you.
-
Moved by
Friday, February 8, 2013 5:05 PM
Not design
-
Moved by
Answers
-
If i add SET NOCOUNT OFF then it works properly.But if i don’t set it then Why it returns -1? Whether ‘Nocount’ is set ‘on’ in-between? I wanted to know why does it happen?
Yes, but I am sorry I don’t have any explanation. Other that someone is playing ping-pong with the «user options» parameter, which I hardly believe in myself.
If you really want debug this, you could create a table like this:
CREATE TABLE debuglog (
now datetime2(3) NOT NULL
CONSTRAINT def_debuglog_now DEFAULT sysdatetime(),
setoption varchar(30) NOT NULL,
value varchar(100) NULL,
CONSTRAINT pk_debuglog PRIMARY KEY (now, setoption) WITH (IGNORE_DUP_KEY = ON)
)The add this to your batch:
INSERT debuglog (setoption, value)
EXEC (‘DBCC USEROPTIONS’)When it has run for a while, query for rows where setoption = ‘nocount’
Erland Sommarskog, SQL Server MVP, esquel@sommarskog.se
-
Marked as answer by
Iric Wen
Monday, February 18, 2013 7:14 AM
-
Marked as answer by
Подождите писать в комментариях ссылки на bind mounting и volume — эта задача гораздо более многомерная, чем выбор способа хранения данных в Docker. Тут необходимо и на уровне организации Docker-образов поразмыслить, да и при покупке VPS задуматься о дополнительных опциях.
Заранее прошу прощение за длинный вопрос. Длинный он потому, что мне нужно было показать ход моих мыслей, а также что я знаю и что ещё не знаю.
Что мы имеем изначально? Обычно в проекте серверного приложения у нас есть какая-то папка для хранения загружаемых пользователями файлов. На примере Lalavel, это storage/app/public:
Иногда файлы сохраняют и в public (причём не только в случае PHP и Lalavel), но я не уверен, что это хорошая идея — смешивать в одну кучу файлы, подготовленные разработчиками (стили, логотипы, иконки) и загруженные пользователями.
В отличие от таких языков, как PHP, в моём случае входной и выходной код полностью разделён, и та структура файлов, что на картинке ниже, на 100% сгенерирована (даже package.json — это не тот package.json, что в корне проекта; из сгенерированного полностью исключены зависимости для разработки и те, что подшиты Webpack-ом в скрипты для фронтенда):
На данный момент у меня 2 volum-а: один для базы данных и другой — для файлов проекта, который создаётся автоматически командой COPY . /var/www/example.com, прописанной в FrontServer.Dockerfile. Я не говорю, что именно так и делаю, но до тех пор, пока не принималось никаких файлов от пользователей, во время деплоя можно было безопасно (потому что данные базы данных хранятся на другом volum-е) полностью удалить volume проекта и добавленные ранее файлы на картинке выше, и только потом загрузить собранный проект заново, установить свежие зависимости и запустить приложение. Теперь же планируется начать принимать файлы от пользователей.
Как я уже сказал выше, не думаю, что это хорошая идея — хранить их public. Какие ещё варианты мне известны?
Вариант 1: Хранить загружаемые пользователями файлы в отдельной папке + на отдельном volume
Аналогично Laravel, помимо public добавить папку storage для файлов, принимаемых от пользователей.
Данный вариант не предполагает добавления новых образов и контейнеров, а вот насчёт Volum-ов надо подумать. Начнём с того, сама папка 06-ProductionBuilding уже соответствует Volume-у, а тут в ней ещё и storage появится, которой должен соответствовать отдельный Volum-е.
Затем, возможно для данного случая и bind mounting ничем не хуже. Однако какой бы вариант не был выбран, при деплое новой версии проекта нужно быть осторожным, чтобы не тронуть папку storage, а такой расклад — хорошая почва для гипотетического инцидента потери данных пользователей.
Вариант 2: Создать отдельный образ
Возможно, работу с изображениями и другими мультимедийными файлами следует вообще переложить на отдельный Docker образ/контейнер/volume. Сейчас у меня node.js (front_server) и PostgreSQL:
Code:
version: "3.5"
services:
front_server:
container_name: Example-Production-FrontServer
build:
context: .
dockerfile: "FrontServer.Dockerfile"
ports: [ "8080:8080" ]
environment:
- DATABASE_HOST=Database
depends_on: [ Database ]
Database:
image: postgres
container_name: Example-Production-Database
ports: [ "${DATABASE_PORT}:${DATABASE_PORT}" ]
environment:
- POSTGRES_PASSWORD=${DATABASE_PASSWORD}
volumes:
- DatabaseData:/data/example.com
volumes:
DatabaseData: {}
но говорят, что для отдачи файлов лучше организовать отдельных сервер, например Nginx. В случае с Docker это не означает покупку ещё одного сервера, поэтому почему бы и нет: отдельный образ, отдельный контейнер, отдельный volume, лёгкость в резервировании данных. Я даже думаю, что при таком раскладе можно у поставщика VPS и отдельный диск арентовать для хранения на нём только файлов, загруженных пользователями.
Итог
Наверное, есть и друге варианты, но мне известны только эти два. Напомню, что в данном вопросе мы не рассматриваем варианты сторонних сервисов, аналогичных AWS Bucket — сейчас задача понять, чего можно достичь с помощью одного VPS и Docker-а.
У меня по какой то причине не получается изменить поле в SQL, пробовал с заглушками и без, ноль. Вот код:
public static void Main(string[] args)
{
const string info = "Server=localhost;Database=unturned2;Uid=root;pwd=root;charset=utf8";
MySqlConnection mycon = new MySqlConnection(info);
const string insert = "INSERT INTO wallets (steamid,balance) VALUES (@id , @bal)";
try
{
mycon.Open();
Console.WriteLine("Successfully connected!");
MySqlCommand command = new MySqlCommand(insert, mycon);
command.Parameters.Add("@id", MySqlDbType.VarChar).Value = "76561198928736885";
command.Parameters.Add("@bal", MySqlDbType.Double).Value = 500;
if(command.ExecuteNonQuery() != 1)
{
Console.WriteLine("Error");
}
MySqlCommand changebal = new MySqlCommand("UPDATE wallets SET balance=0 WHERE steamid=76561198928736885", mycon);
if(changebal.ExecuteNonQuery() != 1)
{
Console.WriteLine("Error occured with changing");
}
}
catch(Exception ex)
{
Console.WriteLine($"Error occured, {ex.Message}");
}
finally
{
mycon.Close();
}
}
Помогите пожалуйста, заранее спасибо))




