# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > Setup و Deployment >  مشکل در وصل شدن به دیتابیس بعد از Setup برنامه

## mohammad87

سلام حرفه ای ها
آقا توی پست قبلی من مشکلم حل شد ... خیلی حال دادین ....
حالا یک مشکلی که دارم اینکه : بعد از Setup برنامه اگه دیتا بیس توی همون جایی که برنامه نصب شده باشه نمی تونه به برنامه وصل بشه ... حتما باید دیتا بیسو همون جایی که برنامه رو نوشتم ببرم تا بتونه تشخیص بده ... حالا اگه شما میدونید که تکنیکی هست که همون جایی که دیتابیس و برنامه نصب میشه بتونه برنامه با دیتا بیس ارتباط برقرار کنه بگید...آیا توی Connection String  باید کاری کنم؟ که دیگه احتیاجی به بردن دیتابیس به مکان خاصی نباشه ؟

----------


## gdevnb

Application.StartupPath + @"\data.mdb"

----------


## mohammad87

nدوست عزیز اینو کجا باید بزارم یکم بیشتر توضیح بده

----------


## gdevnb

مسیر جاری برنامه هستش. یعنی جایی که برنامه شما اجرا میشه.
بانک اطلاعاتیتون که access هستش رو کنار فایل exe بزار و مسیر بانک رو داخل ConnectionString هستش رو به کد بالا تغییر بده
.
strCon="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
 Application.StartupPath + @"\data.mdb";

----------


## mohammad87

مسیر من اینه چی رو باید تغییر بدم 
Data Source=.\SQLEXPRESS;AttachDbFilename=C:\WindowsApp  lication8\WindowsApplication8\Database1.mdf;Integr  ated Security=True;User Instance=True

----------


## gdevnb

> مسیر من اینه چی رو باید تغییر بدم 
> Data Source=.\SQLEXPRESS;AttachDbFilename=C:\WindowsApp  lication8\WindowsApplication8\Database1.mdf;Integr  ated Security=True;User Instance=True


دو ست عزیز شما بانک اطلاعاتیتون SqlServer هست
برای Attach کردنش از کد زیر استفاده کن
اول بانکتو (هر دو فایل) بزار تو پوشه db کنار فایل exe

   string dbname = "Database1.mdf";
            string commandtext = @"EXECUTE sp_attach_db @dbname = 'Database1'," +
                @"@filename1 = '" + Application.StartupPath + "\\db\\Database1.mdf'," +
                @"@filename2 = '" + Application.StartupPath + "\\db\\Database1.ldf',";
//connectionstr="Data Source=.\sqlexpress;Initial Catalog=master;Integrated Security=True";
            SqlConnection con = new SqlConnection(connectionstr);
            SqlCommand com = new SqlCommand(commandtext, con);
            con.Open();
            com.ExecuteNonQuery();
            con.Close();

----------


## gdevnb

بعد از attach کردن رشته اتصالتون میشه
connectionstr="Data Source=.\sqlexpress;Initial Catalog=Database1;
Integrated Security=True";

----------


## mohammad87

آقا ما که نفهمیدیم چه ار باید بکنیم ... فکر می کنم راه حل ساده تری هم وجود داشته باشه ؟ کسی نمی دونه؟

----------


## choobin84

> آقا ما که نفهمیدیم چه ار باید بکنیم ... فکر می کنم راه حل ساده تری هم وجود داشته باشه ؟ کسی نمی دونه؟


چون از بانک sql استفاده می کنید باید engin اونو نصب کرده باشید. نصب به صورت دستی یا با installshield. 
بانکتون هم همونطوری که گفته اند باید attach بشه.
connectionstring رو هم به شکل زیر تغییر بدید

connectionstring="server=(local);trusted_connectio  n=yes;database=yourdatabasename;"

----------


## mohammad87

من اومدم به connection String این کد رو اضافه کردم : 
Data Source=.\SQLEXPRESS;AttachDbFilename=Application.S  tartupPath\\Database1.mdf;Integrated Security=True;User Instance=True
ولی بازم ERROR می ده

----------


## gdevnb

