PDA

View Full Version : مشکل با سرويس براي پشتيباني خودکار از ديتابيس



Collector
پنج شنبه 20 مرداد 1390, 15:24 عصر
اگر ممکن هست اين مشکلات را بررسي کنيد.

پروژه سرویس (ضمیمه 1)
پروژه پشتیبانی خودکار (ضمیمه 2)
این خط اجرا نمی شود. (MessageBox.Show(".فایل پشتیبان گرفته شد");)
فرض کنيد اين سرويس اجرا شده من چطوري ميتونم مقاديري از آن را با استفاده از فرم ديگر تغيير بدم.
من ميخوام از ديتا بيس در زمان مشخص پشتيبان بگيرم.
براي نصب سرويس ميتوانيد از Batch File install در Spion\Spion\bin\Debug استفاده کنيد.

Esmail Solhkhah
پنج شنبه 20 مرداد 1390, 18:32 عصر
این خط اجرا نمی شود. (MessageBox.Show(".فایل پشتیبان گرفته شد");)

دوست عزیز تو تاپیک قبلیتون که توضیح دادم :
اگه میخاید سرویستون بتونه با دسکتاپ ارتباط داشته باشه و بتونه مسیج باکس بده باید تو سرویس منیجر ویندوز تو قسمت Properties - Log On

اون تیک.. Allow Service to Interact رو بزاری



فرض کنيد اين سرويس اجرا شده من چطوري ميتونم مقاديري از آن را با استفاده از فرم ديگر تغيير بدم.

شما پارامترها رو تو یه فایل سیو کنید که سرویس از اون فایل پارامترا رو بخونه مثل نام دیتابیس - زمان بکاپ - مسیر بکاپ و ...


براي نصب سرويس ميتوانيد از Batch File install در Spion\Spion\bin\Debug استفاده کنيد.

خب این بچ فایل سرویس رو نصب میکنه مشگل چیه؟

Collector
پنج شنبه 20 مرداد 1390, 19:33 عصر
1- تیک دستی مشکل پیش نمیاد ولی با این کد با اینکه تیک می خورد مشکل پیش میاد.

