PDA

View Full Version : نمایش لودیگ هنگام Backup و restore کردن دیتابیس



nilmil_nil
شنبه 02 آبان 1388, 14:46 عصر
دوستان عزیز برنامه نویس
چطور می تونم وقتی که دیتابیسم رو Backup یا restore می کنم به کاربر یک فرم لودینگ نمایش بدم. این کارو یکبار کردم ولی فرم درست نشون داده نمیشه
با Refresh کردن فرم هم فقط فرم کامل نشون داده می شه و لی انیمیشن یا Progressbar کار نمیکنه
لطفاً کمک کنید

saied_genius
شنبه 02 آبان 1388, 18:50 عصر
(طبق تجربه من) عمليات backup و يا restore را در يک thread ديگر اجرا کن.

و progress bar را روي فرم اصلي اجرا کن تا درست کارکنه.

براي گرفتن درصد تکميل شده از backup و يا restore ديتابيس sql مي توانيد از دستور زير استفاده نماييد. (براي دوستاني که نياز دارند.)




use master
GO
SELECT percent_complete FROM sys.dm_exec_requests WHERE command IN ('RESTORE DATABASE','BACKUP DATABASE')



سوالي بود در خدمتم.

موفق باشيد.

nilmil_nil
شنبه 02 آبان 1388, 22:39 عصر
سلام Saeid جان
ممنون از پاسخ مفید شما
اگه میشه یه خورده در مورد Thread توضیح و یا یک مثال ساده بزنید من آشنایی باهاش ندارم ممنون می شم
باتشکر

saied_genius
شنبه 02 آبان 1388, 23:50 عصر
خواهش مي کنم.

يک مثال ساده :




using System.Threading;

public partial class frmRestore : Form
{

Thread threading;


private void threadstart()
{

محل عمليات backup و يا restore

}

private void button1_Click(object sender, EventArgs e)
{

threading = new Thread(new ThreadStart(threadstart));
threading.Start();

}
}

saied_genius
یک شنبه 03 آبان 1388, 13:34 عصر
خواهش مي کنم عزيزم.

سوالي بود در خدمتم.

موفق باشيد.

l7i7l7
دوشنبه 04 آبان 1388, 08:10 صبح
(طبق تجربه من) عمليات backup و يا restore را در يک thread ديگر اجرا کن.

و progress bar را روي فرم اصلي اجرا کن تا درست کارکنه.

براي گرفتن درصد تکميل شده از backup و يا restore ديتابيس sql مي توانيد از دستور زير استفاده نماييد. (براي دوستاني که نياز دارند.)




use master
GO
SELECT percent_complete FROM sys.dm_exec_requests WHERE command IN ('RESTORE DATABASE','BACKUP DATABASE')



سوالي بود در خدمتم.

موفق باشيد.

دوست عزيز ممنون ميشم يه مثال كامل تري در رابطه با اين كدي كه نوشتي بذاري

saied_genius
دوشنبه 04 آبان 1388, 08:29 صبح
ببينيد....

شما با اين کد مي توانيد درصد تکميل شده از backup و يا restore را بگيريد، يعني چي؟

يعني هر بار که شما اين دستور را اجرا مي کنيد ، خروجي آن درصد تکميل شده از backup و يا restore است.

شما به راحتي مي توانيد اين دستور را در يک تايمر اجرا کنيد و خروجي آن را دريافت و نمايش دهيد.

سوالي بود در خدمتم.

موفق باشيد.

dr_jacky_2005
شنبه 01 آبان 1389, 16:01 عصر
من یک فرم لودینگ دارم که تووش پروگرس بار است.
یک فرم هم دارم که تووش درخت است و با تابعی پر از دیتا میشود.
اینگونه عمل کرده ام:
این رو نوشتم توو فرم که درخت تووشه که بتونم فرم لودینگ رو شو کنم:

LoadingForm frmp;

اینم توو لود فرمه که تووش درخته:

frmp = new LoadingForm();
frmp.Show();
this.Cursor = Cursors.WaitCursor;
backgroundWorker1.RunWorkerAsync();

اینم توو دوو ورک بکگرادنورکر:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
int returnedRecordCount = 100;
for (int i = 1; i <= returnedRecordCount; i++)
{
if (this.backgroundWorker1.CancellationPending)
{
e.Cancel = true;
return;
}
this.backgroundWorker1.ReportProgress(i);

System.Threading.Thread.Sleep(20);
}
if (TrvCoding.InvokeRequired)
{

TrvCoding.Invoke(new MethodInvoker(delegate { TvfCoding.LoadTreeFullDate(); }));

//TvfCoding.LoadTreeFullDate();
}
}

