Некоторы особености ADO.NET

MySQL, PostgreSQL, MSSQL, Oracle и т.д. Диалекты SQL, формирование запросов, хранимые процедуры, тригерры, транзакции и многое другое

Некоторы особености ADO.NET

Сообщение Vladislav_133 28 окт 2009, 21:10

Это ответы на конкретные вопросы, конкретных студентов. Поэтому пишу конспективно.

Часть первая.

Соединение с сервером.
Привожу пример очищенного рабочего кода.
SqlConnection con = new SqlConnection();

con.ConnectionString = "server=" + server.Trim() + ";database=kotel;User Id=" + user.Trim() + ";Password=" + password.Trim() + ";";
Здесь server, user, password – переменные, содержащие имя сервер, имя пользователя и пароль пользователя.

con.Open();

открыли соединение, теперь можно использовать
переменную con как идентификатор соединения.
Но эта технолгия относится только к SQL серверу.
Если вы собираетесь использовать более универальный механизм,
То вместо класса SqlConnection, используете например класс OdbcConnection, или OleDbConnection.

В конце соединение закрываем.
Con.Close() .
Последний раз редактировалось Vladislav_133 28 окт 2009, 21:33, всего редактировалось 1 раз.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Некоторы особености ADO.NET

Сообщение Vladislav_133 28 окт 2009, 21:24

Часть вторая.

Выполнение хранимых процедур без параметров.
Процедура не содержит парааметров и выдает данные (таблицу).

SqlCommand sc = new SqlCommand();
sc.Connection = con;
sc.CommandType = CommandType.StoredProcedure;
sc.CommandText = "get_spr_obl"; //имя процедуры
SqlDataReader dr; // класс, получающий результат выполнения.
dr = sc.ExecuteReader(); // выполнили и получили данные.
Теперь как их вытащить в прорамму
//цикл идет по всему набору данных
while (dr.Read())
{
//содержатся данные массиве (курсоре) dr
//например dr[“name”] – доступ к столбцу name и т.д.
}
Далее обязательно закрываем курсор
dr.close().
Если вы хотите использовать более общую технологию, то меняем , например,
SqCommand на OdbcCommann, SqlDataReader на OdbcDataReader.
Если процедура ничего не возвращает, то вместо ExecuteReader используем
ExecuteNonQuery.
Последний раз редактировалось Vladislav_133 28 окт 2009, 21:34, всего редактировалось 1 раз.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Некоторы особености ADO.NET

Сообщение Vladislav_133 28 окт 2009, 21:32

Часть третья.
Параметры.

SqlParameter p1 = new SqlParameter();
p1.ParameterName = "@id"; //имя пааметра в хранимой процедуре
p1.SqlDbType = SqlDbType.BigInt; //тип
p1.Direction = ParameterDirection.Input; //параметр - значение
p1.Value = значение
sc.Parameters.Add(p1); //параметр добавили к запросу

нужен второй параметр, проделываем тоже самое еще раз и т.д.

Опять же, при переходе к другой технооги меняем соответствующие классы.

Ну, пока все.
Задаайте конретные вопрос.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Некоторы особености ADO.NET

Сообщение БорАл 08 дек 2009, 13:53

Как глобально открыть КОННЕКТ к базе данных из клиента на GUI, чтобы он работал постоянно.

В частности в C#. Приходится каждый раз при том или ином событии на форме присоединяться к базе и отсоединяться. То есть открыл соединение, провел какие-либо манипуляции с данными, закрыл.

Может быть можно сделать это глобально, чтоыб не бегать "туда-сюда". Подскажите.
Ubuntu Linux 10.04 LTS Netbook Edition; Ubuntu Linux 11.04 Desktop
БорАл
 
Сообщения: 58
Зарегистрирован: 11 ноя 2009, 14:37
Откуда: Из небытия
Полное имя: Алексей aka x_Fafnir_x

Re: Некоторы особености ADO.NET

Сообщение xdsl 08 дек 2009, 15:14

