PDA

View Full Version : سوال: مشكل در connection string هنگام استفاده از sql server 2008



Nima_kyan
چهارشنبه 04 مرداد 1391, 19:50 عصر
با سلام و تشكر از همه دوستان من هم با كانكشن استرينگ يه خورده مشكل دارم اگه بتونيد راهنمايي كنيد ممنون ميشم. "قبل مطرح سوال جستجو كردم ولي متاسفانه به نتيجه اي نرسيدم"
من تا حالا با sql server 2005 كار ميكردم و ديتاسورس كانكشن استرينگم رو برابر (Local) قرار ميدادم
1

Data Source=(local)




و مشكلي هم نداشت ولي تو sql server2008 وقتي ديتاسورس كانكشن استرينگم رو برابر (Local) قرار ميدم error ميده.و فقط زماني كار ميكنه كه مثلا بنويسم(فرض بر اينكه instance رو sql قرار دادم)

Data Source=.\\sql
حالا ميخوام بدونم راهي نداره كه همون (local) كاركنه؟ و يا اينكه اگه بخوام از همين كد

Data Source=.\\sql
استفاده كنم واسه اجراي برنامه ام رو سيستم مقصد به مشكل برنميخورم؟ رو سيستم مقصد هم بايد موقع نصبsql server واسه instance مقدار sql رو وارد كنم؟؟؟

ali_habibi1384
چهارشنبه 04 مرداد 1391, 20:34 عصر
من با دات نت 2010 كار ميكنم و اس كيو ال 2008 برنامه هام همه از يك نوع كانكشن استفاده ميكنن و مشكلي هم نداشتم تا حالا.كانكشن من بصورت زير :


"Data Source=(local)\\SQLEXPRESS;AttachDbFilename=|DataD irectory|\MyDatabaseName.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"

negar.rafie
چهارشنبه 04 مرداد 1391, 21:28 عصر
ببخشید اقای ali_habibi1384 مگه شما بعد از اینکه پروژه خود را نوشتید و به سیستم کاربر بردید دیتابیس را Attach نمی کنید که از این کانکشن استرینگ استفاده می کنید؟

ali_habibi1384
چهارشنبه 04 مرداد 1391, 22:09 عصر
ببخشید اقای ali_habibi1384 مگه شما بعد از اینکه پروژه خود را نوشتید و به سیستم کاربر بردید دیتابیس را Attach نمی کنید که از این کانکشن استرینگ استفاده می کنید؟
نه. فايل اجرايي رو كنار ديتا بيس قرار ميدم يا درست تر اينكه ديتا بيس رو در مسير فايل اجرايي برنامه قرار ميدم.
اينجوري فقط يه SQLExpress نصب ميكنم و تمام.