اینم توو کامپلیت:

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.Cursor = Cursors.Default;
frmp.Close();
//frmp.Hide();
}

اینم وقتی که فرمه که تووش درخته،دارخ بسته میشه:

private void HesabStateWorkForm_FormClosed(object sender, FormClosedEventArgs e)
{
if (this.backgroundWorker1.IsBusy) this.backgroundWorker1.CancelAsync();
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (e.ProgressPercentage <= this.frmp.progressBar1.Maximum)
{
this.frmp.progressBar1.Value = e.ProgressPercentage;
}
}

اینم توو لود فرم لودینگ:

progressBar1.Value = 0;
for (int x = 0; x < 100; x++)
{
if (progressBar1.Value < progressBar1.Maximum)
{
//System.Threading.Thread.Sleep(10);
progressBar1.Value++;
}
}

اینا هم نکته ها:
دو تا پروپرتی توانایی کنسل کردن و گزارش دادن true است.
و
فرم لودینگ هم TopMost = true

سوالات:
الآن همه چی میاد،عالی...
ولی
اول لودینگ میاد،بعد پر شدن درخت شروع میشه!

من میخوام هم زمان باشن!


دومین چیزی که میخوام اینه که پر شدن لودینگ متناسب باشه به مقداری که لازمه.

اگر مورد بالا نشد،میخوام که پروگرس بار بلوکی نباشد،marquee باشد.(style)

mohammad kafiyan
دوشنبه 03 بهمن 1390, 21:36 عصر
سلام به دوستان من می خوام با progressbar مراحل پیشرفت کار backup & restore را نمایش بدم دوست عزیز گفتند به صورت زیر

(طبق تجربه من) عمليات backup و يا restore را در يک thread ديگر اجرا کن.

و progress bar را روي فرم اصلي اجرا کن تا درست کارکنه.

با توجه به گفته ایشون چگونه progressbar را مقدار دهی کنم



براي گرفتن درصد تکميل شده از backup و يا restore ديتابيس sql مي توانيد از دستور زير استفاده نماييد. (براي دوستاني که نياز دارند.)

use master
GO
SELECT percent_complete FROM sys.dm_exec_requests WHERE command IN ('RESTORE DATABASE','BACKUP DATABASE')




چطور می تونم مقدار خروجی این دستور select را در progressbar و یا label نمایش دهم
با تشکر به دوستان

shadi khanum
سه شنبه 04 بهمن 1390, 11:06 صبح
اگه از SMO یا DMO برای backup و Restore استفاده کنی خودشون مدیریت thread رو واست انجام میدن و یه CallBackFuncion بهت میده که میتونی توی اون درصد پیشرفت کار رو بگیری و به راحتی تو یه label نشون بدی یا اگه میخوای progressBar بندازی و Value اون رو بذاری ون عددی که تابع برمیگردونه...

mohammad kafiyan
سه شنبه 04 بهمن 1390, 22:14 عصر
از دوستان کسی دیگه نبود راهنمایی بکنه

mohammad kafiyan
چهارشنبه 05 بهمن 1390, 22:56 عصر
سلام به دوستان حداقل کسی نیست که بگه چگونه خروجی این query را در label نمایش بدهم


use master
GO
SELECT percent_complete FROM sys.dm_exec_requests WHERE command IN ('RESTORE DATABASE','BACKUP DATABASE')

mohammad kafiyan
جمعه 07 بهمن 1390, 23:46 عصر
سلام به دوستان این دستور را داخل یک timer قرار دادم و خروجی این دستور را داخل یک datatable ریختم جواب هم گرفتم ولی بعد پیغام زیر میدهد


SqlCommand cmd = new SqlCommand();
DataTable dt = new DataTable();
SqlDataAdapter ada2 = new SqlDataAdapter();
SqlConnection con = new SqlConnection(@"Data Source=.;Initial Catalog=anbar;Integrated Security=True");
con.Open();
ada2.SelectCommand = new SqlCommand("SELECT percent_complete FROM sys.dm_exec_requests WHERE command IN ('BACKUP DATABASE')", con);
ada2.SelectCommand.ExecuteScalar();
ada2.Fill(dt);
con.Close();
progressBar1.Value = Convert.ToInt16(dt.Rows[0][0].ToString());
if (progressBar1.Value == progressBar1.Maximum)
{

timer1.Enabled = false;
}


