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.4k5 золотых знаков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.4k5 золотых знаков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

https://metanit.com/sharp/entityframework/1.1.php

Добавлено через 11 минут
Если кратко и на Вашем примере:
В чем преимущества EF перед «обычными» методами работы ADO.NET ?
У Вас есть таблица в БД Users, хранящая информацию о пользователях. Для того, чтобы добавить в нее новую запись, не надо писать никаких запросов, заморачиваться с параметрами, открывать-закрывать соединения, отслеживать транзакции и тому подобное.
Вместо этого нужно добавить в Модель эту таблицу как сущность, воплощенную в классе Модели. Помимо самого класса-модели в контексте появится интерфейс DBSet<Users>, у которого имеется много «вкусных» вещей. Для добавления в таблицу нового пользователя нужно всего лишь создать новый экземпляр класса Users, заполнить его поля нужными значениями, привязать это экземпляр к контексту (DBSet) и выполнить SaveChanges

Добавлено через 8 минут
В дополнение:
Не забывайте обрабатывать исключения. Если новая запись не может быть добавлена в таблицу (конфликт ключей, дублирование значений для уникальных столбцов, нарушение ссылочной целостности, некорректный тип данных, отсутствие значения для обязательного поля и т.д.), то следует «неудачный» экземпляр отвязывать от контекста дабы он исчез из кэша EF, где накапливаются все изменения по всем таблицам.
В качестве иллюстрации посмотрите сюда
Проблема с SQLite — после исключения не добавляются данные в таблицу

Подождите писать в комментариях ссылки на 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
Помогите пожалуйста, заранее спасибо))

using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;

namespace Проект
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Double a;
            Double b;
            Double c;
            Double d;
            Double s;
            Double t;
            a = Convert.ToDouble(text1sem.Text);
            b = Convert.ToDouble(text1kon.Text);
            c = Convert.ToDouble(text2sem.Text);
            d = Convert.ToDouble(text2kon.Text);
            s = Convert.ToDouble(textitog.Text);
            t = (a + b + c + d + s) / 5 * 20;
            Itog.Text = Convert.ToString(t);
            DB db = new DB();
            MySqlCommand command = new MySqlCommand("INSERT INTO `рейтинг успеваемости` (`Фамилия`, `Имя`, `Отчество`, `1 семестр`, `1 контрольная точка`, `2 семестр`, `2 контрольная точка`, `Итоговая аттестационная`, `Общий рейтинг`) VALUES (@Famaly, @Name, @otce, @1sem, @1kon, @2sem, @2kon, @ates, @reit", db.getConnection());
            command.Parameters.Add("@Famaly", MySqlDbType.VarChar).Value = textfameli.Text;
            command.Parameters.Add("@Name", MySqlDbType.VarChar).Value = textname.Text;
            command.Parameters.Add("@otce", MySqlDbType.VarChar).Value = textotces.Text;
            command.Parameters.Add("@1sem", MySqlDbType.Float).Value = text1sem.Text;
            command.Parameters.Add("@1kon", MySqlDbType.Float).Value = text1kon.Text;
            command.Parameters.Add("@2sem", MySqlDbType.Float).Value = text2sem.Text;
            command.Parameters.Add("@2kon", MySqlDbType.Float).Value = text2kon.Text;
            command.Parameters.Add("@ates", MySqlDbType.Float).Value = textitog.Text;
            command.Parameters.Add("@reit", MySqlDbType.Float).Value = Itog.Text;
            db.openConnection();
            if (command.ExecuteNonQuery() == 1)
                MessageBox.Show("Данные сохранены");
            else
                MessageBox.Show("Данные не сохранены");
            
            db.closeConnection();


        }
    }

}

I have stored proc as below:

ALTER PROC pr_Update_Users_Nomination
(
      @UserID AS VARCHAR(100),  
      @Nominated AS BIT
)
AS

UPDATE User
SET isNominated = @Nominated
WHERE 
EMPID = @UserID;

I want to call this procedure from c# code: Below is the code I am trying:

void OpenConnection()
{
string Nominated = "False";
    //Connection String
        string sConnString = System.Configuration.ConfigurationManager.ConnectionStrings["ConString1"].ConnectionString;
        SqlConnection mySqlCon = new SqlConnection(sConnString);
        SqlCommand mySqlCom = mySqlCon.CreateCommand();

        //Call the stored proc and provide in parameters
        mySqlCom.CommandText = "EXECUTE pr_Update @UserID @Nominated";
        mySqlCom.Parameters.Add("@UserID", SqlDbType.VarChar, 20).Value = UserID;
        mySqlCom.Parameters.Add("@Nominated", SqlDbType.Bit).Value = Nominated;

        mySqlCon.Open();
        mySqlCom.ExecuteNonQuery();
        mySqlCon.Close();
}

