PDA

View Full Version : سوال: تعریف صحیح کانکشن استرینگ در سی شارپ



MeysamTakta
دوشنبه 29 دی 1393, 23:25 عصر
سلام
من برای برنامم از SQLServer 2008 R2 استفاده میکنم و کانکشن استرینگمم :

Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\db ali.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True
خود بانک هم در داخل مسیر bin>Debug پروژه هس.
اما این کانکشن استرینگ اصلا نه تو سیستم خودم و نه تو سیستم مقصد اصلا جواب نمیده.
تو خود VS هم SQLEXPRESS 2008 نصب هست.
از اول پروژه بانک تو خود دیتابیس اتچ بود و از این کانکشن استرینگ استفاده میکردم ک مشکلی نداشت طبعا:

Data Source=.;Initial Catalog=ali;Integrated Security=True
کانکشن استرینگای زیادی تست کردم اما هیشکدوم جواب نمیده. مثل:

Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirec tory|\ali.mdf;Database=ali;Integrated Security=True;Connect Timeout=30
از چن نفر پرسیدم میگن شاید از فایروال سیستم باشه که معقول به نظر نمیرسه.
اینم ارورها
لطفا راهنمایی کنید
127730127731

mrprestige
دوشنبه 29 دی 1393, 23:37 عصر
سلام ، یه سوال دوست عزیز شما کانکشن رو دستی تایپ میکنید ؟

محمد آشتیانی
دوشنبه 29 دی 1393, 23:43 عصر
سلام
دوست من ، اول شما دقیقا بگو از کدوم نسخه از Sql Server استفاده میکنی؟
SqlServer 2008R2 یا Sql Server Express 2008R2

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

mrprestige
دوشنبه 29 دی 1393, 23:48 عصر
سلام
دوست من ، اول شما دقیقا بگو از کدوم نسخه از Sql Server استفاده میکنی؟
SqlServer 2008R2 یا Sql Server Express 2008R2

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

سلام جناب آشتیانی اتفاقا منم گیج شدم یه لحظه که کانکشن رو دیدم میخواستم بهشون عرض کنم اگه متن کانکشن رو از کادر Add New Data Source کپی کنه بهتر باشه.

MeysamTakta
دوشنبه 29 دی 1393, 23:50 عصر
سلام ، یه سوال دوست عزیز شما کانکشن رو دستی تایپ میکنید ؟

سلام نه خیر از app.config پروژه.
منتها چون جواب نداد مجبور هستم دستی ادیت کنم

MeysamTakta
دوشنبه 29 دی 1393, 23:52 عصر
سلام
دوست من ، اول شما دقیقا بگو از کدوم نسخه از Sql Server استفاده میکنی؟
SqlServer 2008R2 یا Sql Server Express 2008R2

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

با سلام
من از نسخه SqlServer 2008 R2 استفاده میکنم

MeysamTakta
سه شنبه 30 دی 1393, 00:00 صبح
سلام جناب آشتیانی اتفاقا منم گیج شدم یه لحظه که کانکشن رو دیدم میخواستم بهشون عرض کنم اگه متن کانکشن رو از کادر Add New Data Source کپی کنه بهتر باشه.

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

محمد آشتیانی
سه شنبه 30 دی 1393, 00:04 صبح
خب ، وقتی از این نسخه استفاده میکنی ، نیاز هست که اول تو محیط SqlServer Management Studio دیتابیست رو اتچ (Attach) کنی
بعد تو همون محیط لاگین بسازی (یا از لاگین پیش فرض استفاده کنی sa)
و نهایتا با کانکشن استرینگی شبیه به این به دیتابیست وصل بشی



Data Source=127.0.0.1;Initial Catalog=YourDBName ;Persist Security Info=True;User ID=sa;Password=123