input string was not in a correct format
چرا:گیج:

micro24
شنبه 08 بهمن 1390, 23:11 عصر
با سلام

من فکر میکنم وقتی back up شما تمام میشود این خطا را برمیگرداند چون دیگر هیچ اطلاعاتی ندارید اولش چک کنید Row ای داشته باشد شاید جواب گرفتید.

mohammad kafiyan
شنبه 08 بهمن 1390, 23:52 عصر
دقیقا درسته مقدار نهایی را برابر 100 می کنه در datatable و progress به درستی نمایش داده می شه ولی در انتها این پیغام را میده نمی دونم باید چه کار کنم

zarrinnegar
یک شنبه 09 بهمن 1390, 00:17 صبح
قبل از این خط
progressBar1.Value = Convert.ToInt16(dt.Rows[0][0].ToString());
مقدار
dt.Rows[0][0]
رو چک کن ببین اگر null بود Timer رو غیر فعال کن و بیا بیرون

NasimBamdad
یک شنبه 09 بهمن 1390, 19:14 عصر
اگه از SMO یا DMO برای backup و Restore استفاده کنی خودشون مدیریت thread رو واست انجام میدن و یه CallBackFuncion بهت میده که میتونی توی اون درصد پیشرفت کار رو بگیری و به راحتی تو یه label نشون بدی یا اگه میخوای progressBar بندازی و Value اون رو بذاری ون عددی که تابع برمیگردونه...


میشه یک توضیح ، مثالی چیزی بزنید ؟

NasimBamdad
یک شنبه 09 بهمن 1390, 19:38 عصر
میگم آخرش فهمیدید که چه طوری میشه لودینگ درست کرد ؟

میشه یکی یک مثال کامل بزاره ؟ یک نمونه برنامه چیزی ؟

mohammad kafiyan
دوشنبه 10 بهمن 1390, 00:26 صبح
سلام دوست عزیز باز هم چک کردم همان پیغام خطا را می دهد


if (dt.Rows[0][0]!=null)
{
progressBar1.Value = Convert.ToInt16(dt.Rows[0][0].ToString());
if (progressBar1.Value == progressBar1.Maximum)
{

timer1.Enabled = false;
}
}
else
timer1.Enabled = false;

به این خط ایراد می گیره و همان پیغام بالا را می دهد:عصبانی:
progressBar1.Value = Convert.ToInt16(dt.Rows[0][0].ToString());

amir.khanlari
سه شنبه 11 بهمن 1390, 13:14 عصر
سلام دوست عزیز
شما در ابتدا دارید چک می کنید که dt.Rows[0][0] اگر Null بود از Timer خارج شوید خوب چطور انتظار دارید که dt.Rows[0][0].tostring به شما خطا ندهد.Null refrence error می گیرید چون dt.Rows[0][0]=null هستش

mohammad kafiyan
چهارشنبه 12 بهمن 1390, 00:59 صبح
سلام دوست عزیز در اینجا مشکل تایپی بود که وارد کردم و مشکل آنرا هم بر طرف کردم و مشکل (پیغام خطا در بالا)اینجاست که نتیجه select مقادیر اعشاری است که بر می گرداند که باید convert شود به نوع int و بعد اطلاعات را انتقال بدی به progressbar
حالا این دستور به توسط storedprocdeur نوشتم و در یک کلاس و تابع مقدار خروجی را در datatable قرار دادم نمی دونم چر این خطا را می ده کسی از دوستان برنامه اش را نوشته
آیا دوستان این کار کردند

این هم دستور


public DataTable anbar_progressbar()
{
SqlCommand cmd = new SqlCommand();

try
{
connect();
cmd.Connection = con;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = @"show_progressbar";
sd.SelectCommand = cmd;
con.Open();
dt.Clear();
sd.Fill(dt);
con.Close();
cmd.Dispose();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return dt;
}

این هم پیغام
not allowed to change the 'connectionstring'property.the connections current state is open

NasimBamdad
پنج شنبه 13 بهمن 1390, 13:10 عصر
از عزیزانی که خیلی لطف دارند ، میشه یک زحمتی بکشید ؟

یک برنامه بسازید که از دیتابیس بک آپ می گیره و یک لودینگ داره :D نمیشه ؟