PDA

View Full Version : مشکل برنامه های اجرا شده در استارت آپ ویندوز با خواندن اطلاعات از sql



hadilionson
دوشنبه 07 اسفند 1391, 21:31 عصر
با سلام خدمت دوستان،
در مورد اجرا شدن برنامه در هنگام بالا آمدن ویندوز و اضافه کردن به رجیستری مطالب زیادی وجود دارد، و براحتی فایل های exe در startup اجرا میشوند، ولی درصورتیکه برنامه یک سری اطلاعات از sql بخواند error بوحود میاد.
در برنامه ی من از sqlexpress 2008 استفاده شده، تصویر error را گذاشتم، فقط جالب اینجاست این مسئله ربطی به زمان گذشتن از بالا آمدن ویندوز نداره، چون برنامه واسطی قرار دادم تا برنامه مشکل دارم که از sql میخونه بعد از 10 دقیقه از شروع کار ویندوز باز کنه ولی باز همین error را داد
ممنون میشم راهنماییم کنید

csharpdoost
دوشنبه 07 اسفند 1391, 22:55 عصر
رو سیستم .Net Framework چند نصب کردی.؟ و ظاهرا پیغام میگه که فایل دیگری همنام دیتابیس وجود داره. نامی دیتابیس رو عوض کن ببین مشکلت حل میشه؟

hadilionson
سه شنبه 08 اسفند 1391, 10:22 صبح
netframfork4، نه دوست عزیز اگر مشکل این بود موقعی که فایل exe بصورت عادی با کلیک اجرا میشد باز ایراد میگرفت ولی اینطور نیست به درستی اجرا میشه

hadilionson
سه شنبه 08 اسفند 1391, 10:27 صبح
دوستان ممنون میشم اگه برنامه ای رو خود شما بصورت خیلی ساده بنویسید که از sql express اطلاعات بخونه و در startup اجرا شه، بعد ببینیم شما هم به این مشکل بر میخورید یا نه

Mahmoud.Afrad
سه شنبه 08 اسفند 1391, 11:43 صبح
برنامه باید صبر کنه تا پروسس sqlserver ران بشه بعد ازش اطلاعات دریافت کنه.
یک راه اینه که ترد رو sleep کنید تا پروسس اجرا بشه:

bool isRun;
public FrmMain()
{
InitializeComponent();

while (!isRun)
{
Process[] processes = Process.GetProcessesByName("sqlservr");
if (processes != null)
{
isRun = true;
}
else
{
System.Threading.Thread.Sleep(1000);
}
}
}

مرتضی تقدمی
سه شنبه 08 اسفند 1391, 11:57 صبح
برنامه باید صبر کنه تا پروسس sqlserver ران بشه بعد ازش اطلاعات دریافت کنه.
یک راه اینه که ترد رو sleep کنید تا پروسس اجرا بشه: ...



... فقط جالب اینجاست این مسئله ربطی به زمان گذشتن از بالا آمدن ویندوز نداره، چون برنامه واسطی قرار دادم تا برنامه مشکل دارم که از sql میخونه بعد از 10 دقیقه از شروع کار ویندوز باز کنه ولی باز همین error را داد ...


دقت کنید!

hadilionson
سه شنبه 08 اسفند 1391, 13:16 عصر
ممنونم از پاسختون، روشی که شما استفاده کردید اصولی تر هست
برای sqlexpress باید
Process[] processes = Process.GetProcessesByName("sqlsExpress");
استفاده کنم؟

hadilionson
سه شنبه 08 اسفند 1391, 17:55 عصر
بهترین راه برای یافتن زمان لود شدن sql با توجه به متفاوت بودن نوع آن، چک کردن service های ویندوز است که با دستورات زیر انجام میشه، البته برای چک کردن هر سرویسی بهترین راه همین هست


using System.ServiceProcess;
ServiceController sc = new ServiceController("MSSQL$SQLEXPRESS");
while (sc.Status != ServiceControllerStatus.Running)
{
System.Threading.Thread.Sleep(1000);
}
string path = "";
string[] p = Application.ExecutablePath.Split(new char[] { '\\' });
for (int i = 0; i < p.Length - 1; i++)
{
path += p[i] + @"\";
}
path += "Alert.exe";
System.Diagnostics.Process.Start(path);
Application.Exit();



ولی مشکل من بالا آمدن sql نیست، پیغامی که براتون گذاشتم بعد از بالا آمدن کامل sql درصورتیکه برنامه با Process.start("ExeName") اجرا بشه ایراد میگیره واقعاً برام گیج کنندست

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

hadilionson
سه شنبه 08 اسفند 1391, 18:40 عصر
دوستان عزیز، خوشبختانه مشکل من حل شد، توضیحات و برای اون دسته میدم که شاید یه وقت با این مسئله روبرو شدند
بهترین کار برای اجرای برنامه ای که دیتابیس sql داره ابتدا اجرای یک فایل exe واسطه هست که بعد از تکمیل لود شدن sql که در بالا توضیح داده شد، فایل exe اصلی به روش زیر فرا خوانده شه در رویداد load فرم واسطه این کد را قرار دهید


private void Form1_Load(object sender, EventArgs e)
{
ServiceController sc = new ServiceController("MSSQL$SQLEXPRESS");
while (sc.Status != ServiceControllerStatus.Running)
{
System.Threading.Thread.Sleep(1000);
}
string path = "";
string[] p = Application.ExecutablePath.Split(new char[] { '\\' });
for (int i = 0; i < p.Length - 1; i++)
{
path += p[i] + @"\";
}
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.FileName = "program.exe";

startInfo.WorkingDirectory = path;
startInfo.UseShellExecute = false;
System.Diagnostics.Process.Start(startInfo);
Application.Exit();
}



این کد با خط startInfo.UseShellExecute = false; به نتیجه خواهد رسید که باعث میشه فایل exe مانند کلیک کردن بر روی exe اجرا گردد

دلتنگ اسمان
سه شنبه 08 اسفند 1391, 21:53 عصر
دوست عزیز :
بنده از کدهایی که نوشتید خیلی سر در نیاوردم. میشه توضیح بدید که این کدها چیکار میکنند؟
البته چیزهایی که متوجه شدم اگه درست باشه اینه که : تا زمان لود MSSQL$SQLEXPRESS برنامه باید صبرکنه. بعدش هم آدرس مسیر را توی یه آرایه ریختی(چرا؟)
بعدش هم نمیدونم چه اتفاقی داره میفته. میشه دقیقتر توضیح بدید؟

hadilionson
شنبه 12 اسفند 1391, 09:57 صبح
دوست من، کد هایی که اشاره شده، برای اجرای درست فایل exe است، برای اینکار لازمه آدرسه فایل اگزه خودت رو بدست بیاری، تو این برنامه، فایل exe فایل جداگانه ای در پوشه اصلی برنامه هست، ما ابتدا مسیر پوشه اصلی را بدست آوردیم، بعد هم اون را به روش صحیح اجرا کردیم، workingdirectory، آدرس پوشه ای که exe در اون قرار داره را میگیره، که همان پوشه ای است که نرم افزار اصلی ما در آن قرار داره، اسم فایل exe که میخواهیم اجرا کنیم هم همان program.exe میباشه،
موفق باشی