http://barnamenevis.org/showthread.php?194545-%D9%81%D8%B9%D8%A7%D9%84-%D8%B3%D8%A7%D8%B2%D9%8A-Interact-with-desktop-f%D8%B1%D8%A7%D9%8A-%D8%B3%D8%B1%D9%88%D9%8A%D8%B3- (http://barnamenevis.org/showthread.php?194545-%D9%81%D8%B9%D8%A7%D9%84-%D8%B3%D8%A7%D8%B2%D9%8A-Interact-with-desktop-f%D8%B1%D8%A7%D9%8A-%D8%B3%D8%B1%D9%88%D9%8A%D8%B3-%D9%87%D8%A7%D9%8A-%D8%AF%D8%A7%D8%AA-%D9%86%D8%AA)
%D9%87%D8%A7%D9%8A-%D8%AF%D8%A7%D8%AA-%D9%86%D8%AA (http://barnamenevis.org/showthread.php?194545-%D9%81%D8%B9%D8%A7%D9%84-%D8%B3%D8%A7%D8%B2%D9%8A-Interact-with-desktop-f%D8%B1%D8%A7%D9%8A-%D8%B3%D8%B1%D9%88%D9%8A%D8%B3-%D9%87%D8%A7%D9%8A-%D8%AF%D8%A7%D8%AA-%D9%86%D8%AA)

2- در مورد با تاریخ و زمان بکاپ گیری: حالا من چطوری اون مقدار رو چک کنم که اگر در آن زمان بود بکاپ بگیرد.

بازم ممنون که راهنمایی میکنی. :قلب::قلب::قلب:

Esmail Solhkhah
پنج شنبه 20 مرداد 1390, 19:38 عصر
میشه کد خطا رو بزارید

Collector
پنج شنبه 20 مرداد 1390, 19:48 عصر
Showing a modal dialog box or form when the application is not running in UserInteractive mode is not a valid operation. Specify the ServiceNotification or DefaultDesktopOnly style to display a notification from a service application.
at System.Windows.Forms.MessageBox.ShowCore(IWin32Win dow owner, String text, String caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, MessageBoxOptions options, Boolean showHelp)
at System.Windows.Forms.MessageBox.Show(String text)
at Spion.SpionService.myTimer_Elapsed(Object sender, ElapsedEventArgs e) in C:\Documents and Settings\Golden\Desktop\2\Spion\Spion\SpionService .cs:line 53

Esmail Solhkhah
پنج شنبه 20 مرداد 1390, 19:54 عصر
خب باید اجازه بدید کد دوستمونو تست کنم

ظاهرا کدشون اون قابلیت رو رو سرویس فعال نکرده

Esmail Solhkhah
پنج شنبه 20 مرداد 1390, 20:26 عصر
این کد رو تو رویداد serviceInstaller1_Committed بنویسید


ConnectionOptions coOptions = new ConnectionOptions();
coOptions.Impersonation = ImpersonationLevel.Impersonate;
ManagementScope mgmtScope = new ManagementScope(@"root\CIMV2", coOptions);
mgmtScope.Connect();
ManagementObject wmiService;
wmiService = new ManagementObject("Win32_Service.Name='" + serviceInstaller1.ServiceName + "'");
ManagementBaseObject InParam = wmiService.GetMethodParameters("Change");
InParam["DesktopInteract"] = true;
ManagementBaseObject OutParam = wmiService.InvokeMethod("Change", InParam, null);

ضمنا Using ها به اینصورت
using System.ComponentModel;
using System.Configuration.Install;
using Microsoft.Win32;
using System.Management;

بنده تست کردم موردی نداره

فقط دقت کنید مایکروسافت این کار رو توصیه نمیکنه.

موفق باشید.

Collector
پنج شنبه 20 مرداد 1390, 21:36 عصر
ممنون مشکل حل شد.
اگر امکان داره یک راهنمایی در مورد پست سوم همین تایپک بکنید.

Esmail Solhkhah
پنج شنبه 20 مرداد 1390, 22:22 عصر
اگه منظورتون اینه




در مورد با تاریخ و زمان بکاپ گیری: حالا من چطوری اون مقدار رو چک کنم که اگر در آن زمان بود بکاپ بگیرد

خب شما که تایمر دارید در هر 1 ثانیه تاریخ و ساعت جاری رو با تاریخ و ساعتی که تو فایل تنظیمی ذخیره کردید بررسی کنید اگه برابر بودن بکاپ بگیرید

البته گفتم که شما این تنظیمات رو تو یه فایل تنظیمی ترجیحا XML تو مسیر خاصی سیو کنید تا سرویس بهش دسترسی داشته باشه

موفق باشید.

Collector
جمعه 21 مرداد 1390, 00:20 صبح
خب شما که تایمر دارید در هر 1 ثانیه تاریخ و ساعت جاری رو با تاریخ و ساعتی که تو فایل تنظیمی ذخیره کردید بررسی کنید اگه برابر بودن بکاپ بگیرید
موفق باشید.

من هم همین کار رو کردم ولی جواب نداد. لطف کنید بررسی کنید.(ساعت رو تنظیم کنید)

Esmail Solhkhah
جمعه 21 مرداد 1390, 00:22 صبح
چشم بررسی میکنم

Esmail Solhkhah
جمعه 21 مرداد 1390, 01:19 صبح
دوست عزیز برنامتون رو اصلاح کردم

فقط خواهشن نام دیتابیس رو با روش خودتون نگیرید چون روش درستی نیست

تایمر رو 1 دقیقه گرفتم

بقیشم تو کد متوجه میشید

موفق باشید.

Collector
جمعه 21 مرداد 1390, 12:49 عصر
فقط خواهشن نام دیتابیس رو با روش خودتون نگیرید چون روش درستی نیست
موفق باشید.
میدونم کد من از نظر فنی اشکال دارم ولی کد شما در کامپیوتر من جواب نداد.و این ارور رو داد.
کد if رو داخل کد خودم تست کردم جواب گرفتم.


Cannot open backup device 'c:\temp\1.bak'. Operating system error 3(error not found).
BACKUP DATABASE is terminating abnormally.
at System.Data.SqlClient.SqlConnection.OnError(SqlExc eption exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnErro r(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndW arning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlCommand.RunExecuteNonQuer yTds(String methodName, Boolean async)
at System.Data.SqlClient.SqlCommand.InternalExecuteNo nQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at Spion.SpionService.myTimer_Elapsed(Object sender, ElapsedEventArgs e) in C:\Documents and Settings\Golden\Desktop\Spion2\Spion\SpionService. cs:line 47

بعد پشت سر هم از دیتابیس بکاپ میگرفت. که من تایمر رو بعد از اولین اجرا False کردم. حالا با اینکار من مشکلی پیش نمیاد؟؟؟

void myTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
DateTime dt = DateTime.Now.ToLocalTime();

if (dt.Year == 2011 && dt.Month == 8 && dt.Day == 12 && dt.Hour == 12 && dt.Minute == 50)
{
myTimer.Enabled = false;
try
{
//MessageBox.Show("AAAA");
SqlCommand cmd = new SqlCommand();
cmd.Connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\kkkk.mdf;integrated security=true;User Instance=True");
cmd.Connection.Open();
string dbname = cmd.Connection.Database;//گرفتن نام کامل دیتابیس
cmd.Connection.Close();

SqlConnection.ClearAllPools();
string query = "BACKUP DATABASE [" + dbname + "] TO DISK ='c:/1.bak'";
cmd.Connection = new SqlConnection("Data Source=.\\SQLEXPRESS;Integrated Security=True;Connect Timeout=30;User Instance=True");
cmd.Connection.Open();
cmd.CommandText = query;
cmd.ExecuteNonQuery();
cmd.Connection.Close();
//MessageBox.Show("! " + "فایل پشتیبان گرفته شد", "!" + "اخطار", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign);
MessageBox.Show(".فایل پشتیبان گرفته شد");
}

catch (Exception ex) // ایجاد فایل خطای ران تایم
{
System.IO.StreamWriter sw = new StreamWriter(Application.StartupPath + "\\Errors.txt");
sw.WriteLine(ex.Message);
sw.WriteLine(ex.StackTrace);
sw.Close();
}
}

Esmail Solhkhah
جمعه 21 مرداد 1390, 14:05 عصر
من تایمر رو بعد از اولین اجرا False کردم. حالا با اینکار من مشکلی پیش نمیاد؟؟؟

بعد از اتمام پروسه بکاپ گیری تایمر رو دوباره فعال کنید

موفق باشید