"Зависание" окна при выполнении SQL запроса
От: misha_v  
Дата: 01.09.04 15:19
Оценка:
Программа на С# кладет в MSSQL и достает обратно BLOB — данные.
Все работает , но окошко замирает до окончания выполнения SqlCommand (Insert или Select). КАК отобразить на форме, что программа не висит, а выполняет запрос??? Как узнать время выполнения и процент?(windows ведь показывает при копировании файлов например)???

04.09.04 11:12: Перенесено модератором из '.NET' — AndrewVK
Re: "Зависание" окна при выполнении SQL запроса
От: DEMON HOOD  
Дата: 01.09.04 20:29
Оценка:
Здравствуйте, misha_v, Вы писали:

_>Программа на С# кладет в MSSQL и достает обратно BLOB — данные.

_>Все работает , но окошко замирает до окончания выполнения SqlCommand (Insert или Select). КАК отобразить на форме, что программа не висит, а выполняет запрос??? Как узнать время выполнения и процент?(windows ведь показывает при копировании файлов например)???

ОНО?

[msdn]
public void ReadMyData(string myConnString) 
{
   string mySelectQuery = "SELECT OrderID, Customer FROM Orders";
   SqlConnection myConnection = new SqlConnection(myConnString);
   SqlCommand myCommand = new SqlCommand(mySelectQuery,myConnection);
   myConnection.Open();
   SqlDataReader myReader = myCommand.ExecuteReader();
   try 
   {
     while (myReader.Read()) 
     {
       Console.WriteLine(myReader.GetInt32(0) + ", " + myReader.GetString(1));
     }
    }
    finally 
    {
    // always call Close when done reading.
    myReader.Close();
    // always call Close when done reading.
    myConnection.Close();
    }
 }

[/msdn]
... <<silent Rsdn@Home 1.1.4 beta 1 Windows XP 5.1.2600.0 >>
Re[2]: "Зависание" окна при выполнении SQL запроса
От: Chardex Россия  
Дата: 01.09.04 20:49
Оценка:
Здравствуйте, DEMON HOOD, Вы писали:

Че-то не вижу я связи ответа с поставленным вопросом
Re: "Зависание" окна при выполнении SQL запроса
От: GarryIV  
Дата: 02.09.04 07:55
Оценка:
Hello, misha_v!

mv> Программа на С# кладет в MSSQL и достает обратно BLOB — данные.

mv> Все работает , но окошко замирает до окончания выполнения SqlCommand
mv> (Insert или Select). КАК отобразить на форме, что программа не висит, а
mv> выполняет запрос??? Как узнать время выполнения и процент?(windows ведь
mv> показывает при копировании файлов например)???

Радикальное средство — выполняй длительные операции в отдельной нити.
А основной нити смотри по таймеру закончилась операция или нет. Тут и рисуй прогрессбары или что тебе в голову придет.

WBR, Igor Evgrafov.
Posted via RSDN NNTP Server 1.9 beta
WBR, Igor Evgrafov
Re: "Зависание" окна при выполнении SQL запроса
От: DemAS http://demas.me
Дата: 02.09.04 08:08
Оценка: 2 (1)
Здравствуйте, misha_v, Вы писали:

_>Программа на С# кладет в MSSQL и достает обратно BLOB — данные.

_>Все работает , но окошко замирает до окончания выполнения SqlCommand (Insert или Select). КАК отобразить на форме, что программа не висит, а выполняет запрос??? Как узнать время выполнения и процент?(windows ведь показывает при копировании файлов например)???

Выполняй в отдельном потоке. Вот пример:

        using System.Threading;
   using System.IO;
   using System.Data;
   using System.Data.SqlClient;

   namespace Chapter 02
   {
     public class Threaded Resource : System.Windows.Forms.Form
     {
       public void Button1 Click(object sender , System.EventArgs e)
       {
         Thread t = new Thread(new ThreadStart(QueryData));
         t.Start();

       }

       public void QueryData()
       {
         SqlDataReader objReader;
         SqlConnection objConn;
         SqlCommand objCommand;
         int intEmployeeID;
         string strFirstName;
         string strTitle;
         int intReportsTo;
         objConn = new SqlConnection("server=RemoteServer;" +
             "UID=RemoteUser;PWD=Password;database=northwind");
         objCommand = new SqlCommand("SELECT EmployeeID, FirstName, " +
             "Title, ReportsTo FROM Employees", objConn);
         objConn.Open();
         objReader = objCommand.ExecuteReader(
             CommandBehavior.CloseConnection );

         while (objReader.Read())
         {
           intEmployeeID = objReader.GetInt32(0);
           strFirstName = objReader.GetString(1);
           strTitle = objReader.GetString(2);
           if(objReader.IsDBNull(3))
             intReportsTo = 0;
           else
             intReportsTo = objReader.GetInt32(3);

           listBox1.Items.Add(intEmployeeID.ToString() + " " +
               strFirstName + " " + strTitle + " " +
               intReportsTo.ToString());
         }
         objReader.Close();
         objConn.Close();
       }

       public static void Main()
       {
         Application.Run(new Threaded_Resource());
       }
     }
   }
... << RSDN@Home 1.1.4 @@subversion >>
Re[2]: "Зависание" окна при выполнении SQL запроса
От: misha_v  
Дата: 02.09.04 11:31
Оценка:
Здравствуйте, GarryIV, Вы писали:

GIV>Hello, misha_v!


mv>> Программа на С# кладет в MSSQL и достает обратно BLOB — данные.

mv>> Все работает , но окошко замирает до окончания выполнения SqlCommand
mv>> (Insert или Select). КАК отобразить на форме, что программа не висит, а
mv>> выполняет запрос??? Как узнать время выполнения и процент?(windows ведь
mv>> показывает при копировании файлов например)???

GIV>Радикальное средство — выполняй длительные операции в отдельной нити.

GIV>А основной нити смотри по таймеру закончилась операция или нет. Тут и рисуй прогрессбары или что тебе в голову придет.

GIV>WBR, Igor Evgrafov.


А как проверять? примеров нет? Или лучше ссылок в МСДН-не где почитать
Re[3]: "Зависание" окна при выполнении SQL запроса
От: DemAS http://demas.me
Дата: 02.09.04 12:05
Оценка: 1 (1)
Здравствуйте, misha_v, Вы писали:


_>А как проверять? примеров нет? Или лучше ссылок в МСДН-не где почитать


IMHO, гораздо проще не заморачиваться с этим, а заполнять прогресс бар например по логарифмическому закону.
Или так: основная нить каждые 0.1 секунды проверяет, не закончила ли работу нить, работающая с базой данных. Если нет, то она закрашивает половину оставшегося места ProgressBar'а.
Не совсем честно, зато хлопот гораздо меньше.
... << RSDN@Home 1.1.4 @@subversion >>
Re[3]: "Зависание" окна при выполнении SQL запроса
От: DEMON HOOD  
Дата: 02.09.04 18:44
Оценка:
Здравствуйте, Chardex, Вы писали:

C>Здравствуйте, DEMON HOOD, Вы писали:


C>Че-то не вижу я связи ответа с поставленным вопросом


try 
   {
     while (myReader.Read()) 
     {
       Console.WriteLine(myReader.GetInt32(0) + ", " + myReader.GetString(1));
             поставить тут System.Windows.Forms.Application.DoEvents(); например?
     }
    }
... <<silent Rsdn@Home 1.1.4 beta 1 Windows XP 5.1.2600.0 >>
Re[2]: "Зависание" окна при выполнении SQL запроса
От: DemAS http://demas.me
Дата: 03.09.04 06:25
Оценка:
Здравствуйте, DemAS, Вы писали:

Кстати, не уверен, что приведенный мною пример корректен.
В частности смущает вот эта строка:
        listBox1.Items.Add(


В данном конкретном случае вроде работает, но насколько корректно работать с контролами формы из отдельного потока ?
... << RSDN@Home 1.1.4 @@subversion >>
Re[4]: "Зависание" окна при выполнении SQL запроса
От: Igor Trofimov  
Дата: 04.09.04 08:45
Оценка:
DAS> Не совсем честно, зато хлопот гораздо меньше.

Не очень понятно, какой смысл в таком прогресс-баре. Просто показать, что прога не зависта? Это лучше сделать как-то иначе. А так у тебя на длительном запросе быстро уйдет в 99-100% и там останется до конца запроса.
Re[5]: "Зависание" окна при выполнении SQL запроса
От: DemAS http://demas.me
Дата: 04.09.04 10:01
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

DAS>> Не совсем честно, зато хлопот гораздо меньше.


iT>Не очень понятно, какой смысл в таком прогресс-баре. Просто показать, что прога не зависта?


Именно.

iT>Это лучше сделать как-то иначе.


Можно. А уж лучше это или нет зависит от каждого конкретного случая.

iT>А так у тебя на длительном запросе быстро уйдет в 99-100% и там останется до конца запроса.


Можешь предложить другую не особо затратную реализацию ?

А если запрос один, но секунд на 20-30 ? СУБД никак не вернет информацию, сколько осталось до завершения выполения запроса
... << RSDN@Home 1.1.4 @@subversion >>
Re[6]: "Зависание" окна при выполнении SQL запроса
От: Igor Trofimov  
Дата: 04.09.04 11:14
Оценка: 1 (1)
iT>>А так у тебя на длительном запросе быстро уйдет в 99-100% и там останется до конца запроса.

DAS>Можешь предложить другую не особо затратную реализацию ?


Реализацию чего? Показать, что порга не зависла — просто сделай две иконки и рисуй то одну, то другую раз в секунду. Реализацию показа времени, которое запрос выполняется? Тоже просто. А у тебя нито, ни другое — у тебя для 30сек запроса вообще ничего понять нельзя- прогресс в конце и никаких изменений. Ясен пень — зависла

DAS>А если запрос один, но секунд на 20-30 ? СУБД никак не вернет информацию, сколько осталось до завершения выполения запроса


Ну какая-то СУБД это может и умеет, а в какой-то может можно как-то извратиться. В оракле огромная куча инфы по всем сессиям, может что-то подходящее и найдется, а в IB, например, можно поиграться с генераторами — они вне контекста транзакции меняются. Изврат конечно. Но твой вариант — имхо, просто не решает ни одного из трех вариантов постановки (показать процент завершения, показать, что прога не зависла, показать время выполнения).
Re[7]: "Зависание" окна при выполнении SQL запроса
От: Mab Россия http://shade.msu.ru/~mab
Дата: 04.09.04 11:28
Оценка:
iT>Но твой вариант — имхо, просто не решает ни одного из трех вариантов постановки (показать процент завершения, показать, что прога не зависла, показать время выполнения).
Тем не менее, подобный прогрессбар -- стандартная практика, когда оценить объем работы сложно/невозможно.
Re[7]: "Зависание" окна при выполнении SQL запроса
От: DemAS http://demas.me
Дата: 04.09.04 12:18
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

DAS>>Можешь предложить другую не особо затратную реализацию ?


iT>Реализацию чего? Показать, что порга не зависла — просто сделай две иконки и рисуй то одну, то другую раз в секунду. Реализацию показа времени, которое запрос выполняется?


Нет. Я имел в виду как раз это. Время, которое выполняется запрос.

iT>Тоже просто.


Как

DAS>>А если запрос один, но секунд на 20-30 ? СУБД никак не вернет информацию, сколько осталось до завершения выполения запроса


iT>Ну какая-то СУБД это может и умеет, а в какой-то может можно как-то извратиться. В оракле огромная куча инфы по всем сессиям, может что-то подходящее и найдется, а в IB, например, можно поиграться с генераторами — они вне контекста транзакции меняются.


А при чем тут генераторы. В запросе генераторы могут и не участвовать. Например, это один select (так, для определенности ).
Про Оракл — если можешь привести конкретный пример — приведи, пожалуйста.

iT> Но твой вариант — имхо, просто не решает ни одного из трех вариантов постановки (показать процент завершения, показать, что прога не зависла, показать время выполнения).


Ну, мой способ, например, используется при копировании файлов в проводнике windows. Win не знает, сколько времени займет копирование, поэтому и говорит — "Осталось около n минут". Причем эти минуты могут, как уменьшаться, так и увеличиваться.
... << RSDN@Home 1.1.4 @@subversion >>
Re[8]: "Зависание" окна при выполнении SQL запроса
От: Igor Trofimov  
Дата: 04.09.04 17:08
Оценка:
DAS> А при чем тут генераторы. В запросе генераторы могут и не участвовать. Например, это один select (так, для определенности ).

Да есть там финт с ушами один. Например, если включить в список SELECT функцию GEN_ID, то по мере вычисления строк запроса значение генератора будет меняться и это видно из другой транзакции. Да, изврат и негибко. Но в каждой конкретной СУБД могут найтись хотя бы такие способы оценки хода выполнение.

DAS> Про Оракл — если можешь привести конкретный пример — приведи, пожалуйста.

Нет, не могу Я же писал — может и есть что-то подходящее в инфе о сессии. А может и нет.

DAS>Ну, мой способ, например, используется при копировании файлов в проводнике windows. Win не знает, сколько времени займет копирование, поэтому и говорит — "Осталось около n минут". Причем эти минуты могут, как уменьшаться, так и увеличиваться.


Ситуация тут совершенно другая. У проводника есть точная информация о проценте выполнения — размер файла известен и сколько уже скопировано, тоже известно. "Подбирает" он только оставшееся время исходя из средней скорости, которая может меняться.

В нашем же случае не известно толком ничего. И поэтому если не прибегать к вышеописанным извратам, адекватный прогресс-бар сделать ну никак не получится. А если он неадекватный и показывает чушь — имхо, лучше пусть его вообще не будет, показывай время, прошедшее от начала запроса лучше или число отфетченных записей, если время уходит именно на фетч.
Re[3]: "Зависание" окна при выполнении SQL запроса
От: olegkr  
Дата: 05.09.04 13:14
Оценка: 3 (1)
Здравствуйте, DemAS, Вы писали:

DAS> Кстати, не уверен, что приведенный мною пример корректен.

DAS> В частности смущает вот эта строка:
DAS>
DAS>        listBox1.Items.Add(
DAS>


Правильно смущает. Нужно использовать listBox1.BeginInvoke.
Re: "Зависание" окна при выполнении SQL запроса
От: sailorman  
Дата: 05.09.04 16:21
Оценка:
misha_v wrote:

> Программа на С# кладет в MSSQL и достает обратно BLOB — данные.

> Все работает , но окошко замирает до окончания выполнения SqlCommand
> (Insert или Select). КАК отобразить на форме, что программа не висит, а
> выполняет запрос??? Как узнать время выполнения и процент?(windows ведь
> показывает при копировании файлов например)???

Вынеси свой запрос в отдельную нитку, а основным процессом снимай с
нее статистику

--
WBR, Denis Basargin
ICQ: 33681277
Mail: sailorman(at)rin.ru
Origin: Hедовольные были, но мы их пофиксили
Posted via RSDN NNTP Server 1.9 beta
Re: "Зависание" окна при выполнении SQL запроса
От: Shef Россия www.devpark.ru
Дата: 05.09.04 21:37
Оценка:
Вот неплохое решение
http://www.idesign.net/idesign/uploads/Background%20with%201.1.zip

http://www.idesign.net/idesign/DesktopDefault.aspx?tabindex=5&amp;tabid=8
Re[9]: "Зависание" окна при выполнении SQL запроса
От: DemAS http://demas.me
Дата: 06.09.04 06:00
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

iT>Да есть там финт с ушами один. Например, если включить в список SELECT функцию GEN_ID, то по мере вычисления строк запроса значение генератора будет меняться и это видно из другой транзакции. Да, изврат и негибко. Но в каждой конкретной СУБД могут найтись хотя бы такие способы оценки хода выполнение.


Извини, Interbase/Firebird не знаю, но стало интересно . А изменение генератора произведенное из одной сессии, но не закомиченное разве будет видно из другой сессии ? То есть, получается, что мы имеем дело с гряным чтением.
И если сессия изменившая значение генератора сделает rollback, откатится ли значение генератора ?
... << RSDN@Home 1.1.4 @@subversion >>
Re[4]: "Зависание" окна при выполнении SQL запроса
От: feanor_ka  
Дата: 06.09.04 07:50
Оценка:
Здравствуйте, DEMON HOOD, Вы писали:

DH>Здравствуйте, Chardex, Вы писали:


C>>Здравствуйте, DEMON HOOD, Вы писали:


C>>Че-то не вижу я связи ответа с поставленным вопросом


DH>
DH>try 
DH>   {
DH>     while (myReader.Read()) 
DH>     {
DH>       Console.WriteLine(myReader.GetInt32(0) + ", " + myReader.GetString(1));
DH>             поставить тут System.Windows.Forms.Application.DoEvents(); например?
DH>     }
DH>    }

DH>


А если ExecuteReader выполняется секунд 20-30 то как его прогресс посмотреть?
... << RSDN@Home 1.1.3 stable >>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.