Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вызвать DataSet из другой функции 
:(
    Опции темы
RedButterfly
Дата 23.9.2008, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Учусь
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 4.7.2005
Где: Уфа->Москва

Репутация: нет
Всего: нет



добрый вечер smile

у меня есть в классе метод, который загружает данные из таблицы в ДатаСет: (она работает smile )

Код

        private System.Data.SqlClient.SqlDataAdapter dataAdapterProjects;

        private System.Data.DataSet dataSetProjects = new System.Data.DataSet();

public void LoadDB()
        {
         
            try
            {
                dataSetProjects.Tables.Add(dataTableProjects);
                sqlConnectionApp = new SqlConnection();
                sqlConnectionApp.ConnectionString = CreateConn(connServer);
                sqlConnectionApp.Open();
                selectValueCommand = new SqlCommand("SELECT ID, Name, Description FROM Projects;", sqlConnectionApp);
                dataAdapterProjects = new SqlDataAdapter(selectValueCommand.CommandText, sqlConnectionApp);
                dataAdapterProjects.Fill(dataSetProjects);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                sqlConnectionApp.Close();
            }
        }


а в другом методе мне нужно из ДатаСета получить строку:
предварительно делаю 
LoadDB();

Код

public Funktion(char c)
{
//***
}

внутри этого метода датасет я вижу, но, так как ничего из него не получается вытащить, то думаю, что он пустой... или ещё что-нибудь с ним произошло

как в "чужих" методах получают данные из ДатаСета?

в форуме не нашла ответа на свой вопрос...

PM MAIL ICQ Skype   Вверх
RedButterfly
Дата 23.9.2008, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Учусь
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 4.7.2005
Где: Уфа->Москва

Репутация: нет
Всего: нет



smile 

Это сообщение отредактировал(а) RedButterfly - 23.9.2008, 13:49
PM MAIL ICQ Skype   Вверх
RedButterfly
Дата 24.9.2008, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Учусь
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 4.7.2005
Где: Уфа->Москва

Репутация: нет
Всего: нет



ошибку нашла smile оказалось, что я пыталась  данные из датасета вытащить после return ...

вот такой перебор есть: 
Код

int numberOfLine = -1;      // номер строки

                for (f = 0; f < dataSetProjects.Tables["Projects"].Rows.Count; f++)
                    for (ff = 0; ff < dataSetProjects.Tables["Projects"].Columns.Count; ff++)
                    {
                        if (dataSetProjects.Tables["Projects"].Rows[f][ff].ToString() == i.ToString())
                        {
                            Console.WriteLine("значение " + dataSetProjects.Tables["Projects"].Rows[f][ff].ToString());

                            Console.WriteLine("f = " + f + " ff= " + ff);
                            numberOfLine = f;
                        }
                    }
                Console.WriteLine("Номер строки = " + numberOfLine);      


такой перебор не есть хорошо , говорят...

а есть другие методы , с помощью которых можно в таблице базы данных/ таблице датасета выполнить поиск определенного значения/строки более эффективным и красивым способом?

если таблица маленькая - такой перебор пойдет конечно...а если в неё положить миллион записей?....




Это сообщение отредактировал(а) RedButterfly - 24.9.2008, 08:02
PM MAIL ICQ Skype   Вверх
Idsa
Дата 24.9.2008, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(RedButterfly @  24.9.2008,  12:01 Найти цитируемый пост)
а есть другие методы , с помощью которых можно в таблице базы данных/ таблице датасета выполнить поиск определенного значения/строки более эффективным и красивым способом?

Красивее использовать либо DataTable.Rows.Find (ищет только по Primary Key), либо DataTable.DefaultView.Find. Подробнее - здесь: http://www.akadia.com/services/dotnet_find_methods.html
Оба вышеописанных способа также перебирают строки и не являются более эффективными. Для повышения производительности стоит считывать только те данные, которые нужны (указывая условия отбора в SQL-запросе).


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
RedButterfly
Дата 24.9.2008, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Учусь
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 4.7.2005
Где: Уфа->Москва

Репутация: нет
Всего: нет



семь пятниц на неделе :(

счас требуют, чтобы поиск производился на стороне сервера  smile  то есть надо будет создать индекс, написать курсор и т.д. ... 

плохо когда ТЗ меняется так часто...

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

небезопасно? и не нравится мне идея с надолго_открытым соединением :(

нашла более красивый метод перебора чтоли:

ссылка

но у меня вот в этом коде 
Код

               System.Data.DataRow[] rowFound = dataSetProjects.Tables["Projects"].Select("ID = " + i);//new System.Data.DataRow();
                for (int t = 0; t < rowFound.Length; t++)
                { Console.WriteLine(rowFound[t].ToString()); }
 

выводится "System.Data.DataRow"
)))

разбираюсь....

Добавлено через 22 секунды
спасибо за ссылку smile

Добавлено через 1 минуту и 18 секунд
в мсдн есть такой пример

Код

string filterExp = "Status = 'Active'";
string sortExp = "City";
System.Data.DataRow[] drarray = dataSet1.Customers.
    Select(filterExp, sortExp, System.Data.DataViewRowState.CurrentRows);

for (int i=0; i < drarray.Length; i++)
{
    listBox1.Items.Add(drarray[i]["City"].ToString());
}



Добавлено через 6 минут и 36 секунд
вот так заработало smile
Код

System.Data.DataRow[] rowFound = dataSetProjects.Tables["Projects"].Select("ID = " + i);
                for (int t = 0; t < rowFound.Length; t++)
                { 
                    Console.WriteLine(rowFound[t]["ID"].ToString());
                    Console.WriteLine(rowFound[t]["Name"].ToString());
                    Console.WriteLine(rowFound[t]["Description"].ToString());
                }

PM MAIL ICQ Skype   Вверх
RedButterfly
Дата 24.9.2008, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Учусь
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 4.7.2005
Где: Уфа->Москва

Репутация: нет
Всего: нет



хорошо, что хотя бы Idsa написал, а то сижу и общаюсь сама с собой чтоли.... smile
PM MAIL ICQ Skype   Вверх
MasterOfCode
Дата 24.9.2008, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: 4
Всего: 27



Цитата(RedButterfly @  24.9.2008,  11:33 Найти цитируемый пост)
и ваще хотят, чтобы при запуске программы соединение открылось и потом оно закрылось только при закрытии программы..типа чтобы 150 раз не открывать и не закрывать....но это же 

небезопасно? и не нравится мне идея с надолго_открытым соединением :(


Немного засоришь сеть. + тебе придется перед каждым запросом к базе проверять соединение, если разрыв, то переподключится.

У меня знакомые писали программу, которая постоянно держала соединение открытым, а все программы слали запросы через нее. Но там была причина, т.к. Была купленна ограниченая лицензия на Oracle, с поддержкой максимум 10 соединений, а пользователей было несколько сотен. smile


--------------------
user posted image
PM ICQ   Вверх
Idsa
Дата 24.9.2008, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(MasterOfCode @  24.9.2008,  17:25 Найти цитируемый пост)
Была купленна ограниченая лицензия на Oracle, с поддержкой максимум 10 соединений, а пользователей было несколько сотен. smile 

Интересный workaround smile

Цитата(RedButterfly @  24.9.2008,  13:33 Найти цитируемый пост)
и ваще хотят, чтобы при запуске программы соединение открылось и потом оно закрылось только при закрытии программы..типа чтобы 150 раз не открывать и не закрывать....но это же 

небезопасно? и не нравится мне идея с надолго_открытым соединением :(

Все зависит от специфики приложения. Но в общем случае лучше не держать открытое соединение, а открывать/закрывать (при этом благодаря Connection Pool физическое соединение, как правило, будет создаваться только один раз).


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
MasterOfCode
Дата 24.9.2008, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: 4
Всего: 27



Цитата(Idsa @  24.9.2008,  15:48 Найти цитируемый пост)
благодаря Connection Pool физическое соединение, как правило, будет создаваться только один раз

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

Добавлено через 1 минуту
Цитата(Idsa @  24.9.2008,  15:48 Найти цитируемый пост)
Интересный workaround 

Дешево и сердито smile


--------------------
user posted image
PM ICQ   Вверх
RedButterfly
Дата 24.9.2008, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Учусь
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 4.7.2005
Где: Уфа->Москва

Репутация: нет
Всего: нет



Цитата(Idsa @ 24.9.2008,  15:48)
Цитата(MasterOfCode @  24.9.2008,  17:25 Найти цитируемый пост)
Была купленна ограниченая лицензия на Oracle, с поддержкой максимум 10 соединений, а пользователей было несколько сотен. smile 

Интересный workaround smile

Цитата(RedButterfly @  24.9.2008,  13:33 Найти цитируемый пост)
и ваще хотят, чтобы при запуске программы соединение открылось и потом оно закрылось только при закрытии программы..типа чтобы 150 раз не открывать и не закрывать....но это же 

небезопасно? и не нравится мне идея с надолго_открытым соединением :(

Все зависит от специфики приложения. Но в общем случае лучше не держать открытое соединение, а открывать/закрывать (при этом благодаря Connection Pool физическое соединение, как правило, будет создаваться только один раз).

Почитала про Connection Pool 

интересно smile

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

можно всем вопрос  немного не в тему?

руководитель  - программист делфи

и я ему потихоньку объясняю что пишу

как ему объяснить, что датасет - это не окно в базу данных? (он говорит, что датасет - это типа рекордсета в делфи, наверное)

или я ошибаюсь на счет датасета?
PM MAIL ICQ Skype   Вверх
RedButterfly
Дата 25.9.2008, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Учусь
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 4.7.2005
Где: Уфа->Москва

Репутация: нет
Всего: нет



про теорию:

у меня в программе Connection лежит не в классе c формой
и DataSet тоже не в классе с формой

при запуске программы нужно загрузить в ListBox все строки таблицы датасета
то есть при запуске программы делается так:

Код

ENApp app = new ENApp();            //класс без формы
Work work = new Work();             // форма
        Application.Run(work);


вот эта строка обязательна: ENApp app = new ENApp();            
и уже в Work
Код

private void LoadDBinListBox()
        {
            ENApp a = new ENApp();
            int countPro = a.ProjectCount();
            for (int i = 0; i < countPro; i++)
            {
           Console.WriteLine(a.dataSetProjects.Tables["Projects"].Rows[i]["ID"].ToString());
           Console.WriteLine(a.dataSetProjects.Tables["Projects"].Rows[i]["Name"].ToString());
           Console.WriteLine(a.dataSetProjects.Tables["Projects"].Rows[i]["Description"].ToString());
            }            
        }


кажись вот так писать в методе    
Код

ENApp a = new ENApp();

неправильно
но без этого не могу вызвать методы этого класса

и вообще у меня столько сомнений по поводу того, что какой метод/объектик где должен лежать...тот же самый датасет...он там (в классе без формы) лежит лишь по требованию высшего...но мне кажется, что "видимые" объекты должны лежать в форме...датасет причислила к видимым потому, что он в TollBoxe

посоветуйте пожалуйста что-нибудь smile (мысли/источники/статьи)
PM MAIL ICQ Skype   Вверх
RedButterfly
Дата 25.9.2008, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Учусь
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 4.7.2005
Где: Уфа->Москва

Репутация: нет
Всего: нет



после написания этой функции программа стала медленней закрываться. Нажимаю на крестик а она ещё секунду думает закрываться или нет... :(
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.1902 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.