Esmail Solhkhah
چهارشنبه 04 مرداد 1391, 22:37 عصر
با اجازه دوست عزیزم جناب ali_habibi1384 (http://barnamenevis.org/member.php?48789-ali_habibi1384) و در تکمیل فرمایش های ایشون

زمانی دیتابیس رو به SQL SERVER اتچ میکنیم (یا با Management Studio یا TSQL) که هدف سرویس گرفتن از SQL SERVER تحت شبکه برای دیتابیس مورد نظر هست

(هر چند لوکال هم میشه استفاده کرد)

این تیپ کانکشن استرینگ برای استفاده Single User هست نه Multi User نیاز به اتچ کردن هم نداره چون خود سرور این کار رو با دریافت اولین کانکشن انجام میده با یه اینستنس

مجزا که از اینستنس پدر مشتق شده

اطلاعات کامل به همراه توصیه های امنیتی در مورد استفاده از پارامتر AttachDBFilename رو اینجا (http://msdn.microsoft.com/en-US/library/bb264564%28v=SQL.90%29.aspx) ببینید.

موفق باشید.

Mahmoud.Afrad
چهارشنبه 04 مرداد 1391, 22:42 عصر
اگر نام instance برابر SQLEXPRESS باشه کانکشن همونی هست که ali_habibi1384 (http://barnamenevis.org/member.php?48789-ali_habibi1384) گفتند. کار اتچ کردن هم بر عهده همین کانکشن هست(..AttachDbFilename..) یعنی در زمان کانکت شدن کار اتچ هم انجام میشه و بعد از بسته شدن کانکشن دیتچ میشه.
اگر instance چیز دیگه ای هست باید instance ها رو بدست بیارید و با تست کانکت شدن یکی رو انتخاب کنید یا به عهده کاربر بزارید یکی رو انتخاب کنه(اولین باری که نرم افزار اجرا میشه) بعد به جای sqlexpress باید قرار بدید و کانکشن رو جایی ذخیره کنید و دفعات بعد ازش استفاده کنید.
یک راه برای فهمیدن نام instanceها از طریق آدرس رجیستری زیر هست(نام تمام کلیدهای این آدرس رو بخونید)
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL

Esmail Solhkhah
چهارشنبه 04 مرداد 1391, 22:58 عصر
البته برای این ورژنها میشه به این صورت هم نوشت (نرم کانکشن استرینگ برای درخواست سرویس تحت شبکه-لوکال)

Data Source = ServerName\InstanceName ; Initial Catalog = YourDb;Inegrated security = True

و دیتابیس رو اتچ کرد و از پروتکلهای سرویس دهنده Tcp/IP رو فعال کرد تا بشه تحت شبکه هم کار کرد.

veniz2008
پنج شنبه 05 مرداد 1391, 10:00 صبح
من با دستوری که قرار داده بودید به مشکل برمیخورم. من نام instance رو موقع نصب md2008 قرار دادم. حالا بانک خودم رو در پوشه bin\debug قرار دادم و کانکشن رو بصورت زیر نوشتم ولی خطا میده:

Data Source = (local)\\md2008;AttachDbFileName = |DataDirectory|\\univ.mdf;Integrated Security = True
همچنین از کانکشن زیر هم استفاده کردم ولی دقیقا همون خطای بالایی رو میده:

Data Source = (local)\\SQLEXPRESS;AttachDbFileName = |DataDirectory|\\univ.mdf;Integrated Security = True
ولی زمانیکه از کانکشن زیر استفاده میکنم برنامه به درستی کار میکنه:

Data Source=.\\md2008;Initial Catalog=univ;Integrated Security=True
اینم یک عکس از خطایی که رخ میده:
90247

ali_habibi1384
پنج شنبه 05 مرداد 1391, 10:14 صبح
آيا SQLEXpress به ديتا بيس شما ذسترسي دارد؟منظورم اينكه ميتوني با خود اس كيو ال وارد ديتا بيس بشي ؟

veniz2008
پنج شنبه 05 مرداد 1391, 10:41 صبح
آيا SQLEXpress به ديتا بيس شما ذسترسي دارد؟منظورم اينكه ميتوني با خود اس كيو ال وارد ديتا بيس بشي ؟
مشکل از بی دقتی خودم بود. در واقع دیتابیس وجود داشت (یعنی دی تچ نشده بود) و من دستور رو اجرا کردم که در اینحالت نمیتونست دوباره اتچ کنه. یک بار دیتچ کردم و برنامه رو اجرا کردم که مشکل حل شد. فقط در مورد پیدا کردن نام instance سیستم مقصد همچنان مشکل دارم.چون ممکنه از قبل روی سیستم مقصد یه sql با یه instance دیگه نصب شده باشه.در این باره هم توضیح میدید. در واقع mafaman2003 کدی رو گذاشتن ولی نیمدونم به چه صورت باید استفاده بشه . خود شما از چه روشی استفاده میکنید؟

negar.rafie
پنج شنبه 05 مرداد 1391, 15:59 عصر
این طور که شما اقا Esmail Solhkhah می گید اگر برنامه ما تحت شبکه نیست نیاز نیست دیتابیس را اتچ کنیم ؟
حال اگر اتچ نکنیم مشکلی پیش نمیاد ؟ روش استانداردی است؟
حال اگر اتچ بشه چه مزایایی داره؟

Nima_kyan
پنج شنبه 05 مرداد 1391, 16:14 عصر
با تشكر از همه دوستان بابت راهنمايي هاي خوبشون.
فقط يه موضوع ديگه، وقتي برنامه تحت شبكه باشه تكليف كانكشن استرينگ چي ميشه؟؟؟ البته Esmail Solhkhah (http://barnamenevis.org/member.php?27551-Esmail-Solhkhah) راهنمايي كردن ولي من كامل متوجه نشدم. يعني كانكشن استرينگ اگه برابر

Data Source = ServerName\InstanceName ; Initial Catalog = YourDb;Inegrated security = True
باشه مشكل حل ميشه؟؟ يعني خودش سرور رو تشخيص ميده؟؟ (البته ممكنه سوالم مبتدي باشه ولي چون تا حالا برنامه تحت شبكه كار نكردم اختلاف ها رو نميدونم)

Nima_kyan
پنج شنبه 05 مرداد 1391, 16:32 عصر
خانم negar.rafie (http://barnamenevis.org/member.php?237705-negar.rafie) اگر برنامه شما تحت شبكه نباشه ميتونيد از روش هاي زير استفاده كنيد.(البته دوستان هم در بالا توضيح دادن)
1- زماني كه ديتابيس رو خودمون به صورت دستي Atach كنيم.

Data Source=.\\SQLEXPRESS;Initial Catalog=DatabaseName;Integrated Security=True
2- زماني كه ATACH كردن برنامه رو به عهده خود برنامه بزاريم. (اتچ خودكار)

"Data Source=(local)\\SQLEXPRESS;AttachDbFilename=|DataD irectory|\MyDatabaseName.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"

ali_habibi1384
پنج شنبه 05 مرداد 1391, 19:19 عصر
مشکل از بی دقتی خودم بود. در واقع دیتابیس وجود داشت (یعنی دی تچ نشده بود) و من دستور رو اجرا کردم که در اینحالت نمیتونست دوباره اتچ کنه. یک بار دیتچ کردم و برنامه رو اجرا کردم که مشکل حل شد. فقط در مورد پیدا کردن نام instance سیستم مقصد همچنان مشکل دارم.چون ممکنه از قبل روی سیستم مقصد یه sql با یه instance دیگه نصب شده باشه.در این باره هم توضیح میدید. در واقع mafaman2003 کدی رو گذاشتن ولی نیمدونم به چه صورت باید استفاده بشه . خود شما از چه روشی استفاده میکنید؟

راستش تا بحال برخوردم كه كاربر چندتا اينستنس داشته باشه و همه مشكلاتم با همون يك خطي كه بهتون دادم حل شده تا بحال.
اگه به چنين چيزي خوردم راهشو گفتم بهتون ميگم حتما:لبخند:

Esmail Solhkhah
پنج شنبه 05 مرداد 1391, 19:44 عصر
این طور که شما اقا Esmail Solhkhah می گید اگر برنامه ما تحت شبکه نیست نیاز نیست دیتابیس را اتچ کنیم ؟
حال اگر اتچ نکنیم مشکلی پیش نمیاد ؟ روش استانداردی است؟
حال اگر اتچ بشه چه مزایایی داره؟ در هر دو صورت نیاز هست دیتابیس اتچ بشه حالا یا اتچت مرسوم با Management Studio یا دستورات TSQL یا همین استفاده از AttachDbFilename ،تفاوتشون رو تو پست قبلی گفتم.

SQL Server در نهایت یک سرویس ویندوز هست که معمولا داره رو پورت خاصی سرویس میده (بسته به تنظیمات پروتکلی و امکانات : سرویس تحت شبکه یا لوکال )

وقتی شما برای این دیتابیس از SQL SERVER درخواست سرویس کردید باید SQL SERVER این دیتابیس رو بشناسه ، این شناختن ، ایجاد یا برورزسانی ساختارهای لاگ ، بررسی

های امنیتی و ... نیاز داره سرویس ویندوز (sqlservr.exe) با فایلهای فیزیکی دیتابیس ارتباط داشته باشه (به اصطلاح اتچت)


فقط يه موضوع ديگه، وقتي برنامه تحت شبكه باشه تكليف كانكشن استرينگ چي ميشه؟؟؟ البته Esmail Solhkhah (http://barnamenevis.org/member.php?27551-Esmail-Solhkhah) راهنمايي كردن ولي من كامل متوجه نشدم. يعني كانكشن استرينگ اگه برابر
1
Data Source = ServerName\InstanceName ; Initial Catalog = YourDb;Inegrated security = True




باشه مشكل حل ميشه؟؟ يعني خودش سرور رو تشخيص ميده؟؟ (البته ممكنه سوالم مبتدي باشه ولي چون تا حالا برنامه تحت شبكه كار نكردم اختلاف ها رو نميدونم)
Data Source=.\\SQLEXPRESS;Initial Catalog=DatabaseName;Integrated Security=True

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

با تبدیل . به نام سرو یا IP Address سروری که SQL SERVER روش نصب هست و با فرض فعال بودن TCP تو پروتکلهای اون سرویس دهنده این کانکشن استرینگ برای شبکه درسته.


Data Source = ServerName\InstanceName ; Initial Catalog = YourDb;Inegrated security = True

این کانکشن استرینگ با فرض نصب SQL SERVER روی یک دامین کنترلر درست هست (تحت شبکه) یا اگه لوکال استفاده میکنید برنامتون باید با مجوز ادمین اجرا بشه بخاطر اینکه از

Windows Authentication استفاده شده اگه نوع شبکه شما Workgroup باشه باید از SQL SERVER And Windows Authentication Mode استفاده کنید.

Data Source = ServerName\InstanceName ; Initial Catalog = YourDb;Uid = sa;pwd = 123
با فرض استفاده از کاربر sa و رمز 123 برای این کاربر

موفق باشید.

veniz2008
پنج شنبه 05 مرداد 1391, 19:47 عصر
راستش تا بحال برخوردم كه كاربر چندتا اينستنس داشته باشه و همه مشكلاتم با همون يك خطي كه بهتون دادم حل شده تا بحال.
اگه به چنين چيزي خوردم راهشو گفتم بهتون ميگم حتما:لبخند:
متوجه منظورتون نشدم. ببینید من موقع نصب نام instance سیستم خودم رو md2008 نوشتم و وقتی کانکشن رو بصورت زیر تعریف میکنم درست کار میکنه:

Data Source = (local)\\md2008;AttachDbFileName = |DataDirectory|\\univ.mdf;Integrated Security = True
ولی وقتی کانکشن رو به اینصورت تعریف میکنم خطا میده:

Data Source = (local)\\SQLEXPRESS;AttachDbFileName = |DataDirectory|\\univ.mdf;Integrated Security = True
متن خطا :

The database 'D:\CONNECTION\TESTCONNECTION\TESTCONNECTION\BIN\D EBUG\UNIV.MDF' cannot be opened because it is version 661. This server supports version 655 and earlier. A downgrade path is not supported.
Could not open new database 'D:\CONNECTION\TESTCONNECTION\TESTCONNECTION\BIN\D EBUG\UNIV.MDF'. CREATE DATABASE is aborted.
An attempt to attach an auto-named database for file D:\connection\testconnection\testconnection\bin\De bug\univ.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.
حالا سوال من این بود: من روی سیستم خودم پروژه رو مینویسم. و اونو به مشتری تحویل میدم. حالا فرض کنید مشتری روی سیستم از قبل sql رو نصب کرده و برای sql سیستمش یک instance دلخواه گذاشته. در اینصورت موقع اجرا به مشکل بالا برمیخوره. چه کار کنیم که این مشکل پیش نیاد و برنامه روی تمام سیستم ها بدرستی کار کنه؟

Esmail Solhkhah
پنج شنبه 05 مرداد 1391, 20:05 عصر
متوجه منظورتون نشدم. ببینید من موقع نصب نام instance سیستم خودم رو md2008 نوشتم و وقتی کانکشن رو بصورت زیر تعریف میکنم درست کار میکنه:

Data Source = (local)\\md2008;AttachDbFileName = |DataDirectory|\\univ.mdf;Integrated Security = True
ولی وقتی کانکشن رو به اینصورت تعریف میکنم خطا میده:

Data Source = (local)\\SQLEXPRESS;AttachDbFileName = |DataDirectory|\\univ.mdf;Integrated Security = True
متن خطا :

The database 'D:\CONNECTION\TESTCONNECTION\TESTCONNECTION\BIN\D EBUG\UNIV.MDF' cannot be opened because it is version 661. This server supports version 655 and earlier. A downgrade path is not supported.
Could not open new database 'D:\CONNECTION\TESTCONNECTION\TESTCONNECTION\BIN\D EBUG\UNIV.MDF'. CREATE DATABASE is aborted.
An attempt to attach an auto-named database for file D:\connection\testconnection\testconnection\bin\De bug\univ.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.
حالا سوال من این بود: من روی سیستم خودم پروژه رو مینویسم. و اونو به مشتری تحویل میدم. حالا فرض کنید مشتری روی سیستم از قبل sql رو نصب کرده و برای sql سیستمش یک instance دلخواه گذاشته. در اینصورت موقع اجرا به مشکل بالا برمیخوره. چه کار کنیم که این مشکل پیش نیاد و برنامه روی تمام سیستم ها بدرستی کار کنه؟


شما نام اینستنس رو گذاشتید md2008 پس طبیعیه که کانکشن اول جواب میده و دومی نه چرا چون تو دومی نام اینستنس رو دارید یه چیز دیگه میدید که احتمال قوی وجود نداره یا استاپ شده

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

یکی اینکه SQL SERVER رو با نام اینستنس خاصی نصب کنید مثل همون کاری که کردید با نام اینستنس md2008 و از این اینستنس تو برنامه استفاده کنید این تا حدود زیادی (بسته

به یونیک بودن نام انتخابی) تضمین میکنه که SQL SERVER شما کاملا مجزا عمل خواهد کرد.

دوم اینکه موقع ستاپ اینستنسها رو نشون بدید تا کاربر یکیشو انتخاب کنه، بعد انتخاب ، سیو کنید و با اون آیتم کار کنید.

موفق باشید.

Mahmoud.Afrad
جمعه 06 مرداد 1391, 00:57 صبح
برای بدست آوردن نام instance ها این تکه کد رو نوشتم البته باید برنامه رو در مد AnyCPU دیباگ کنید تا مسیر رجیستری درست تشخیص داده بشه(listOfInstances لیست نام instance ها و listOfConnectionStrings لیست کانکشن هایی که با موفقیت کانکت شدن). کانکشن استرینگو جایی باید ذخیره کنید. خوب بار اولی که برنامه اجرا میشه چون چیزی توی این مسیر(مثلا setting یا رجیستری یا فایل) ذخیره نشده پس بار اول اجرا هست و باید کد زیر اجرا بشه. کانکشن معتبر بدست بیاد و در اون محل ذخیره بشه. دفعات بعد چون کانکشن داریم نیازی به اجرای مجدد این کدها نیست. اگر لیست instance ها فقط حاوی SQLSERVER IS NOT INSTALLED بود یعنی instance پیدا نشده.
// Debug Project in AnyCPU Mode

// using System.Data.SqlClient;
// using Microsoft.Win32;

List<string> listOfInstances = (Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server").GetValue("InstalledInstances", "SQLSERVER IS NOT INSTALLED") as string[]).ToList();
List<string> listOfConnectionStrings = new List<string>();
using (SqlConnection con = new SqlConnection())
{
foreach (string instance in listOfInstances)
{
con.ConnectionString = @"Data Source=.\" + instance + @" ;AttachDbFilename=|datadirectory|\Database1.mdf;In tegrated Security=True;User Instance=True";
try
{
con.Open();
con.Close();
// If connection is connected truly
// اگر ارتباط بدرستی برقرار شد این کانکشن را به لیست اضافه میکنیم
listOfConnectionStrings.Add(con.ConnectionString);
}
catch
{ }
finally
{
con.Close();
}
}

listBox1.Items.AddRange(listOfInstances.ToArray()) ;
listBox2.Items.AddRange(listOfConnectionStrings.To Array());

listOfConnectionStrings.Clear();
listOfInstances.Clear();
}

negar.rafie
جمعه 06 مرداد 1391, 10:55 صبح
حال اگر اتچ نکنیم که بعضی از کارها مثلا بک اپ اتوماتیک ،تعریف job و . . را نمیشه انجام داد
در ضمن اگر اتچ کنیم سرعت بیشتر نمیشه؟

moslem68
جمعه 13 مرداد 1391, 15:15 عصر
انواع connection string ها
http://connectionstrings.com/sql-server-2008