Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
1 / 1 / 0
Регистрация: 30.11.2015
Сообщений: 103

Классы, параметризация классов, параметризация запросов

07.06.2018, 14:29. Показов 3552. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток Уважаемые! Помогите пожалуйста с кодом. Суть в чем. Есть класс, в котором есть методы для работы с запросами.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 public static string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
        public static string connectString = "provider=Microsoft.Jet.OLEDB.4.0; data source=" + path.ToString() + "\\BaseIcc.mdb";
         public class NonQuery
        {
            /// <summary>
            /// Обработчик запроса на на добавление/удаление/изменение записей SQL
            /// </summary>
            /// <param name="Query">Текст запроса</param>
            /// <param name="param">Служит для параметризации строки вашего запроса</param>
            public void NQuery(string Query, OleDbParameter param =null) //!!!ВОТ ЗДЕСЬ нужно чтобы параметры создавались
            {
                try
                {
                    OleDbConnection myConnection = new OleDbConnection(connectString);
                    OleDbCommand createCmd = myConnection.CreateCommand();
                    createCmd.CommandText = Query;
                    myConnection.Open();
                    if (param != null)
                    {
                        createCmd.Parameters.Add(param);
                    }
                    createCmd.ExecuteNonQuery();
                    myConnection.Close();
                } catch (Exception e)
                {
                    MessageBox.Show("Ошибка. Изменения не внесены или внесены частично. Скорей всего длина вставляемой строки слишком велика, попробуйте уменьшить ее и повторите попытку \n" + e.ToString());
                }
            }
            /// <summary>
            /// Обработчик запроса на выборку SQL
            /// </summary>
            /// <param name="Query">Текст запроса</param>
            /// <param name="dataGr">Таблица DataGridView</param>
            public void QueryReaderDataLog(string Query, DataGridView dataGr)
            {
                try
                {
                    OleDbConnection myOleDbConnection = new OleDbConnection(connectString);
                    myOleDbConnection.Open();
                    OleDbDataAdapter dAdapter = new OleDbDataAdapter(Query, myOleDbConnection);
                    DataTable dt = new DataTable();
                    dAdapter.Fill(dt);
                    dataGr.DataSource = dt; //выводим 
                }
                catch (Exception e)
                {
                    MessageBox.Show("Ошибка " + e.ToString());
                }
            }
        }
Вопрос в следующем. Метод NQuery, содержит необязательный параметр param, объекта OleDBParameter. Есть ли возможность сделать так, чтобы там была коллекция параметров, т.е. если я например задал значение одному параметру, поставил запятую и у меня создался второй параметр, третий, четвертый и т.д., если не задал параметров, то их нет.
Сам код работает, параметр работает, но вопрос стоит в том, что в дальнейшем нужно будет задавать большее количество параметров в одном запросе и их придется либо вручную вносить в метод, либо они будут создаваться автоматически по мере надобности и хотелось бы узнать, есть ли возможность это реализовать.
Параметр param служит для того, чтобы избавить SQL, от инъекций и прочего кода, который может привести к сбою выполнения запроса, от запрещенных символов, чтобы SQL видел текст, а не получал из какого нибудь textbox символы типа \' ",+- UNION SELECT и прочее....
Спасибо заранее.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.06.2018, 14:29
Ответы с готовыми решениями:

Параметризация поверхностей
Есть в каких-либо САПР возможности параметризации гладких поверхностей, заданных уравнениями произвольного вида? Например, есть...

Параметризация в SolidWorks
Подскажите абсолютному новичку, есть ли в SolidWorks возможность вводить свои параметры, которые не зависят от истории построения модели?...

КОМПАС 3D параметризация
Можете указать на ошибку, почему механизм работает не так, как хотелось бы. Наверное написал не в ту тему, но в тему про компас почему то...

6
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
07.06.2018, 15:04
передавай коллекцию как параметр, или даже лучше словарь - а в нем (в словаре) 1 параметр = 1 значение.
1
1 / 1 / 0
Регистрация: 30.11.2015
Сообщений: 103
07.06.2018, 15:51  [ТС]
Цитата Сообщение от hoolygan Посмотреть сообщение
передавай коллекцию как параметр, или даже лучше словарь - а в нем (в словаре) 1 параметр = 1 значение.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public void NQuery(string Query, OleDbParameter param =null) //!!!ВОТ ЗДЕСЬ нужно чтобы параметры создавались
            {
                try
                {
                    OleDbConnection myConnection = new OleDbConnection(connectString);
                    OleDbCommand createCmd = myConnection.CreateCommand();
                    createCmd.CommandText = Query;
                    myConnection.Open();
                    if (param != null)
                    {
                        createCmd.Parameters.Add(param);
                    }
                    createCmd.ExecuteNonQuery();
                    myConnection.Close();
                } catch (Exception e)
                {
                    MessageBox.Show("Ошибка. Изменения не внесены или внесены частично. Скорей всего длина вставляемой строки слишком велика, попробуйте уменьшить ее и повторите попытку \n" + e.ToString());
                }
            }