جلوی DataSource ، اسم سرور رو بنویس ، 127.0.0.1 برای حالت لوکال هست و وقتی که SqlServer بصورت Default Instance نصب شده
جلوی Catalog ، اسم دیتابیس رو بنویس (فقط اسم دیتابیس ، نیاز به پسوند نیست)
جلوی UserID ، اسم لاگین رو بنویس
و جلوی Password ، رمز لاگین مورد نظرت رو وارد کن (بجای 123 که من نوشتم)


موفق باشید

mrprestige
سه شنبه 30 دی 1393, 00:08 صبح
ببین دوست من شما میتونی از منوی Data و وارد شدن به گزینه ی Add new Data Source مشکلتو به نحوی حل کنی به این ترتیب که وقتی روی این گزینه کلیک کردی کادری نمایش داده میشه دوباره روی دکمه Next کلید کنید بعد از اون کادری نمایش داده میشه روی New Connection کلیک کنید همچین کادری نشون داده میشه توی قسمتی که مشخص کردم ( شماره 1 ) اسم کامپیوترتون رو وارد کنید ( بادقت و رعایت حروف بزرگ و کوچیک) و توی قسمت بعد ( شماره 2 ) اگر اسم کامپیوترتون رو درست وارد کرده باشید اسم تمام جداولی که با sql ساختین رو میاره بعد از انتخاب جدولتون کادر رو تایید کنید127733

MeysamTakta
سه شنبه 30 دی 1393, 00:10 صبح
خب ، وقتی از این نسخه استفاده میکنی ، نیاز هست که اول تو محیط SqlServer Management Studio دیتابیست رو اتچ (Attach) کنی
بعد تو همون محیط لاگین بسازی (یا از لاگین پیش فرض استفاده کنی sa)
و نهایتا با کانکشن استرینگی شبیه به این به دیتابیست وصل بشی



Data Source=127.0.0.1;Initial Catalog=YourDBName ;Persist Security Info=True;User ID=sa;Password=123


جلوی DataSource ، اسم سرور رو بنویس ، 127.0.0.1 برای حالت لوکال هست و وقتی که SqlServer بصورت Default Instance نصب شده
جلوی Catalog ، اسم دیتابیس رو بنویس (فقط اسم دیتابیس ، نیاز به پسوند نیست)
جلوی UserID ، اسم لاگین رو بنویس
و جلوی Password ، رمز لاگین مورد نظرت رو وارد کن (بجای 123 که من نوشتم)


موفق باشید

خب در این صورت فقط در سیستم من جواب میده
اگر من بخوام در کامپیوتر مقصد استفاده کنم باید مجددا اتچ رو انجام بدم؟
اگر در سیستم مقصد SQLEXPRESS نصب باشه تکلیف چیه؟
سپاسگزارم که راهنمایی خواهید کرد.

MeysamTakta
سه شنبه 30 دی 1393, 00:11 صبح
ببین دوست من شما میتونی از منوی Data و وارد شدن به گزینه ی Add new Data Source مشکلتو به نحوی حل کنی به این ترتیب که وقتی روی این گزینه کلیک کردی کادری نمایش داده میشه دوباره روی دکمه Next کلید کنید بعد از اون کادری نمایش داده میشه روی New Connection کلیک کنید همچین کادری نشون داده میشه توی قسمتی که مشخص کردم ( شماره 1 ) اسم کامپیوترتون رو وارد کنید ( بادقت و رعایت حروف بزرگ و کوچیک) و توی قسمت بعد ( شماره 2 ) اگر اسم کامپیوترتون رو درست وارد کرده باشید اسم تمام جداولی که با sql ساختین رو میاره بعد از انتخاب جدولتون کادر رو تایید کنید127733

با تشکر
ولی من در سیستم خودم مشکلی ندارم
من میخوام در سیستم مقصد بدون اتچ کردن بانک کارم رو انجام بدم.

