PDA

View Full Version : سوال: خطای باز نشدن برنامه



amir-aa
شنبه 19 آذر 1390, 14:56 عصر
سلام ببخشید من برنامم رو نمیتونم باز کنم ....یعنی ارور ویندوز میده از اون موقع که توی صفحه اول ست کردم که خودش اتوماتیک دیتابیس رو attach کنه اینجوری شده.....چیکار کنم
اینم کدش:


private void Form1_Load(object sender, EventArgs e)
{
string connectionstring = "Data Source=.;User Id=sa;Password=1";
SqlConnection conn = new SqlConnection(connectionstring);
SqlCommand cmd = new SqlCommand("", conn);
SqlDataReader rdr;

cmd.CommandText = "SELECT [name] FROM sys.sysdatabases where [name]='anbardar'";

conn.Open();

rdr = cmd.ExecuteReader();
if (rdr.Read())
{


}
else
{
rdr.Dispose();
cmd.Dispose();
SqlCommand cmd1 = new SqlCommand("", conn);
cmd1.CommandText = "USE master CREATE DATABASE anbardar ON PRIMARY (FILENAME = '" + Application.StartupPath + "\\anbardar.mdf') LOG ON (FILENAME = '" + Application.StartupPath + "\\anbardar_log.ldf') FOR ATTACH go";
cmd1.ExecuteNonQuery();
}
conn.Close();
}



ارورش اینه
Error 1 Unable to copy file "D:\Documents and Settings\ahmadabadiha\My Documents\Visual Studio 2005\Projects\anbardar\anbardar\anbardar.mdf" to "bin\Debug\anbardar.mdf". The process cannot access the file 'bin\Debug\anbardar.mdf' because it is being used by another process. anbardar

amir-aa
شنبه 19 آذر 1390, 15:20 عصر
کسی نیست کمک کنه؟؟؟؟؟آقا خواهشا راهنمایی کنید

reza_mostafavi63
شنبه 19 آذر 1390, 17:49 عصر
بايد يه شرط بزاري كه ببيني اگه ديتابيست قبلا اتچ شده ، ديگه اتچ رو انجام نده ... چون قبلا اتچ شده ديگه

amir-aa
یک شنبه 20 آذر 1390, 16:40 عصر
من این شرطو گذاشتم که عزیز دلم دستور if بخاطر همینه دیگه

zarrinnegar
یک شنبه 20 آذر 1390, 16:46 عصر
این که خطاش توش معلومه

'bin\Debug\anbardar.mdf'

میگه نمیتونه به این مسیر دسترسی داشته باشه
2 حالت داره یا مسیری با نام فایل وجود نداره
یا این فایل بازه و نمیتونه کپیش کنه
اگه الان توی دیتابیست یا توی ویژوال بازش کردی ببند بعد exe فایل رو اجرا کن نه از debug ویژوال

amir-aa
سه شنبه 22 آذر 1390, 16:23 عصر
خیلی آقایی
دستت درد نکنه شما درست گفتی

amir-aa
شنبه 17 دی 1390, 16:28 عصر
سلام آقا حالا دوباره به مشکل برخوردم ببینید کد صفحه اول رو تغییر دادم کردمش

private void Form1_Load(object sender, EventArgs e)
{
string connectionstring = "Data Source=.;User Id=sa;Password=1";
SqlConnection conn = new SqlConnection(connectionstring);
string query = "USE master EXEC sp_attach_db @dbname = 'anbardar',@filename1 = '" + Application.StartupPath + "\\anbardar.mdf' , @filename2 ='" + Application.StartupPath + "\\anbardar_log.ldf'";
SqlCommand cmd1 = new SqlCommand(query,conn);
conn.Open();
try
{
cmd1.ExecuteNonQuery();
}
catch
{
}
conn.Close();
}

