powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вставлять данные в SQL помощью через параметры
18 сообщений из 18, страница 1 из 1
Вставлять данные в SQL помощью через параметры
    #37999009
Lexx_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
У меня была проблема со вставкой некоторых символов в БД через SQL запрос:
например: INSERT INTO T (Name) VALUES ('3Ø 380V')
в таблице будет значение: 3O 380V
т.е. заменяет знак Ø на O.

На ветке форума Microsoft SQL Server мне посоветовали:
"Приложение должно передавать данные только через параметры
INSERT dbo.MyTable (Name) VALUES (@Name)
И в приложении задать парметр @Name (SqlParameter)"

А в каком месте задавать и присваивать параметры? У меня в общем виде переменная вставляется в цикле:

Dim conn As Object = CreateObject("ADODB.Connection")
conn.Open("Provider=SQLOLEDB;" + ConnectionString)
...
Dim Ins_Name as String
Do While...
Ins_Name="3Ø 380V"
...
StrSQL = "INSERT INTO T (Name) Values ('"+Ins_Name+"')"
conn.Execute(StrSQL)
Loop

Спасибо.
...
Рейтинг: 0 / 0
Вставлять данные в SQL помощью через параметры
    #37999037
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lexx_SQL,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
String comm = "...."; // Название хранимой процедуры или если через клиент то написать в скобках sql запрос

 using (SqlConnection sqlConn = new SqlConnection(conn))
            {
                SqlCommand cmd = new SqlCommand(comm, sqlConn);
                cmd.CommandType = CommandType.StoredProcedure; // Или Текст
                cmd.Parameters.Add("@name", TextBox1.Text);
                cmd.Parameters.Add("@text", TextBox2.Text);
.....
                SqlParameter name = new SqlParameter("@name", SqlDbType.NVarChar, 100);
                SqlParameter text = new SqlParameter("@text", SqlDbType.NVarChar, -1);
.....
                sqlConn.Open();
                cmd.ExecuteNonQuery();
                sqlConn.Close();
            }
...
Рейтинг: 0 / 0
Вставлять данные в SQL помощью через параметры
    #37999067
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Lexx_SQL, обратите внимание!

VIT2708
Код: c#
1.
SqlParameter text = new SqlParameter("@text", SqlDbType.NVarChar, -1);
...
Рейтинг: 0 / 0
Вставлять данные в SQL помощью через параметры
    #37999076
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Lexx_SQL, обратите внимание!

VIT2708
Код: c#
1.
SqlParameter text = new SqlParameter("@text", SqlDbType.NVarChar, -1);



Это кусок моего рабочего кода. А что не так?
...
Рейтинг: 0 / 0
Вставлять данные в SQL помощью через параметры
    #37999161
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
VIT2708Cat2Lexx_SQL, обратите внимание!

пропущено...


Это кусок моего рабочего кода. А что не так?
Как раз все правильно, если надо использовать всякие символы
...
Рейтинг: 0 / 0
Вставлять данные в SQL помощью через параметры
    #37999189
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VIT2708
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
using (SqlConnection sqlConn = new SqlConnection(conn))
{
    cmd.Parameters.Add("@name", TextBox1.Text);
    cmd.Parameters.Add("@text", TextBox2.Text);
.....
    SqlParameter name = new SqlParameter("@name", SqlDbType.NVarChar, 100);
    SqlParameter text = new SqlParameter("@text", SqlDbType.NVarChar, -1);
.....
}


Метод Add() помечен как obsolete. Лучше использовать AddWithValue().

Не понял зачем ты два раза параметры создаешь. Это просто для примера?

VIT2708
Код: c#
1.
2.
                sqlConn.Close();
            }


Явно лишняя операция. using() это сделает и так.
...
Рейтинг: 0 / 0
Вставлять данные в SQL помощью через параметры
    #37999192
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lexx_SQL, непонятно почему ты используешь COM объекты в ADO, а не родные классы из System.Data.SqlClient. Также удивляет что ты делаешь запросы к БД в цикле. Постарайся объединить их в единый батч для улучшения производительности.

Пример с параметрами тебе уже привели. Еще один аргумент в их пользу это защита от SQL Injection атак.
...
Рейтинг: 0 / 0
Вставлять данные в SQL помощью через параметры
    #37999203
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazileПостарайся объединить их в единый батч для улучшения производительности.
Вдогонку. Пример релизации пакетного выполнения с помощью SqlCommand - http://stackoverflow.com/a/6409182
...
Рейтинг: 0 / 0
Вставлять данные в SQL помощью через параметры
    #37999264
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
bazilebazileПостарайся объединить их в единый батч для улучшения производительности.
Вдогонку. Пример релизации пакетного выполнения с помощью SqlCommand - http://stackoverflow.com/a/6409182
Два примера быдлокода.

В первом нет транзакции, во втором- три временные таблицы
...
Рейтинг: 0 / 0
Вставлять данные в SQL помощью через параметры
    #37999274
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Два примера быдлокода. В первом нет транзакции, во втором- три временные таблицы
В коде ТС транзакции тоже нет. При необходимости добавить ее не составит проблемы.

