Программа на С# кладет в MSSQL и достает обратно BLOB — данные.
Все работает , но окошко замирает до окончания выполнения SqlCommand (Insert или Select). КАК отобразить на форме, что программа не висит, а выполняет запрос??? Как узнать время выполнения и процент?(windows ведь показывает при копировании файлов например)???
04.09.04 11:12: Перенесено модератором из '.NET' — AndrewVK
Здравствуйте, 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 запроса
Hello, misha_v!
mv> Программа на С# кладет в MSSQL и достает обратно BLOB — данные. mv> Все работает , но окошко замирает до окончания выполнения SqlCommand mv> (Insert или Select). КАК отобразить на форме, что программа не висит, а mv> выполняет запрос??? Как узнать время выполнения и процент?(windows ведь mv> показывает при копировании файлов например)???
Радикальное средство — выполняй длительные операции в отдельной нити.
А основной нити смотри по таймеру закончилась операция или нет. Тут и рисуй прогрессбары или что тебе в голову придет.
Здравствуйте, 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 запроса
Здравствуйте, 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 запроса
_>А как проверять? примеров нет? Или лучше ссылок в МСДН-не где почитать
IMHO, гораздо проще не заморачиваться с этим, а заполнять прогресс бар например по логарифмическому закону.
Или так: основная нить каждые 0.1 секунды проверяет, не закончила ли работу нить, работающая с базой данных. Если нет, то она закрашивает половину оставшегося места ProgressBar'а.
Не совсем честно, зато хлопот гораздо меньше.
... << RSDN@Home 1.1.4 @@subversion >>
Re[3]: "Зависание" окна при выполнении SQL запроса
DAS> Не совсем честно, зато хлопот гораздо меньше.
Не очень понятно, какой смысл в таком прогресс-баре. Просто показать, что прога не зависта? Это лучше сделать как-то иначе. А так у тебя на длительном запросе быстро уйдет в 99-100% и там останется до конца запроса.
Re[5]: "Зависание" окна при выполнении SQL запроса
Здравствуйте, Igor Trofimov, Вы писали:
DAS>> Не совсем честно, зато хлопот гораздо меньше.
iT>Не очень понятно, какой смысл в таком прогресс-баре. Просто показать, что прога не зависта?
Именно.
iT>Это лучше сделать как-то иначе.
Можно. А уж лучше это или нет зависит от каждого конкретного случая.
iT>А так у тебя на длительном запросе быстро уйдет в 99-100% и там останется до конца запроса.
Можешь предложить другую не особо затратную реализацию ?
А если запрос один, но секунд на 20-30 ? СУБД никак не вернет информацию, сколько осталось до завершения выполения запроса
... << RSDN@Home 1.1.4 @@subversion >>
Re[6]: "Зависание" окна при выполнении SQL запроса
iT>>А так у тебя на длительном запросе быстро уйдет в 99-100% и там останется до конца запроса.
DAS>Можешь предложить другую не особо затратную реализацию ?
Реализацию чего? Показать, что порга не зависла — просто сделай две иконки и рисуй то одну, то другую раз в секунду. Реализацию показа времени, которое запрос выполняется? Тоже просто. А у тебя нито, ни другое — у тебя для 30сек запроса вообще ничего понять нельзя- прогресс в конце и никаких изменений. Ясен пень — зависла
DAS>А если запрос один, но секунд на 20-30 ? СУБД никак не вернет информацию, сколько осталось до завершения выполения запроса
Ну какая-то СУБД это может и умеет, а в какой-то может можно как-то извратиться. В оракле огромная куча инфы по всем сессиям, может что-то подходящее и найдется, а в IB, например, можно поиграться с генераторами — они вне контекста транзакции меняются. Изврат конечно. Но твой вариант — имхо, просто не решает ни одного из трех вариантов постановки (показать процент завершения, показать, что прога не зависла, показать время выполнения).
Re[7]: "Зависание" окна при выполнении SQL запроса
iT>Но твой вариант — имхо, просто не решает ни одного из трех вариантов постановки (показать процент завершения, показать, что прога не зависла, показать время выполнения).
Тем не менее, подобный прогрессбар -- стандартная практика, когда оценить объем работы сложно/невозможно.
Re[7]: "Зависание" окна при выполнении SQL запроса
Здравствуйте, Igor Trofimov, Вы писали:
DAS>>Можешь предложить другую не особо затратную реализацию ?
iT>Реализацию чего? Показать, что порга не зависла — просто сделай две иконки и рисуй то одну, то другую раз в секунду. Реализацию показа времени, которое запрос выполняется?
Нет. Я имел в виду как раз это. Время, которое выполняется запрос.
iT>Тоже просто.
Как
DAS>>А если запрос один, но секунд на 20-30 ? СУБД никак не вернет информацию, сколько осталось до завершения выполения запроса
iT>Ну какая-то СУБД это может и умеет, а в какой-то может можно как-то извратиться. В оракле огромная куча инфы по всем сессиям, может что-то подходящее и найдется, а в IB, например, можно поиграться с генераторами — они вне контекста транзакции меняются.
А при чем тут генераторы. В запросе генераторы могут и не участвовать. Например, это один select (так, для определенности ).
Про Оракл — если можешь привести конкретный пример — приведи, пожалуйста.
iT> Но твой вариант — имхо, просто не решает ни одного из трех вариантов постановки (показать процент завершения, показать, что прога не зависла, показать время выполнения).
Ну, мой способ, например, используется при копировании файлов в проводнике windows. Win не знает, сколько времени займет копирование, поэтому и говорит — "Осталось около n минут". Причем эти минуты могут, как уменьшаться, так и увеличиваться.
... << RSDN@Home 1.1.4 @@subversion >>
Re[8]: "Зависание" окна при выполнении SQL запроса
DAS> А при чем тут генераторы. В запросе генераторы могут и не участвовать. Например, это один select (так, для определенности ).
Да есть там финт с ушами один. Например, если включить в список SELECT функцию GEN_ID, то по мере вычисления строк запроса значение генератора будет меняться и это видно из другой транзакции. Да, изврат и негибко. Но в каждой конкретной СУБД могут найтись хотя бы такие способы оценки хода выполнение.
DAS> Про Оракл — если можешь привести конкретный пример — приведи, пожалуйста.
Нет, не могу Я же писал — может и есть что-то подходящее в инфе о сессии. А может и нет.
DAS>Ну, мой способ, например, используется при копировании файлов в проводнике windows. Win не знает, сколько времени займет копирование, поэтому и говорит — "Осталось около n минут". Причем эти минуты могут, как уменьшаться, так и увеличиваться.
Ситуация тут совершенно другая. У проводника есть точная информация о проценте выполнения — размер файла известен и сколько уже скопировано, тоже известно. "Подбирает" он только оставшееся время исходя из средней скорости, которая может меняться.
В нашем же случае не известно толком ничего. И поэтому если не прибегать к вышеописанным извратам, адекватный прогресс-бар сделать ну никак не получится. А если он неадекватный и показывает чушь — имхо, лучше пусть его вообще не будет, показывай время, прошедшее от начала запроса лучше или число отфетченных записей, если время уходит именно на фетч.
Re[3]: "Зависание" окна при выполнении SQL запроса
misha_v wrote:
> Программа на С# кладет в MSSQL и достает обратно BLOB — данные. > Все работает , но окошко замирает до окончания выполнения SqlCommand > (Insert или Select). КАК отобразить на форме, что программа не висит, а > выполняет запрос??? Как узнать время выполнения и процент?(windows ведь > показывает при копировании файлов например)???
Вынеси свой запрос в отдельную нитку, а основным процессом снимай с
нее статистику
--
WBR, Denis Basargin
ICQ: 33681277
Mail: sailorman(at)rin.ru
Origin: Hедовольные были, но мы их пофиксили
Здравствуйте, Igor Trofimov, Вы писали:
iT>Да есть там финт с ушами один. Например, если включить в список SELECT функцию GEN_ID, то по мере вычисления строк запроса значение генератора будет меняться и это видно из другой транзакции. Да, изврат и негибко. Но в каждой конкретной СУБД могут найтись хотя бы такие способы оценки хода выполнение.
Извини, Interbase/Firebird не знаю, но стало интересно . А изменение генератора произведенное из одной сессии, но не закомиченное разве будет видно из другой сессии ? То есть, получается, что мы имеем дело с гряным чтением.
И если сессия изменившая значение генератора сделает rollback, откатится ли значение генератора ?
... << RSDN@Home 1.1.4 @@subversion >>
Re[4]: "Зависание" окна при выполнении SQL запроса
Здравствуйте, DEMON HOOD, Вы писали:
DH>Здравствуйте, Chardex, Вы писали:
C>>Здравствуйте, DEMON HOOD, Вы писали:
C>>Че-то не вижу я связи ответа с поставленным вопросом
DH>