mrprestige
سه شنبه 30 دی 1393, 00:17 صبح
بعد از تایید کادر تو این قسمتی که مشخص کردم کلیک کنی متنی نمایش داده میشه اون متن همون متن کانکشن استرینگتون هست کپی کن جای همون متن قبلی کانکشنت باز از راهنمایی های آقای آشتیانی هم میتونی استفاده کنی نسبت به بنده با تجربه تر هستن .127734



با آرزوی موفقیت

mrprestige
سه شنبه 30 دی 1393, 00:20 صبح
با تشکر
ولی من در سیستم خودم مشکلی ندارم
من میخوام در سیستم مقصد بدون اتچ کردن بانک کارم رو انجام بدم.

این به اتج کردن کار نداره دوست من این فقط معرفی کانکشن استرینگ هست

محمد آشتیانی
سه شنبه 30 دی 1393, 00:22 صبح
در اینصورت شما دو راه دارید.

1- در سیستم مقصد SqlServer Enterprise رو نصب کنید و مراحل پست قبلی رو انجام بدید

2- در سیستم مقصد ، SqlServer Express (نسخه 2008R2 یا بالاتر) رو نصب کنید ، دیتابیس رو کنار فایل اجرایی برنامتون قرار بدید و از کانکشن استرینگ زیر استفاده کنید

* دقت کنید اگر SqlExpress رو با نام پیشفرض نصب نمی کنید ، حتما SQLEXPRESS رو در کانشکن استرینگ به نام Instance خودتون تغییر بدین
** نام دیتابیس هم در دو بخش از کانکشن استریگ باید وارد بشه که مشخصه



"Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirecto ry|\\test.mdf;Database=test;Integrated Security=True;Connect Timeout=30;User Instance=True"



موفق باشید