private void glassButton1_Click_1(object sender, EventArgs e)
{
string connectionstring = "Data Source=.;Initial Catalog=anbardar;User Id=sa;Password=1";
SqlConnection conn = new SqlConnection(connectionstring);
string query = "select * from entering where username='" + username.Text + "' and pass='" + pass.Text + "'";
SqlCommand cm = new SqlCommand(query, conn);
conn.Open();
SqlDataReader dr = cm.ExecuteReader();
if (dr.Read())
{
string a = dr["policy"].ToString();
if (a == "anbardar")
{
this.Hide();
Form2 f2 = new Form2();
f2.ShowDialog();

}
}


اما بازم همونجوریه.....
یه کمک بکنید خواهشا....شما اگه میتونی یدفعه فکر کنم باید team Viewer به من وصل بشی نشونم بدی چطور درستش کنم آخه خیلی مهمه
تازه یه چیز دیگه هم هست.وقتی دیتابیسم detach شده هستش دیگه این پیام رو نمیده

zarrinnegar
شنبه 17 دی 1390, 22:51 عصر
ببین
قبل از اتچ کردن چک کن ببین دیتابیست وجود داره یا نه

USE [master] IF NOT EXISTS (Select name from sys.databases WHERE name = N'" & dbname & "')

میشه این دستور
string dbname="anbardar";
string query = "USE [master] IF NOT EXISTS (Select name from sys.databases WHERE name = N'" & dbname & "') EXEC sp_attach_db @dbname = 'anbardar',@filename1 = '" + Application.StartupPath + "\\anbardar.mdf' , @filename2 ='" + Application.StartupPath + "\\anbardar_log.ldf'";

amir-aa
یک شنبه 18 دی 1390, 10:00 صبح
آقا منم همین کارو با try,catch انجام دادم با این روش شما هم انجام دادم اما همون خطا رو میده.
اشکال از جای دیگست
چون وقتی کل کد های این فرم رو پاک میکنم بازم همین ارور رو میده

zarrinnegar
یک شنبه 18 دی 1390, 13:38 عصر
عکس خطا رو بزار

amir-aa
یک شنبه 18 دی 1390, 15:27 عصر
بفرمایید
80382

zarrinnegar
یک شنبه 18 دی 1390, 19:14 عصر
خوب این نشون میده که بانک اطلاعاتی باز مونده و نمیتونه روی اون چیزی رو کپی کنه
ممکنه به خاطر این باشه که الان خود ویژوال هم بازش کرده
ویژوال رو ببند با Exe اجرا کن ببین همین خطا رو میده یا نه

amir-aa
یک شنبه 18 دی 1390, 22:54 عصر
این خطا رو نمیده اما تا وقتی نتونه رو دیتابیس کپی کنه تنظیمات جدید برنامه ذخیره نمیشه یعنی با هر تغییر رو برنامه باید دیتابیسم رو از نو attach کنم.تازه اینکار یک مشکل دیگه هم داره اونم اینکه هیچ تغییری روی دیتابیسم اعمال نمیشه.هر رکورد جدیدی که ذخیره میشه بعد از یک بار detach کردن از بین میره

zarrinnegar
یک شنبه 18 دی 1390, 23:18 عصر
چرا باید هی اتچ و دیتچ کنید
مگه اون کدی رو که نوشتم اجرا نکردید که قبلش چک میکنه اگه وجود نداشت اتچ کنه؟

amir-aa
دوشنبه 19 دی 1390, 09:34 صبح
آره اجرا کردم
من اون کارو به انواع دیگه هم انجام دادم اما این مشکلش جای دیگست همونطور که می بینید در خطا ی داده شده هیچ لاین یا فرمی مشخص نشده

zarrinnegar
دوشنبه 19 دی 1390, 09:42 صبح
سورس برنامت چقدره با بانک rar کن بزار چک کنم

amir-aa
دوشنبه 19 دی 1390, 16:17 عصر
بفرمایید
http://www.4shared.com/rar/QXGRXHVm/anbardar.html

zarrinnegar
دوشنبه 19 دی 1390, 23:47 عصر
اشکال پروژت معلوم شد( البته من کریستال ریپورت و یه سری dll هاتو نداشتم کلی وقت گرفت خطا هاشو پاک کنم)

مشکل اینجاست که اومدی روی فایل Mdf توی پروژه گفتی که همیشه کپی کنه توی فولدر Bin
خوب وقتی بانکت یک بار اتچ میشه در واقع دیتابیس توی فولدر bin به sql اتچ میشه و دفعه دوم که پروژه رو کامپایل میکنی و یا اجرا میکنی دوباره میخواد از توی مسیر پروژه به فولدر bin کپی کنه و نمیتونه

شما باید توی قسمت Solotion explorer روی فایل anbardar.mdf کلیک کنی و توی قسمت propertis گزینه copy to output directory رو یا بزاری روی Do not copy و یا copy if newer
که یا اصلا کپی نشه و یا اگر نبود کپی بشه


یک مطلب دیگه اینکه شما برای اینکه تست کنی که بانک اطلاعاتت از فولدری که برنامه اجرا میشه به sql اتچ میشه یا نه که تست گرفتی دیگه لازم نیست که هی کپی کنی توی Bin و هی اتچ کنی و چک کنی
اصلا دیتابیست رو بزار خارج پروژه بعد به sql اتچ کن و همیشه توی ویژوال هم از اون استفاده کن که بعد از هر تغییر در دیتابیس هی نخوای بانک رو توی فولدر Bin بروز کنی
این بروز کزدن مال آخر پروژه است که میخوای تحویل بدی که اون موقع هم دستی کپی میکنی توی Bin و بهش تحویل میدی

موفق باشی

amir-aa
سه شنبه 20 دی 1390, 11:11 صبح
آقا خدعا خیرت بده.اما من در این بحث دوم منظورت رو نفهمیدم.آخه من نمیخوام خودم پروژه رو نصب کنم...کسی که میخواد رو سیستم نصب کنه شاید بلد نباشه که دیتابیس رو چجوری کپی و اتچ و دیتچ کنه خوب!!!!!

zarrinnegar
سه شنبه 20 دی 1390, 12:53 عصر
ببین اصلا فعلا بی خیال دیتابیس شو و خارج از پروژه کپی کن و بهش وصل شو و اجرا کن
مشکلی هم پیش نماید چرا؟
چون که دیتابیست اتچ هست و اون قسمت از برنامه که میخوار دیتابیس رو اتچ کنه چون چک میکنه میبینه دیتابیس هست دیگه سراغ فولدری که برنامه داره اجرا میشه نمیره که دیتابیس رو اتچ کنه
خوب
بعد که برنامتو نوشتی تموم شد یک پوشه جدید میسازی و هر چی توی پوشه Bin هست رو توش کپی میکنی و بعد تازه میای فایلهای دیتابیست رو هم کپی میکنی توی این پوشه جدید
بعد این پوشه رو رایت میکنی میدی دست مشتری

این ساده ترین حالت بدون setup بود
دیگه مشکل چیه؟