Не моя область, конечно, но разве GUI-программа на дотнете не имеет события, которое возникает сразу после старта программа (создания приложения, создания окна и т.п.) и еще одного события - непосредственно перед завершением программы? Или, по старинке, нельзя внести участок кода первым и соответственно последним операторами в функцию main()?
xdsl
 
Сообщения: 1236
Зарегистрирован: 09 дек 2008, 05:16
Откуда: ВЦ ШГПИ
Полное имя: Слинкин Д.А.

Re: Некоторы особености ADO.NET

Сообщение Vladislav_133 08 дек 2009, 23:40

БорАл писал(а):Как глобально открыть КОННЕКТ к базе данных из клиента на GUI, чтобы он работал постоянно.

В частности в C#. Приходится каждый раз при том или ином событии на форме присоединяться к базе и отсоединяться. То есть открыл соединение, провел какие-либо манипуляции с данными, закрыл.

Может быть можно сделать это глобально, чтоыб не бегать "туда-сюда". Подскажите.


Вы не точно сформулировали вопрос. Я вам скажу, что на самом деле вы спрашиваете. Как в C# создать глобальную переменную?
Так ведь? Вы просто хотите хранить идентификатор соединения.
Можно использовать статический класс, например. Или статическую переменную, в каком-либо классе.

Я думаю, что xdsl тоже понял вопрос. А события, конечно, есть.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Некоторы особености ADO.NET

Сообщение xdsl 09 дек 2009, 09:49

Vladislav_133 писал(а):Я думаю, что xdsl тоже понял вопрос.
В голову даже не пришло, что причина - в незнании способов определения глобальных переменных. Вопрос я понял следующим образом: "Пишу код в обработчиках нажатий на кнопки. В каждом обработчике 1.открываю соединение, 2.работаю с базой, 3.закрываю соединение. Устал от тормозов соединений-разъединений, хочу п.1 вынести в начало программы, п.3 - в конец программы".
Дотнет - не мой профиль, поэтому вместо ответа задал встречный вопрос типа "В других системах это делается так-то и так-то, есть-ли такие возможности в дотнет?"
xdsl
 
Сообщения: 1236
Зарегистрирован: 09 дек 2008, 05:16
Откуда: ВЦ ШГПИ
Полное имя: Слинкин Д.А.

Re: Некоторы особености ADO.NET

Сообщение БорАл 17 дек 2009, 11:37

Здравствуйте!

Возникла такая проблема. Нужно из дочерней формы передать значения в основную.

Один раз получилось, форма выдала нам сообщение, что объект описан неправильно. А в дочерней форме необходимые данные используются нормально без проблем.
Ubuntu Linux 10.04 LTS Netbook Edition; Ubuntu Linux 11.04 Desktop
БорАл
 
Сообщения: 58
Зарегистрирован: 11 ноя 2009, 14:37
Откуда: Из небытия
Полное имя: Алексей aka x_Fafnir_x

Re: Некоторы особености ADO.NET

Сообщение БорАл 17 дек 2009, 11:39

Еще точнее, чнужно сделать так, чтобы можно было обмениваться данными между формами
Ubuntu Linux 10.04 LTS Netbook Edition; Ubuntu Linux 11.04 Desktop
БорАл
 
Сообщения: 58
Зарегистрирован: 11 ноя 2009, 14:37
Откуда: Из небытия
Полное имя: Алексей aka x_Fafnir_x

Re: Некоторы особености ADO.NET

Сообщение xdsl 17 дек 2009, 12:31

Последние два вопроса относятся ADO.NET? или к .NET? Или ни к тому, ни к другому отношения не имеют? Вообщем, код в студию.
xdsl
 
Сообщения: 1236
Зарегистрирован: 09 дек 2008, 05:16
Откуда: ВЦ ШГПИ
Полное имя: Слинкин Д.А.

Re: Некоторы особености ADO.NET

Сообщение Vladislav_133 18 дек 2009, 10:20

Есть два основных подхода. Красивый и не красивый. Красивый - при создании формы ей передается объект или объекты, точнее указатели на них. Не красивый - через глобальные переменные. Первый подход, конечно, предпочтительней.
Вчера мы с ребятами этот вопрос обсуждали. Остановились на красивом подходе.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Некоторы особености ADO.NET

