Страница 1 из 1

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

СообщениеДобавлено: 28 окт 2009, 21:10
Vladislav_133
Это ответы на конкретные вопросы, конкретных студентов. Поэтому пишу конспективно.

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

Соединение с сервером.
Привожу пример очищенного рабочего кода.
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() .

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

СообщениеДобавлено: 28 окт 2009, 21:24
Vladislav_133
Часть вторая.

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

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.

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

СообщениеДобавлено: 28 окт 2009, 21:32
Vladislav_133
Часть третья.
Параметры.

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

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

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

Ну, пока все.
Задаайте конретные вопрос.

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

СообщениеДобавлено: 08 дек 2009, 13:53
БорАл
Как глобально открыть КОННЕКТ к базе данных из клиента на GUI, чтобы он работал постоянно.

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

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

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

СообщениеДобавлено: 08 дек 2009, 15:14
xdsl
Не моя область, конечно, но разве GUI-программа на дотнете не имеет события, которое возникает сразу после старта программа (создания приложения, создания окна и т.п.) и еще одного события - непосредственно перед завершением программы? Или, по старинке, нельзя внести участок кода первым и соответственно последним операторами в функцию main()?

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

СообщениеДобавлено: 08 дек 2009, 23:40
Vladislav_133
БорАл писал(а):Как глобально открыть КОННЕКТ к базе данных из клиента на GUI, чтобы он работал постоянно.

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

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


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

Я думаю, что xdsl тоже понял вопрос. А события, конечно, есть.

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

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

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

СообщениеДобавлено: 17 дек 2009, 11:37
БорАл
Здравствуйте!

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

Один раз получилось, форма выдала нам сообщение, что объект описан неправильно. А в дочерней форме необходимые данные используются нормально без проблем.

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

СообщениеДобавлено: 17 дек 2009, 11:39
БорАл
Еще точнее, чнужно сделать так, чтобы можно было обмениваться данными между формами

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

СообщениеДобавлено: 17 дек 2009, 12:31
xdsl
Последние два вопроса относятся ADO.NET? или к .NET? Или ни к тому, ни к другому отношения не имеют? Вообщем, код в студию.

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

СообщениеДобавлено: 18 дек 2009, 10:20
Vladislav_133
Есть два основных подхода. Красивый и не красивый. Красивый - при создании формы ей передается объект или объекты, точнее указатели на них. Не красивый - через глобальные переменные. Первый подход, конечно, предпочтительней.
Вчера мы с ребятами этот вопрос обсуждали. Остановились на красивом подходе.

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

СообщениеДобавлено: 02 апр 2010, 09:50
БорАл
Доброго времени суток.

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

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

Есть ли что-то подобное в TreeView?

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

СообщениеДобавлено: 05 апр 2010, 11:15
БорАл
Таки не нашел, однако

Что такое DataReader? Можно ли в считывателе обращаться к элементам, как к двумерному массиву?

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

СообщениеДобавлено: 05 апр 2010, 11:51
Vladislav_133
Разберусь - сообщу. Пока не было времени.

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

СообщениеДобавлено: 05 апр 2010, 14:44
Vladislav_133
Чего-то никак ваши вопросы не пойму до конца.
Для того, чтобы добавить узел используется стандартная комбинация

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

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

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

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

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

Ага пропустил дополнительный вопрос, насчет двумерного массива. Попытаюсь разобраться.

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

СообщениеДобавлено: 05 апр 2010, 17:13
Vladislav_133
Насчет двумерного массива вы как-то меня запутали. Речь ведь идет о курсоре, т.е. таблице, а таблица может быть предствлен двумерным массивом.

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

СообщениеДобавлено: 10 апр 2010, 10:01
БорАл
Будет ли работать следующий подход:

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

?

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

СообщениеДобавлено: 10 апр 2010, 12:56
Vladislav_133
А попробоать нельзя?
Я вам се время пытаюсь втолковать одну истину - программирование это эксперимент. Что пользы, если я скажу, что на первый взгляд все должно работать. Ну для пущей важности возьмите три соединения, хотя,конечно, это уже перебор. И одного достаточно. Я уловил, с какой проблемой вы мучаетесь и уже советовал, что логичнее было бы заполнять уровень ветки, при щелчке по ней. На мой взгляд это способ наиболее логичный, когда работаешь с деревьями.
1. Это быстро, так как не требует заполнения сразу всего дерева.
2. Это эффективно, так как данные будут меняться динамически. Ведь речь идет о работе в многопользоательском режиме.