I get an error saying

Incorrect Syntax near @Nominated

John Woo's user avatar

John Woo

258k69 gold badges494 silver badges490 bronze badges

asked Nov 14, 2012 at 15:01

BFry's user avatar

first, when executing a procedure with parameter(s), separate the parameters with a comma

EXECUTE pr_Update @UserID, @Nominated

second, modify your code into this,

    string sConnString = System.Configuration.ConfigurationManager.ConnectionStrings["ConString1"].ConnectionString;
    using(SqlConnection mySqlCon = new SqlConnection(sConnString))
    {
        using(SqlCommand mySqlCom = new SqlCommand())
        {
            mySqlCom.Connection = mySqlCon;
            mySqlCom.CommandText = "pr_Update";
            mySqlCom.CommandType = CommandType.StoredProcedure;
            mySqlCom.Parameters.Add("@UserID", SqlDbType.VarChar, 20).Value = UserID;
            mySqlCom.Parameters.Add("@Nominated", SqlDbType.Bit).Value = Nominated;
            try
            {
                mySqlCon.Open();
                mySqlCom.ExecuteNonQuery();
            }
            catch(SqlException ex)
            {
                // do something with the exception
                // don't hide it
            }

        }
    }

answered Nov 14, 2012 at 15:02

John Woo's user avatar

John WooJohn Woo

258k69 gold badges494 silver badges490 bronze badges

0

You are missing a comma (,) between the parameters.

It should be

mySqlCom.CommandText = "EXECUTE pr_Update @UserID, @Nominated";
mySqlCom.Parameters.Add("@UserID", SqlDbType.VarChar, 20).Value = UserID;
mySqlCom.Parameters.Add("@Nominated", SqlDbType.Bit).Value = Nominated;

Alternatively, since all you are doing is calling a stored proc, you could do:

mySqlCom.CommandType = CommandType.StoredProcedure ;
mySqlCom.CommandText = "pr_Update"; //no need to specify parameter names
mySqlCom.Parameters.Add("@UserID", SqlDbType.VarChar, 20).Value = UserID;
mySqlCom.Parameters.Add("@Nominated", SqlDbType.Bit).Value = Nominated;

answered Nov 14, 2012 at 15:02

SWeko's user avatar

SWekoSWeko

30.3k9 gold badges71 silver badges105 bronze badges

0

Give only name of stored procedure, as you are adding parameter in statements after this. Also set CommandType.

 mySqlCom.CommandText = "pr_Update";
 mySqlCom.CommandType = CommandType.StoredProcedure;

answered Nov 14, 2012 at 15:03

Adil's user avatar

AdilAdil

146k25 gold badges209 silver badges203 bronze badges

2

You are invoking wrong SQL. You should set the command text of command to pr_Update only:

mySqlCom.CommandText = "pr_Update";

And set type command type to stored procedure:

mySqlCom.CommandType = CommandType.StoredProcedure;

See MSDN page for more.

answered Nov 14, 2012 at 15:06

Karel Frajták's user avatar

Karel FrajtákKarel Frajták

4,3691 gold badge23 silver badges34 bronze badges

2

  • Remove From My Forums
  • Question

  • I am trying to executed this script (see below) using Smo libraries with powershell (this script works in SSMS)

    use master;
    GO
    use master;
    if (not exists(select * from sys.databases where name = ‘dbname’))
        alter database [dbname] set offline with rollback immediate;
    GO

    however, I always got an

    Exception calling «ExecuteNonQuery» with «1» argument(s): «An exception occurred while executing a Transact-SQL statement or batch.»

    if I delete the if statement, the script execute without erros… is there any problem to use if statements?  I would really appreciate any help

    regards.!

    • Edited by

      Wednesday, April 22, 2015 1:47 AM
      forget additional info

Answers

  • Hello,

    Have you run the query in SSMS? If you would have you have gotten an error message like

    because you try to modify a database which does NOT EXISTS, as by your IF condition. This will never work! You may change it to a simple IF EXISTS.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Marked as answer by
      Eric__Zhang
      Monday, May 4, 2015 9:22 AM

Понравилась статья? Поделить с друзьями:
  • Idle report exe ошибка приложения что это
  • Idle report exe ошибка приложения 0xc0000142 при завершении работы
  • Idle report exe ошибка clr 80004005
  • Idle report exe неустранимая ошибка 80004005
  • Id ошибки hostmemorylow важность нефатальная ошибка