Можете на примере этого кода показать, как это можно реализовать, пробовал передавать как коллекцию, но он ругается на меня, когда я ему этот параметр задаю. Буду очень благодарен.
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
07.06.2018, 15:58
Лучший ответ Сообщение было отмечено ЕвгенийКор как решение

Решение

Создаете объект класса Dictionary<string, string> - и используете его как параметр, а внутри своей процедурки раскрываете свой словарь (если не пустой он) - и подставляете
C#
1
2
3
4
5
6
7
8
9
10
Dictionary<string, string> parameters = new Dictionary<string, string>();
            parameters.Add("@Id", "12");
            parameters.Add("@value", "myText");
 
            foreach (KeyValuePair<string, string> item in parameters)
            {
                Console.WriteLine("Параметр - \"{0}\", а его значение - \"{1}\"", item.Key, item.Value);
            }
 
            Console.ReadKey();
А... - параметры запроса не создаются в параметрах процедуры шарповой, они передаются
1
1 / 1 / 0
Регистрация: 30.11.2015
Сообщений: 103
07.06.2018, 19:13  [ТС]
Цитата Сообщение от hoolygan Посмотреть сообщение
А... - параметры запроса не создаются в параметрах процедуры шарповой, они передаются
Я потом передаю параметр в коде, там где надо их передать.

C#
1
public void NQuery(string Query, OleDbParameter [] param =null)
Таким образом пытаюсь создать коллекцию, потом

C#
1
2
3
4
5
6
7
                if (param != null)
                    {
                        for (int j = 0; j < param.Length; j++)
                        {
                            createCmd.Parameters.Add(param[j]);
                        }
                    }
Или это не вариант? При таком раскладе не принимает код, пишет

Ошибка CS1503 Аргумент 2: не удается преобразовать из "System.Data.OleDb.OleDbParameter" в "System.Data.OleDb.OleDbParameter[]". IccMasterPro C:\Users\Админ\Desktop\ICC\IccMasterPro\ IccMasterPro\Form1.cs 131 Активно

Как правильно его звать?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for (int i = 0; i < countArgs; i++)
                    {
   
                        OleDbParameter paramInputText = new OleDbParameter("@TextOnRich", OleDbType.VarChar, 200); //создаю новый параметр
                        string inputTextInRichTextBox = richTextBox1.Lines[i].ToString();//Получаю строку richTextBox
                        string inputTextInSessionBox = sessionBox.Text.ToString();//Получаю строку textBox
                        paramInputText.Value = inputTextInRichTextBox;//задаю значение параметра
                        query.NQuery("INSERT INTO Icc (icc,[session],[date]) VALUES(@TextOnRich,"+sessionBox.Text.ToString()+",'"+ thisDay.ToString("d")+"')", paramInputText);// именно тут начинает ругаться
                        progressBar1.Value = i;
                        progressBar1.Update();
                        Invoke(new Action(() => lblIcc.Text = richTextBox1.Lines[i].ToString()));
                        Invoke(new Action(() => lblIcc.Update()));
                        Invoke(new Action(() => labelProgress.Text = Math.Round((((i+1)/progressInPercent)*10000),2).ToString()+" %"));
                        Invoke(new Action(() => labelProgress.Update()));
                        Thread.Sleep(20);
                    }
Скриншот во вложении. С библиотеками как то сложно, разве нельзя иначе?
Миниатюры
Классы, параметризация классов, параметризация запросов  
0
1 / 1 / 0
Регистрация: 30.11.2015
Сообщений: 103
07.06.2018, 19:19  [ТС]
Либо же такое.
Миниатюры
Классы, параметризация классов, параметризация запросов  
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
08.06.2018, 08:39
ЕвгенийКор, Вы очень сильно заморачиваетесь с типами параметров. И обязательно хотите, чтобы передавались параметры, да еще и того типа, что нужны. Абстрагируйтесь, отвлечитесь от передачи параметров как параметров, передавайте строки, объекты. Я всего лишь дал наводку, в какую сторону думать, а не конкретную реализацию.
И из того, что увидел в коде - там всё сильно захардкожено под конкретную реализацию конкретного запроса. Передача же параметров и строки запроса в виде набора строк - создаст единый метод для всех нужд практически.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.06.2018, 08:39
Помогаю со студенческими работами здесь

Параметризация кривой
Цилиндр {x}^{2}+{y}^{2}={R}^{2} пересекается плоскостью. ax+by+cz+d=0. Правильна ли будет такая параметризация: x=Rcost; y=Rsint;...

Параметризация поверхности
Подскажите, как можно параметризовать поверхность z=H(x^2+y^2) Подойдет ли : x = r*cos(f) y = r*sin(f) z = z*H ?

Параметризация запроса в Oracle на примере
Есть например таблица finally_result sportsmen score ---------------------- Jim 10 Ten 12 Helen 7...

Параметризация для интерфейса Comparable
Здравствуйте. Есть класс class Mark implements Comparable&lt;Mark&gt;{ double X = 0.0, Y = 0.0; Mark (double X, double Y){ ...

Параметризация шаблона значением, а не типом (а-ля С++)
Привет, с прошедшим вас:) Незнаю Java поэтому решил заполнить этот пробел в знаниях. Понятно, что надо читать книги, но пока некогда. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru