If command executenonquery 1 ошибка

Делаю 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's user avatar

aepot

45.3k5 золотых знаков22 серебряных знака51 бронзовый знак

задан 31 мая 2022 в 11:59

naus's user avatar

6

Вот вы создаете

MySqlCommand command = new MySqlCommand("текст запроса");

А как команда поймет, какое подключение к базе надо использовать, чтобы принести вам данные? Телепатически? :)

То есть ей надо назначить подключение. У вас даже метод есть getConnection(), вы не находите странным, что ни разу его не использовали?

MySqlCommand command = new MySqlCommand("текст запроса", db.getConnection());

ответ дан 31 мая 2022 в 13:10

aepot's user avatar

aepotaepot

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

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

Подождите писать в комментариях ссылки на 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();
            }
        }

5fb121f6e859e455168663.png
Помогите пожалуйста, заранее спасибо))

Понравилась статья? Поделить с друзьями:

Не пропустите эти материалы по теме:

  • Яндекс еда ошибка привязки карты
  • Idt huawei ошибка 39
  • Idt audio выдает ошибку
  • Ids drive ошибка uc1
  • Idrac сброс ошибок

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии