Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > вызвать DataSet из другой функции


Автор: RedButterfly 23.9.2008, 13:21
добрый вечер 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)
{
//***
}

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

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

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

Автор: RedButterfly 23.9.2008, 13:47
smile 

Автор: RedButterfly 24.9.2008, 08:01
ошибку нашла 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);      


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

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

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



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

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

Автор: RedButterfly 24.9.2008, 09:33
семь пятниц на неделе :(

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

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

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

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

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

http://forum.vingrad.ru/index.php?showtopic=119929&view=findpost&p=912578

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

               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());
                }

Автор: RedButterfly 24.9.2008, 12:29
хорошо, что хотя бы Idsa написал, а то сижу и общаюсь сама с собой чтоли.... smile

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

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


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

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

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

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

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

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

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

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

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

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

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

Автор: RedButterfly 24.9.2008, 15:20
Цитата(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

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

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

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

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

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

или я ошибаюсь на счет датасета?

Автор: RedButterfly 25.9.2008, 10:03
про теорию:

у меня в программе 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 (мысли/источники/статьи)

Автор: RedButterfly 25.9.2008, 11:41
после написания этой функции программа стала медленней закрываться. Нажимаю на крестик а она ещё секунду думает закрываться или нет... :(

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)