MeysamTakta
سه شنبه 30 دی 1393, 00:28 صبح
بسیار سپاسگزارم از راهنمایی های دو بزرگوار آقای آشتیانی و mrprestige (http://barnamenevis.org/member.php?338119-mrprestige) عزیز
من تست میکنم و نتیجه رو میگم که اگه احیانا جواب نداد مطرح بشه و دوستان دیگه هم استفاده کنن

silver189
سه شنبه 30 دی 1393, 09:46 صبح
دوست عزیز از این روش استفاده کنید :
http://barnamenevis.org/showthread.php?64210-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%DA%A9%D9%88%DA%86%DA%A9-%D9%88-%D9%85%D9%81%D9%8A%D8%AF-%D8%AF%D8%B1-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D9%BE&p=2155558&viewfull=1#post2155558

SabaSabouhi
سه شنبه 30 دی 1393, 12:46 عصر
سلام



public static string CreateConnectionString( string dbServer, string database, string username, string password ) {
var connectionBuilder = username == string.Empty
? new SqlConnectionStringBuilder {
DataSource = dbServer,
InitialCatalog = database,
PersistSecurityInfo = true,
MultipleActiveResultSets = true
}
: new SqlConnectionStringBuilder {
DataSource = dbServer,
InitialCatalog = database,
UserID = username,
Password = password,
MultipleActiveResultSets = true
};
return connectionBuilder.ConnectionString;
}



صبا صبوحی

MeysamTakta
پنج شنبه 02 بهمن 1393, 17:32 عصر
با راهنمایی هایی که دوستان اینجا انجام دادن در سیستم مقصد هم SqlServer 2008 R2 EXPRESS رو نصب کردم.
و از کانکشن استرینگ زیر استفاده کردم:

Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirecto ry|\\PharmacySystem.mdf;Database=PharmacySystem;In tegrated Security=True;Connect Timeout=30;User Instance=True
اما ارور Invalid value for key 'attachdbfilename داره و اصلا پایگاه داده رو نمیشناسه
بانک هم در مسیر bin/Debug کنار فایل اجرایی پروژه قرار داره.
Sql Server 2008 R2 EXPRESS هم با نام پیش فرض خودش نصب شده
اگه ممکنه راهنمایی کنید من شنبه تحویل پروژه دارم فقط تو این کانکشن گیر کردم :ناراحت:

jd.mn98
جمعه 03 بهمن 1393, 13:57 عصر
عذر میخوام دوستان شاید سوالم مربوط به تاپیک نباشه
ولی میخواستم بدونم این sa چیه؟؟ من خیلی جاها دیدم از sa در sql استفاده میشه

ali.b.y
جمعه 03 بهمن 1393, 19:33 عصر
سلام.
یه نکته در مورد فایل هایی که توسط برنامه به بانک وصل می شند یا همون اتچ می شند اینکه وقتی یک فایل را به بانک با یک نامی اتچ می کنیم بار دیگه با همون نام نمی تونیم همون فایل را اتچ کنیم و به ما خطایی تکراری بودن یا موجود بودن دیتا بیس را میده.

به نظرم خطای شما هم همین باشه.

توجه داشته باشید که باید برنامه را طوری بنویسید که هنگام خروج از برنامه فایل اتچ شده دیتچ بشه تا دفعه بعدی با مشکل رو به رو نشید.
-------------------------------
حالا راه حل چیه . خب چند راه حل وجود داره
- مثلا اینکه هر بار با نام جدید اتچ کنید که این راه اصلا مناسب نیست اولا هر بار نام جدید ایجاد کردن در برنامه مشکلات خودشو داره که باز ممکنه همون نام جدید هم وجود داشته باشه (اتفاقه دیگه ممکنه بیفته) و اینکه به مرور پیگاه داده پر از نام و لینک فایل میشه.

- یه راه دیگه اینه که قبل از اتچ کردن توسط یک کوئری دیتا بیس احتمالی را دیتچ کنی بعد فایلت را اتچ کنی
کدش را می زارم اگه متوجه نشدی بگو تا توضیح بیشتر بدم.



try
{
SqlConnect1.ConnectionString = @"Data Source=.\sqlexpress;Integrated Security=True;Connect Timeout=30";
SqlCommand.CommandText = "ALTER DATABASE [DBname] SET OFFLINE WITH ROLLBACK IMMEDIATE \n\r exec sp_detach_db @dbname = [DBname]";
SqlCommand.Connection = SqlConnect1;
SqlConnect1.Open();
SqlCommand.ExecuteNonQuery();
SqlConnect1.Close();



}

catch { }

نکته : در قسمت Data Source با توجه به بانک اطلاعاتی نصب شده در سیستم می توان یکی از موارد زیر را جایگزین کرد



Data Source= [.] , [myServerName\myInstanceName] , [PC-name\myInstanceName] , [(local)\MyInstanceName]
[PC-name\SQLEXPRESS] , [.\MSSQLSERVER] , [.\SQLEXPRESS]
[(local)] , [(local)\SQLEXPRESS] , [(local)\MSSQLSERVER] [(localdb)\v11.0]
[localhost] , [127.0.0.1,1433] And more

موارد داخل پرانتز باید به همین شکل و با پرانتز نوشته شود - به جای Pc-name باید نام کاربری ویندوز نوشته شود , البته استفاده از این نوع پیشنهاد نمیشه چون کوئری در یک سیستم دیگه کار نمی کنه و به جای اون همیشه یک . استفاده میشه - myInstanceName نامی هست که هنگام نصب پایگاه داده به اون داده میشه نکته ای که هست اینکه این نام به صورت پیش فرض یکی از نامه های MSSQLSERVER یا SQLEXPRESS می باشد ولی توسط شخصی که پایگاه داده را نصب می کند می تواند تغییر کند پس اگر ما (برنامه نویس) اون شخصی نیستیم که پایگاه داده را در سیستم مشتری نصب خواهد کرد نمی توانیم مطمئن شویم سرویس دهنده پایگاه داده با چه نامی نصب شده و مشکل از همین جا شروع میشه
برای همین شما (برنامه نویس) باید طوری برنامه را بنویسید که حالت های مختلفی را پوشش بده
-------------------------------
خب کد بالا درصورت وجود پایگاه داده ای با نام DBname آن را دیتچ می کند حالا ما می توانیم فایل خود را اتچ کنیم

چیزی شبیه این


SqlConnect1.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=" + Application.StartupPath + @"\DB.mdf;Integrated Security=True;Initial Catalog=[DBname];Connect Timeout=30"

-هرگز از Instance=True در کوئری استفاده نکنید
- اگر تو برنامه چندین بار به پایگاه وصل می شید که میشید دیگه لازم نیست هر دفعه AttachDbFilename را بنویسید
بلکه فقط در اتصال اول لازمه



SqlConnect1.ConnectionString = @"Data Source=.\SQLEXPRESS;Integrated Security=True;Initial Catalog=[DBname];Connect Timeout=30"


اگه باز مشکلی بود بگو

MeysamTakta
شنبه 04 بهمن 1393, 13:03 عصر
سلام.
یه نکته در مورد فایل هایی که توسط برنامه به بانک وصل می شند یا همون اتچ می شند اینکه وقتی یک فایل را به بانک با یک نامی اتچ می کنیم بار دیگه با همون نام نمی تونیم همون فایل را اتچ کنیم و به ما خطایی تکراری بودن یا موجود بودن دیتا بیس را میده.

به نظرم خطای شما هم همین باشه.

توجه داشته باشید که باید برنامه را طوری بنویسید که هنگام خروج از برنامه فایل اتچ شده دیتچ بشه تا دفعه بعدی با مشکل رو به رو نشید.
-------------------------------
حالا راه حل چیه . خب چند راه حل وجود داره
- مثلا اینکه هر بار با نام جدید اتچ کنید که این راه اصلا مناسب نیست اولا هر بار نام جدید ایجاد کردن در برنامه مشکلات خودشو داره که باز ممکنه همون نام جدید هم وجود داشته باشه (اتفاقه دیگه ممکنه بیفته) و اینکه به مرور پیگاه داده پر از نام و لینک فایل میشه.

- یه راه دیگه اینه که قبل از اتچ کردن توسط یک کوئری دیتا بیس احتمالی را دیتچ کنی بعد فایلت را اتچ کنی
کدش را می زارم اگه متوجه نشدی بگو تا توضیح بیشتر بدم.



try
{
SqlConnect1.ConnectionString = @"Data Source=.\sqlexpress;Integrated Security=True;Connect Timeout=30";
SqlCommand.CommandText = "ALTER DATABASE [DBname] SET OFFLINE WITH ROLLBACK IMMEDIATE \n\r exec sp_detach_db @dbname = [DBname]";
SqlCommand.Connection = SqlConnect1;
SqlConnect1.Open();
SqlCommand.ExecuteNonQuery();
SqlConnect1.Close();



}

catch { }

نکته : در قسمت Data Source با توجه به بانک اطلاعاتی نصب شده در سیستم می توان یکی از موارد زیر را جایگزین کرد



Data Source= [.] , [myServerName\myInstanceName] , [PC-name\myInstanceName] , [(local)\MyInstanceName]
[PC-name\SQLEXPRESS] , [.\MSSQLSERVER] , [.\SQLEXPRESS]
[(local)] , [(local)\SQLEXPRESS] , [(local)\MSSQLSERVER] [(localdb)\v11.0]
[localhost] , [127.0.0.1,1433] And more

موارد داخل پرانتز باید به همین شکل و با پرانتز نوشته شود - به جای Pc-name باید نام کاربری ویندوز نوشته شود , البته استفاده از این نوع پیشنهاد نمیشه چون کوئری در یک سیستم دیگه کار نمی کنه و به جای اون همیشه یک . استفاده میشه - myInstanceName نامی هست که هنگام نصب پایگاه داده به اون داده میشه نکته ای که هست اینکه این نام به صورت پیش فرض یکی از نامه های MSSQLSERVER یا SQLEXPRESS می باشد ولی توسط شخصی که پایگاه داده را نصب می کند می تواند تغییر کند پس اگر ما (برنامه نویس) اون شخصی نیستیم که پایگاه داده را در سیستم مشتری نصب خواهد کرد نمی توانیم مطمئن شویم سرویس دهنده پایگاه داده با چه نامی نصب شده و مشکل از همین جا شروع میشه
برای همین شما (برنامه نویس) باید طوری برنامه را بنویسید که حالت های مختلفی را پوشش بده

-------------------------------
سلام.
این قسمت رو مطابق کدهای شما جلو رفتم و این ارور رو داد :
User does not have permission to alter database 'PharmacySystem', the database does not exist, or the database is not in a state that allows access checks.
ALTER DATABASE statement failed.
The database 'PharmacySystem' does not exist. Supply a valid database name. To see available databases, use sys.databases.



خب کد بالا درصورت وجود پایگاه داده ای با نام DBname آن را دیتچ می کند حالا ما می توانیم فایل خود را اتچ کنیم

چیزی شبیه این


SqlConnect1.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=" + Application.StartupPath + @"\DB.mdf;Integrated Security=True;Initial Catalog=[DBname];Connect Timeout=30"

-هرگز از Instance=True در کوئری استفاده نکنید
- اگر تو برنامه چندین بار به پایگاه وصل می شید که میشید دیگه لازم نیست هر دفعه AttachDbFilename را بنویسید
بلکه فقط در اتصال اول لازمه



SqlConnect1.ConnectionString = @"Data Source=.\SQLEXPRESS;Integrated Security=True;Initial Catalog=[DBname];Connect Timeout=30"


اگه باز مشکلی بود بگو

در مورد اتچ کردن هم این ارور رو میده :
Directory lookup for the file "C:\Users\Meysam\Documents\Visual Studio 2010\Projects\PharmacySystem\PharmacySystem\bin\De bug\PharmacySystem.mdf" failed with the operating system error 5(Access is denied.).
Cannot attach the file 'C:\Users\Meysam\Documents\Visual Studio 2010\Projects\PharmacySystem\PharmacySystem\bin\De bug
-----------------------------
من اطلاع زیادی در مورد SQL ندارم ولی فک کنم باید تنظیماتی در مورد Remote Connection پایگاه داده انجام داد

ali.b.y
شنبه 04 بهمن 1393, 14:12 عصر
سلام.
در مورد خطای اولی خب طبیعی ممکنه دیتابیسی با نام وارد شده اصلا وجود نداشته باشه که بخواد آن را دیتچ کنه به خاطر همین کد ها را داخل
try{} catch{} i می نویسیم تا اگر خطایی رخ داد برنامه قطع نشه و فکر کنم شما این دستورات را خارج از کد ترای نوشتی برای همین خطا باعث خروج از برنامه شده.

خطای دوم علت های متفاوتی می تونه داشته باشه بهتره این کار را بکنی وارد پوشه ی Debug شو و نام فایل پایگاه داده را عوض کن بعد حتما کد های برنامه ت را هم اصلاح کن و نام جدید را بنویس و دوباره برنامه را اجرا کن ببین خطا داره یا نه اگر نداشت که هیچ اگر دوباره همون خطا را داد حتما میسر فایل یا نام فایل پایگاه دادت را درست وارد نمی کنی.
می تونی فایل پایگاه دادت را موقتا برای امتحان به درایو c ببری و در قسمت کوئری AttachDbFilename=c:\\db.mdf قرار بده و تست کن ببین جواب میده (فراموش نکن که از دو تا \\ استفاده کنی نه یکی)البته اگر از @ قبل از رشته استفاده نکردی اگر کردی یکی قرار بده

موفق باشی