به این سوالها جواب بده
1-آیا در سیستم مقصد SqlServer نصبه؟
2-آیا بانک شما به سرور اسکیوال  Attach شده؟

در صورت مثبت بودن هر دو جواب از ConnectonString زیر استفاده کن.
connectionstr="Data Source=.\sqlexpress;Initial Catalog=نام دیتابیس مورد نظرتون;Integrated Security=True";

----------


## mohammad87

من دیتا بیس خودمو توی سی شارپ ساختم ... وقتی ConnectionString من مثل زیر هست مشکلی نداره Data Source=.\SQLEXPRESS;AttachDbFilename=C:\WindowsApp  lication8\WindowsApplication8\Database1.mdf;Integr  ated Security=True;User Instance=True
حالا وقتی میام توی AttachDbFilename تغییر می دم مشکل پیش میاد ... sql server نصبه ,مشکل توی همون attach شدنه ... آخه من می خوام همو جایی که نصب میشه دیتا بیس رو از همون جا بخونه ... نمی دونید توی propreties کانکتیون اگه تغییراتی بدم بشه؟

----------


## vpourshab

برو توی فایل app.config و connectionString و به صورت زیر تغییر بده 

Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector  y|\database1.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True
همچنین درون برنامه هر جا داری اینجور بنویس


Connectionstring = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector  y|\Database1.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"

و دیتا بیس رو درس جایی که exe برنامه ات اونجاست قرار بده و اجرا کن درست میشه :چشمک:

----------


## razavi_university

ConnectionStringی که شما گذاشتید مربوط به Sqlexpress هست در صورتی که دیتابیس ما در خود SQL2005 باشد چه کنیم؟
(به دلایلی نمیتونم از ‌SQLExpress استفاده کنم)

----------


## mohammad87

ای ول vpourshab بابا خیلی باحالی درست شد ....
بچه ها ممنون .

----------


## gdevnb

> ConnectionStringی که شما گذاشتید مربوط به Sqlexpress هست در صورتی که دیتابیس ما در خود SQL2005 باشد چه کنیم؟
> (به دلایلی نمیتونم از ‌SQLExpress استفاده کنم)


 
با سلام
در حین نصب Sql2005 به جای local یه اینستنس با نام SqlExpress ایجاد میکنیم.

----------


## razavi_university

> در حین نصب Sql2005 به جای local یه اینستنس با نام SqlExpress ایجاد میکنیم.


متوجه نشدم میشه بیشتر توضیح بدی؟
منظورت از حین نصب زمان نصب برنامه خودمونه؟

----------


## gdevnb

در صورتی که Sql Server روی سیستم نصب باشه میتونه بصورت local نصب بشه یا همون Default Instanse یا اینکه شما بصورت یه Instanse  با نام دلخواه نصبش کنید که بعد میتونید به صورت زیر بهش دسترسی داشته باشید(local)\InstanseNameدر واقع حتی زمان نصب برنامه خومون اگه مایل باشیم حتی اگه Sql Server هم نصب باشه می تونیم اونو به صورت یه Instanse  دیگه نصب کنیم(با نام دلخواه)(البته تعدادشون محدوده دقیقاً نمی دونم رو هر سیستم حداکثر چند تا Instanse میتونه نصب باشه) که دیتاهای کاملاً مستقل از حالت Default عمل میکنه. در واقع شما یه سرویس مجزای دیگه از Sqlserver دارید.

----------


## razavi_university

خوب من الان دیتابیسم نصبه
کل اطلاعات و Sp و ... روش هست
الان که می خوام برنامه نصب واسش بسازم چه کنم؟

----------


## programmable

> دو ست عزیز شما بانک اطلاعاتیتون SqlServer هست
> برای Attach کردنش از کد زیر استفاده کن
> اول بانکتو (هر دو فایل) بزار تو پوشه db کنار فایل exe
> 
> 
>  string dbname = "Database1.mdf";
>            string commandtext = @"EXECUTE sp_attach_db @dbname = 'Database1'," +
>                @"@filename1 = '" + Application.StartupPath + "\\db\\Database1.mdf'," +
>                @"@filename2 = '" + Application.StartupPath + "\\db\\Database1.ldf',";
> ...


من برنامه ام از یه دیتا بیس استفاده میکنه که باید به SQL server اتچ کنمش . این کار رو میخوام در یک فایل exe قرار بدم که کاربر با احرای اون این عمل رو انجام بده و کار نصب برنامه راحت باشه ! با استفاده از کدی که شما گذاشتید این کار امکان پذیر نیست لطفا بگید چکار کنم؟

----------


## mohammad87

> من برنامه ام از یه دیتا بیس استفاده میکنه که باید به SQL server اتچ کنمش . این کار رو میخوام در یک فایل exe قرار بدم که کاربر با احرای اون این عمل رو انجام بده و کار نصب برنامه راحت باشه ! با استفاده از کدی که شما گذاشتید این کار امکان پذیر نیست لطفا بگید چکار کنم؟


منظور شما اینکه چطوری دیتابیس رو همراه با ستاپ کردن برنامه اجرا بشه و نصب بشه یا اینکه هرجا برنامه اجرایی تون هست دیتابیس و تشخیص بده و وصل بشه ؟
برای اولی می تونی از نرم افزار Installware استفاده کنی ولی برای دومی از کد زیر توی Connection string خودت استفاده کنی : Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector  y|\database1.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True

----------


## gdevnb

> خوب من الان دیتابیسم نصبه
> کل اطلاعات و Sp و ... روش هست
> الان که می خوام برنامه نصب واسش بسازم چه کنم؟


به نظر من بهترین روش اینه که فایلها در سیستم مقصد Attach بشه اونم از طریق کدی که خودمون نوشتیم.در جریان نصب برنامه , در پایان نصب این برنامه رو اجرا کنه(از طریق برنامه ستاپ) تا دیتابیس رو attach کنه.




> من برنامه ام از یه دیتا بیس استفاده میکنه که باید به SQL server اتچ کنمش . این کار رو میخوام در یک فایل exe قرار بدم که کاربر با احرای اون این عمل رو انجام بده و کار نصب برنامه راحت باشه ! با استفاده از کدی که شما گذاشتید این کار امکان پذیر نیست لطفا بگید چکار کنم؟


کد رو ضمیمه کردم. اونو بررسی کنید مشکلتون حل میشه.
در ضمن یه برنامه اجرایی رو هم بزودی می ذارم که این کار رو برای شما انجام می ده.
روش استفاده:
فایلهای بانک اطلاعاتی رو درکنار فایل exe در پوشه db قرار بدید.
فایل DbCreator.exe.config رو باز کرده و بصورت زیر تنظیم کنید.

            <setting name="dbname" serializeAs="String">
                <value>Hesabdar</value>
            </setting>
            <setting name="file1" serializeAs="String">
                <value>Hesabdar.mdf</value>
            </setting>
            <setting name="file2" serializeAs="String">
                <value>Hesabdar_log.ldf</value>
            </setting>
            <setting name="connectionstr" serializeAs="String">
                <value>Data Source=.\sqlexpress;Initial Catalog=master;Integrated Security=True</value>
            </setting>در مثال بالا فرض شده نام بانک شما Hesabdar نام فایل mdf شما Hesabdar.mdf و نام فایل ldf شما Hesabdar_log.ldf می باشد.
در صورتی که ازتعداد فایلهای بیشتری(ndf) استفاده میکنید سورس رو دستکاری کنید

----------


## programmable

ممنون از پاسختون
ولی اینکه ما کانکشن استرینگ رو به این صورت در پوشه برنامه در دسترس داشته باشیم آیا از نظر امنیتی مشکلی نداره؟

----------


## gdevnb

این فقط یه مثال ساده برای این کار هستش.در ضمن زمانی که شما قصد ایجاد بانک اطلاعاتی از طریق پروژه ستاپ رو داشته باشید لزومی به کپی کردن این فایل و برنامه مربوطه در مکان نصب نیست. واصلاً ایجاد بانک جزئی از ستاپ میشه که فقط لازمه دیتابیس ما کپی بشه و برنامه ای که از این دیتابیس استفاده میکنه. نه برنامه ای که بانک اطلاعاتی رو attach میکنه.

----------

