Делаю 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.4k5 золотых знаков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.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
-
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
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();
}
}
Помогите пожалуйста, заранее спасибо))
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
258k69 gold badges494 silver badges490 bronze badges
asked Nov 14, 2012 at 15:01
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 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
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
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á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;
GOhowever, 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
-
Edited by
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
-
Marked as answer by