Сообщение БорАл 02 апр 2010, 09:50

Доброго времени суток.

Есть ли в .Net в таком объекте как TreeView механизированные методы добавления строк?

В listbox есть свойства - DataSource, DisplayMember и ValueMamber. С помощью которых можно автоматизировать добавление строк из базы данных.

Есть ли что-то подобное в TreeView?
Ubuntu Linux 10.04 LTS Netbook Edition; Ubuntu Linux 11.04 Desktop
БорАл
 
Сообщения: 58
Зарегистрирован: 11 ноя 2009, 14:37
Откуда: Из небытия
Полное имя: Алексей aka x_Fafnir_x

Re: Некоторы особености ADO.NET

Сообщение БорАл 05 апр 2010, 11:15

Таки не нашел, однако

Что такое DataReader? Можно ли в считывателе обращаться к элементам, как к двумерному массиву?
Ubuntu Linux 10.04 LTS Netbook Edition; Ubuntu Linux 11.04 Desktop
БорАл
 
Сообщения: 58
Зарегистрирован: 11 ноя 2009, 14:37
Откуда: Из небытия
Полное имя: Алексей aka x_Fafnir_x

Re: Некоторы особености ADO.NET

Сообщение Vladislav_133 05 апр 2010, 11:51

Разберусь - сообщу. Пока не было времени.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Некоторы особености ADO.NET

Сообщение Vladislav_133 05 апр 2010, 14:44

Чего-то никак ваши вопросы не пойму до конца.
Для того, чтобы добавить узел используется стандартная комбинация

TreeNode newNode = new TreeNode("Text for new node");
treeView1.SelectedNode.Nodes.Add(newNode);

добавка узла внутрь выбранного.

Что вам здесь не ясно. Если вы хотите все оптом добавлять, то тогда скажите, какова, по-вашему должна быть
исходная структура. Ведь она должна иметь деревообразную форму. Разве не так? В любом случае проще
добавлять так, как я указал.

datareader - странно, а разве вы им не пользуетесь постоянно. Это объект для получения данных из некоторого источника. Вы получаете эти данные путем выполнения запроса.

Если я не ответил на ваши вопросы, постарайтесь их сформулировать более ясно.

Ага пропустил дополнительный вопрос, насчет двумерного массива. Попытаюсь разобраться.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Некоторы особености ADO.NET

Сообщение Vladislav_133 05 апр 2010, 17:13

Насчет двумерного массива вы как-то меня запутали. Речь ведь идет о курсоре, т.е. таблице, а таблица может быть предствлен двумерным массивом.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Некоторы особености ADO.NET

Сообщение БорАл 10 апр 2010, 10:01

Будет ли работать следующий подход:

While(rdr1.Read())
{
......
while(rdr2.Read())
{
........
while(rdr3.Read())
{
............
}
}
}

?
Ubuntu Linux 10.04 LTS Netbook Edition; Ubuntu Linux 11.04 Desktop
БорАл
 
Сообщения: 58
Зарегистрирован: 11 ноя 2009, 14:37
Откуда: Из небытия
Полное имя: Алексей aka x_Fafnir_x

Re: Некоторы особености ADO.NET

Сообщение Vladislav_133 10 апр 2010, 12:56

А попробоать нельзя?
Я вам се время пытаюсь втолковать одну истину - программирование это эксперимент. Что пользы, если я скажу, что на первый взгляд все должно работать. Ну для пущей важности возьмите три соединения, хотя,конечно, это уже перебор. И одного достаточно. Я уловил, с какой проблемой вы мучаетесь и уже советовал, что логичнее было бы заполнять уровень ветки, при щелчке по ней. На мой взгляд это способ наиболее логичный, когда работаешь с деревьями.
1. Это быстро, так как не требует заполнения сразу всего дерева.
2. Это эффективно, так как данные будут меняться динамически. Ведь речь идет о работе в многопользоательском режиме.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0