Второй пример я даже не смотрел. Рекомендация касается только первого примера.
...
Рейтинг: 0 / 0
Вставлять данные в SQL помощью через параметры
    #37999633
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
bazileВ коде ТС транзакции тоже нет
Единичный запрос и так в транзакции выполняется
...
Рейтинг: 0 / 0
Вставлять данные в SQL помощью через параметры
    #38000209
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazileVIT2708
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
using (SqlConnection sqlConn = new SqlConnection(conn))
{
    cmd.Parameters.Add("@name", TextBox1.Text);
    cmd.Parameters.Add("@text", TextBox2.Text);
.....
    SqlParameter name = new SqlParameter("@name", SqlDbType.NVarChar, 100);
    SqlParameter text = new SqlParameter("@text", SqlDbType.NVarChar, -1);
.....
}


Метод Add() помечен как obsolete. Лучше использовать AddWithValue().

Не понял зачем ты два раза параметры создаешь. Это просто для примера?

VIT2708
Код: c#
1.
2.
                sqlConn.Close();
            }


Явно лишняя операция. using() это сделает и так.

Это просто примеры!!!!!! дальше кому как нравится
...
Рейтинг: 0 / 0
Вставлять данные в SQL помощью через параметры
    #38001071
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
bazileЯвно лишняя операция. using() это сделает и так.
Что за мода везде using пихать?
Зачем он нужен в данном случае?
Закрыть коннект?
...
Рейтинг: 0 / 0
Вставлять данные в SQL помощью через параметры
    #38001227
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Что за мода везде using пихать?
Не знаю, я за модой как-то не слежу.

Cat2Зачем он нужен в данном случае? Закрыть коннект?
Закрыть соединение и вернуть его в пул.
...
Рейтинг: 0 / 0
Вставлять данные в SQL помощью через параметры
    #38001335
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
bazileCat2Что за мода везде using пихать?
Не знаю, я за модой как-то не слежу.

Cat2Зачем он нужен в данном случае? Закрыть коннект?
Закрыть соединение и вернуть его в пул.
Это сделается и после connection.Close()
Смысл Using в данном случае?
...
Рейтинг: 0 / 0
Вставлять данные в SQL помощью через параметры
    #38001443
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2, при использовании using компилятор также сгенерирует try/finally блок чтобы гарантировать (есть исключение, см. ниже) вызов IDisposable.Dispose() даже в случае исключения.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
using (ResourceType resource = expression) statement

//заменяется на:

{
    ResourceType resource = expression;
    try {
        statement;
    }
    finally {
        ((IDisposable)resource).Dispose();
    }
}


Разумеется это можно и самому написать, но чаще всего запись с using будет короче.

Также следует помнить что использование object initializer-ов может совместно с using() { } может привести к не-исполнению IDisposable.Dispose(), если setter может возбудить исключение. В таком случае нужно, например, перенести инициализацию полей внутрь using() {}.
...
Рейтинг: 0 / 0
Вставлять данные в SQL помощью через параметры
    #38003161
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
bazile,

Я это все знаю
Я никого и ни в чем не обвиняю, мне просто хочется разобраться.

В данном конкретном случае (см.пример в топике) using
освобождает память от коннекта. А зачем? Что, он много памяти занимает?
После этого каждый раз при обращении к базе нужно заново создавать коннект. Смысл? Я предпочитаю иметь один коннект на все приложение. Даже если его закрыть, то потом он быстрее из пула вибирается. Хотя про быстрее - спорно. Не очень большой я в этом специалист.
...
Рейтинг: 0 / 0
Вставлять данные в SQL помощью через параметры
    #38003228
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Я это все знаю
...
using освобождает память от коннекта. А зачем? Что, он много памяти занимает?
Плохо знаешь раз считаешь, что using освобождает память. Предназначение using это вызов IDisposable.Dispose(). Освобождает память только сборщик мусора.

Соединение с БД это не только участок памяти под объект, но и системные объекты ОС для сокетов, TCP/IP (или другое) соединение, служебные данные на стороне БД и т.п.. Идея в том что соединение с БД (имея в виду сетевую СУБД) является ценным разделяемым ресурсом нужное многим. Соединений с БД можно создать ограниченное кол-во. Поэтому правилом хорошего тона считается использование соединения с БД (и других подобных ресурсов) как можно более короткими интервалами (Acquire Late, Release Early).

Cat2После этого каждый раз при обращении к базе нужно заново создавать коннект. Смысл?
Улучшение масштабируемости приложения. Выделение памяти в .NET является дешевой операцией. Кроме того при использовании пула соединений мы тратим время только на создание нового объекта SqlConnection, но не на установление соединения с БД (что является потенциально медленной операцией).

Cat2Я предпочитаю иметь один коннект на все приложение. Даже если его закрыть, то потом он быстрее из пула вибирается. Хотя про быстрее - спорно. Не очень большой я в этом специалист.
Да пожалуйста. Разные ситуации требуют разных решений. В случае desktop приложений единый коннект с БД имеет право на существование, а в случае веб это порочная практика. Главное выбирать решение не потому, что "мне кажется что так будет лучше", а проверить и убедиться, что это в самом деле так.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вставлять данные в SQL помощью через параметры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]