1398-05-09 22:17 شبکه نمودن نرم افزار
zahmah

 
سلام
یه برنامه نوشته ام با سی شارپ و اس کیو ال 2014
نرم افزار رو روی یک سرور نصب کرده ام همچنین اس کیو ال.
چه کار کنم که کلاینتها بدون نصب اس کیو ال بتوانند به دیتابیس دسترسی داشته و آن را ویرایش کنند؟
1398-05-10 13:34
حاجی شریفی
مؤسس سایت
 
سلام
اتصال از راه دور به SQL Server راحت است.

1) پروتکل TCP را روی SQL Server فعال کنید (که برای نسخه های Standard و Enterprise و Developer و... فعال است ونیاز به کار اضافه ای نیست)

2) پورت TCP مربوطه (پیش فرض 1433 است) را روی فایروال سرور و کلاینت باز کنید.
Control Panel > Firewall > Advanced > Inbound+Outbound > New Rule


3) اعتبار سنجی Mixed Mode را فعال کنید.

4) یک User,Pass با دسترسی کافی در سرور ایجاد کنید.
SSMS > Tree-Root > Security > Logins > New Login > 
حتما برگه User Mapping را هم پر کنید


5) سپس از ConnectionString ای شبیه این استفاده کنید.
Data Source=IP  ;Initial Catalog=DBNAME  ;User ID=USER  ;Password=PASS  ;Connect Timeout=45;
1398-06-12 20:37
zahmah

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

توی بند دوم که یک rule تعریف میکنیم و نامی براش میگذاریم نامش را کجا باید استفاده کنیم و اصلا نامش مهم است چه بگذاریم؟

ضمنا یک یوزر قبلا توی SQL برای نرم افزار دیگه ای تعریف شده. اگه خواسته باشیم همون یوزر رو بکار بگیریم چرا نمیشه توی USER Maping اسم نرم افزار جدیدمون رو تیک بزنیم؟

مشکل دیگری هم که هست اینه که موقع تیک زدن نام دیتابیس مان در User Mapping پیام میدهد این یوزر قبلا اضافه شده است.
1398-06-13 00:53
حاجی شریفی
مؤسس سایت
 
نقل قول نوشته شده توسط: zahmah

توی بند دوم که یک rule تعریف میکنیم و نامی براش میگذاریم نامش را کجا باید استفاده کنیم و اصلا نامش مهم است چه بگذاریم؟

نام Role فایروال مهم نیست و فقط یک عنوان نمایشی است.
درون رایانه ای که باید سرور باشد یک Inbound Rule اضافه کنید
و در رایانه کلاینت که برنامه تان را اجرا میکند یک Outbound Rule اضافه کنید.
ویزاد را با دقت پیگیری کنید و پورت TCP-1433 را باز کنید.

برای اطمینان از اینکه مشکل از فایروال نباشد، موقت میتوانید کل فایروال سرور و کلاینت را خاموش کنید.
Control Panel > Windows Defender Firewall > Turn Windows Defender Firewall on or off

نقل قول نوشته شده توسط: zahmah

اگه خواسته باشیم همون یوزر رو بکار بگیریم چرا نمیشه توی USER Maping اسم نرم افزار جدیدمون رو تیک بزنیم؟

میتوان از یک User,Pass برای چند دیتابیس استفاده کرد ولی نمی دانم منظورتان از "نام نرم افزار" چیست.(؟!) احتمالا منظورتان "نام دیتابیس" است

نقل قول نوشته شده توسط: zahmah

موقع تیک زدن نام دیتابیس مان در User Mapping پیام میدهد این یوزر قبلا اضافه شده است

در SQL Server یک مفهوم Login داریم و یک مفهوم User داریم که با User-Mapping این دو به هم مرتبط میشوند ...

با جابجایی دیتابیس از یک سرور به دیگر یا backup/restore و یا نصب و لغو نصب برنامه ها امکان دارد، حالتی رخ دهد که Login وجود نداشته باشد ولی User باقی مانده باشد

رفعش هم ساده است، در زیر درخت دیتابیس مورد نظرتان و در گره Security و سپس Users میتوانید User قدیمی بجا مانده از گذشته را Delete کنید تا Map صحیح و بدون مشکل انجام شود. ( فقط همان user ای که خودتان ایجاد کرده اید و میدانید را delete کنید )

فعلا برای حل مشکل پیشنهاد میکنم کلا یک User,Pass جدید ایجاد و امتحان کنید.
میتوانید در برنامه SSMS روی دیتابیس New-Query بزنید و دستورات زیر را وارد کنید.
این دستور کل کار را انجام میدهد.
فقط بجای YourDbName نام دیتابس خودتان را قرار دهید، بقیه کد را تغییر ندهید.
این کد برای دسترسی به YourDbName یک نام کاربری و گذر واژه جدید به نام User1 و Pass1 ایجاد میکند.

USE [master]
GO
CREATE LOGIN [User1] WITH PASSWORD=N'Pass1', DEFAULT_DATABASE=[YourDbName], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
use [YourDbName];
GO
use [master];
GO
USE [YourDbName]
GO
CREATE USER [User1] FOR LOGIN [User1]
GO
USE [YourDbName]
GO
ALTER ROLE [db_accessadmin] ADD MEMBER [User1]
GO
USE [YourDbName]
GO
ALTER ROLE [db_owner] ADD MEMBER [User1]
GO
USE [YourDbName]
GO
ALTER ROLE [db_securityadmin] ADD MEMBER [User1]
GO


مجدد روی تاپیک زیر برای Mixed-Mode هم تاکید میکنم:
/Forum/Home/Topic/36-SQL-Server-and-Windows-Authentication-mode

در انتها و درون برنامه از ConnectionString ای شبیه این استفاده کنید:

string connectionString = "Data Source=YourServerIP ;Initial Catalog=YourDbName ;User ID=User1;Password=Pass1;Connect Timeout=45;";

دقت کنید که گذرواژه به حروف بزرگ و کوچک حساس است


موفق باشید.
1398-07-13 22:12
zahmah

 
سلام
من کد زیر رو برای اتصال به دیتابیس در فرم لاگین نوشتم اما تحت شبکه جواب نمیده:
private void frmLogin_Load(object sender, EventArgs e)
{
SqlConnection con;
try
{
con = new SqlConnection("Data Source=" + "169.254.1.100" + " ;Initial Catalog=DataManagement ;User ID=Ali ;Password=250;Connect Timeout=45;" ) ;
con.Open();
con.Close();
}
catch
{
con = new SqlConnection("Server = . ; DataBase = master ; Integrated Security = True" ) ;
con.Open();

string str = "use master;" +
"EXECUTE sp_attach_db @dbname = N'DataManagement' , " +
" @filename1 = N'" + System.Environment.CurrentDirectory + "\\db\\DataManagement.mdf'," +
"@filename2 = N'" + System.Environment.CurrentDirectory + "\\db\\DataManagement_log.ldf' " ;

SqlCommand cmd = new SqlCommand(str, con) ;
cmd.CommandTimeout = 100 ;
cmd.ExecuteNonQuery() ;
con.Close() ;

Application.Restart() ;
}
}

private void btnOK_Click(object sender, EventArgs e)
{
var qury = (from users in Mydb.tbl_User where users.User_Name == txtUser.Text && users.Pass == txtPass.Text select users ) ;
if (qury.Count() > 0)
{
var qury2 = (from users in Mydb.tbl_User where users.User_Name == txtUser.Text && users.Pass == txtPass.Text select users).SingleOrDefault() ;
Properties.Settings.Default.UserActive_Setting = qury2.Full_Name ;

this.Close() ;
}
}

-----------------------------
مشکل از کجا می تونه باشه؟
آدرس استوریج هم 169.254.1.100 هستش.
1398-07-15 09:00
حاجی شریفی
مؤسس سایت
 
سلام
کد شما دو بخش دارد.
یک بخش امتحان/Test اتصال و یک بخش Attach ...
اما در مورد Attach پارامترهای بظاهر بیربط دیگری مانند مجوزهای NTFS هم میتوانند تاثیر گذار باشند که فعلا گمانم برایتان زیاد مهم نیست.

برای اطمینان از کد اتصال تان، کد خودتان را در یک Console-App کپی کردم و فقط بجای IP,DB,User,Pass مقادیر سرور خودم را از آلمان قرار دادم و کدتان Connect شد، پس بخش امتحان و ConnectionString و...سی-شارپ تان مشکلی ندارد
باید بخش های دیگر را مجدد بررسی کنید.

تنظیمات شبکه و فایروال و ضدویروس و... و باز بودن مسیر پورت 1433
تنظیم صحیح SQL Server ...
شامل فعال بودن پروتکل TCP در SQL Server Configuration Manager
فعال بودن اعتبار سنجی SQL Server and Windows Authentication mode
نام کاربری Ali صحیح ایجاد شده باشد و مجوزهای لازم جهت اتصال به دیتابیس DataManagement را داشته باشد.

برای آزمایش دو مورد آخری میتوانید، یکبار روی خود سرور با برنامه SSMS و دادن نام-کاربری و گذرواژه Ali,250 امتحان کنید و ببینید خود SSMS در سرور با این مقادیر به دیتابیس وصل میشود یا خیر.

یک سوال؟
از منظر شبکه ای چطور به سرورتان متصل میشوید؟
یعنی هر دو به یک سوییچ متصل هستید؟
خیلی مهم است، مثلا میتوانید از رایانه کلاینتی که برنامه را اجرا میکنید به سرور 169.254.1.100 ریموت دسکتاپ بزنید؟
1398-10-09 15:17
zahmah

 
سلام ببخشید هرکاری کردم مشکل تنظیمات شبکه را پیدا نکردم.

ناگفته نماند نرم افزاری روی سیستم مقصد بود که با اس کیو ال 2008 کار می کرد من هم ناچار شدم بانکم را به اس کیو ال 2008 تغییر دادم.

آیا نام کاربری و گذرواژه من در اسکیو ال هم باید همانی باشد که در اس کیو ال سیستم مقصد موجود است یا نه اصلا باید مستقل باشد؟

موقع نصب آن نرم افزار باید در اسکیو ال سایت تعریف می شد آیا من برای تحت شبکه شدن نیاز ندارم؟

در ضمن ویندوز مقصد ، ویندوز سرور است و شبکه هم داخلی است و به اینترنت وصل نیست.

همچنین از رایانه کلاینتی که برنامه را اجرا میکنم ریموت دسکتاپ به سرور جواب می دهد.
1398-10-11 23:15
حاجی شریفی
مؤسس سایت
 
سلام
نقل قول نوشته شده توسط: zahmah
... اس کیو ال 2008 ...

مشکل خاصی نیست ولی لاگ برداری برای خطاهای سمت برنامه تان که دارید؟
یعنی error ای رخ دهد، به متن کامل آن error دسترسی دارید؟
نسخه 2008 خیلی قدیمی است و از پشتیبانی مایکروسافت هم خارج شده...
یادم است چندین سال قبل با EFx میخواستم به SqlServer2008 متصل شوم یک خطایی میگرفتم که میگفت EFx از SqlServer2012 به بالا پشتیبانی میکند وبا SqlServer2008 کار نمیکند.

این برای خیلی قبل است، حالا باز هم مشکلی نیست
ولی حتما به متن خطایتان در برنامه دقت کنید.
به محض خطا مشکل را گردن شبکه و امنیت و... نندازید!
جدیدا امتحان نکرده ام ولی حداقل با این شرایط حتما حتما به متن خطای برنامه دقت کنید.
شاید شاید شاید مشکل از شبکه و امنیت عبور کرده باشید و الآن خطای برنامه تان مربوط به چیزهای دیگری باشد؟
خطا را رسد کرده اید؟ هنوز خطای لاگین و اتصال و User,Pass دریافت میکنید؟

اگر زمانی مشکلی با 2008 داشتید، باید عرض کنم که بطور معمول میتوانید نسخه SqlServer فعلی تان بدون خرابکاری در عملکرد برنامه های قبلی ارتقاء/Upgrade دهید.

نقل قول نوشته شده توسط: zahmah
آیا نام کاربری و گذرواژه من در اسکیو ال هم باید همانی باشد که در اس کیو ال سیستم مقصد موجود است یا نه اصلا باید مستقل باشد؟

به گمانم بهتر است برای هر نرم افزار و هر دیتابیس یک User,Pass جداگانه تعریف شود ولی میتواند یکی هم باشد ، بسته به تنظیمات سطح دسترسی دارد.
در تنظیمات امنیتی مشخص میشود که هر User به چه دیتابیس هایی دسترسی دارد.
اگر User ای از قبل داشته اید که به Database1 دسترسی داشته و الان Database2 را اضافه کرده اید، بعید نیست که User قبلی به این دیتابیس دسترسی نداشته باشد.
پیشنهاد میکنم با مطالبی و دستورات که در پست چهارم توضیح داده بودم یک Login,User,Pass جدید با دسترسی مناسب به دیتابیس خودتان ایجاد کنید...
CREATE LOGIN ...
CREATE USER ...
ALTER ROLE ...


نقل قول نوشته شده توسط: zahmah
آیا نام کاربری و گذرواژه من در اسکیو ال هم باید همانی باشد که در اس کیو ال سیستم مقصد موجود است یا نه اصلا باید مستقل باشد؟

این قسمت را متوجه نشدم، سوال عجیب و شاید خطرناکی پرسیده اید؟!
"نام کاربری تان در اسکیوال" کدام است؟؟؟ و "در اس کیوال سیستم مقصد" کدام است؟؟؟
شما یک User,Pass در SqlServer دارید که در سرور تعریف شده و به دیتابیس تان دسترسی دارد.
از همان هم در ConnectionString برنامه استفاده میکنید تا به سرور متصل شوید وگرنه برای چه این User,Pass را تعریف کرده اید؟!
دو تایی وجود ندارد؟ چه چیزی را متوجه نشدم؟!

نقل قول نوشته شده توسط: zahmah
موقع نصب آن نرم افزار باید در اسکیو ال سایت تعریف می شد آیا من برای تحت شبکه شدن نیاز ندارم؟

"آن نرم افزار" یعنی برنامه خودتان؟! چیزی به نام "تعریف در اسکیوال سایت" نداریم.
منظورتان از سایت چه بود؟ از کدهای قبلی حدس زدم برنامه تان exe است، برنامه تان وب و asp.net که نیست؟ اگر برنامه تان وب و asp.net باشد و در همان سرور هم باشد که اصلا نیازی به کل این کارها نیست!

در SqlServer تان باید پروتکل Tcp فعال باشد و User,Pass مناسب با دسترسی کافی به دیتابیس دلخواه تان را ایجاد کنید.
در برنامه هم از آن User,Pass جهت اتصال به SqlServer استفاده کنید.

الآن با User,Pass ای که در برنامه استفاده میکنید، میتوانید در خود سرور با SSMS ( با همان مقادیر User,Pass ) به دیتابیس وصل شوید ؟

مسائل اینقدر پیچیده وسخت نیست ولی نمیدانم کجای کار را اشتباه کرده اید.
خودم هم وقت کافی ندارم، ولی اگر بتوانید به سرور اینترنت وصل کنید (که شاید نتوانید و دست شما نباشد) امکان دارد بشود لحظه ای کوتاه با برنامه ای مانند AnyDesk به سرورتان متصل شوم و ببینم در چه وضعیتی هستید و مشکل کجاست ...
1399-01-17 22:25
zahmah

 
سلام
ببخشید من نرم افزار تحت شبکه ام با سی شارپ 2013 و sql 2014 نوشته ام. قرار است تحویلش بدهم. همه نکاتی که شما بالا گفتید رو انجام داده ام. اما تحت شبکه کلاینت ها به آن وصل نمیشوند . خطایی که نشان میدهد مفهومش این است چنین سروری رو پیدا نمی کند.
من در نرم افزارم از تکنولوژی entity data models استفاده کرده ام آیا فضای نام جدیدی یا کانکشن استرینگ متفاوتی نیاز ندارم یا هر چیز دیگری...
در جستجوهایم به مورد زیر برخوردم مفهومش چیست؟
https://docs.microsoft.com/en-us/dotnet/api/system.data.entityclient?view=netframework-4.8

آیا نیاز به تعریف فضای نام زیر در نرم افزارم می باشد:
System.Data.EntityClient Namespace
کانکشن استرینگ زیر مشکل ندارد؟ (بخصوص سمی کالن بعد از پسورد نباید حذف شود؟)
con = new SqlConnection("Data Source=" + Server_IP + ",7080;Network Library=DBMSSOCN;Initial Catalog=DataMgt;User ID=ali;Password=99;");


در ضمن آنتی ویروس سرور و کلاینت ها پادویش می باشد که Role در آن تعریف کردم. دیگر نمی دانم چکار کنم؟
ببخشید...
1399-01-18 23:06
حاجی شریفی
مؤسس سایت
 
سلام
نقل قول نوشته شده توسط: zahmah
کانکشن استرینگ زیر مشکل ندارد؟

به ظاهر صحیح است
فقط طبق این رشته اتصال ، پورت SQL Server را باید در سرور تغییر داده باشید و 7080 گذاشته باشید؟!
این عدد از کجا آمده؟ خودتان در SQL Server تنظیم کرده اید؟

نقل قول نوشته شده توسط: zahmah
سمی کالن بعد از پسورد نباید حذف شود؟

سمی-کالن آخر بود و نبودش فرقی ندارد

نقل قول نوشته شده توسط: zahmah

در جستجوهایم به مورد زیر برخوردم مفهومش چیست؟
System.Data.EntityClient Namespace

اینها برای Entity Framework 6 هستند که از معروف ترین ORM های دات نت است.
باید پروژه تان با EF نوشته باشید و با EF به دیتابیس وصل شده باشید.
آیا از EF در پروژه تان استفاده کردید؟
البته طبق دستوری که فرستادی ، همان new SqlConnection پس حدس میزنم از EF استفاده نکرده اید !


درکل شبکه نمودن SQL Server پشت رایانه شاید چند دقیقه ای وقت بگیرید و خیلی ساده است.
تقریبا کامل فرآیند را برای توضیح داده ام.
البته دفعه قبل هم سوالی پرسیدم که داشتم پاسخ دقیقش بد نبود.
واقعا یک طرفه حدس زدن مشکل سخت است، یعنی جواب برخی موارد را دقیق بدانم
باید مواردی که گام به گام مطرح میشود را انجام دهید و پاسخش را شفاف بدانم ...
نمیشود برای بیماری دارو داد که نه مشخص است تب دارد یا نه؟ رنگ پریده است یا نه؟ مردمک چشم صحیح کار میکند یا نه؟ و...
مجدد توضیح کوتاهی میدهم وسوالاتی مطرح میکنم.

در مطلب قبل چند بار به سایت اشاره کردید ...
اول برنامه تان چه نوع است؟ exe است یا وب سایت است؟
اگر وب سایت باشد، اصلا نیازی به شبکه کردن SQL Server نیست.

فرض میکنم که وب سایت نیست و exe است
برای این اتصال حداقل دو رایانه دارید، رایانه کلاینت و رایانه سرور

شما باید SQL Server را فقط در سرور نصب کنید
( نصب آن در کلاینت هیچ تاثیری ندارد )

دو برنامه کمکی مهم با SQL Server وجود دارد.
برنامه SQL Server Management Studio که به اختصار SSMS گفته میشود.
برنامه SQL Server Configuration Manager که به اختصار SSCM گفته میشود.

دقت کنید که Mixed Mode همانطور که بالاتر گفته شد و از درون برنامه SSMS فعال باشد.
دقت کنید که پروتکل TCP در برنامه SSCM فعال باشد.

سپس فایل mdf و ldf دیتابیس را در محلی در خود سرور کپی و دیتابیس را Attach کنید.
یا
فایل bakup دیتابیس را در خود سرور کپی و دیتابیس را Restore کنید.
( این کارها از طریق برنامه SQL Server Management Studio قابل انجام است که به اختصار SSMS گفته میشود )

در این مرحله هر User,Pass که قبلا تعریف کرده بودید کار نمیکند و باید جدید در سرور تعریف شود.
در برنامه SSMS به زیر گره دیتابیس خود و بخش Security>User برود واگر User قبلی وجود دارد حذفش کنید.
سپس به گره root (بیرون دیتابیس خودتان) رفته زیر Security>Login یک User,Pass با تنظیمات مناسب ایجاد کنید.

یک بار برنامه را درون رایانه سرور و با IP=127.0.0.1 در ConnectionString و User,Pass و... کامل تست کنید.
الان برنامه شما در خود رایانه سرور کار میکند؟
اگر برنامه تان در خود سرورهم کار نمیکند ، پس خیال شبکه و مراحل بعدی و... و... یکی از کارهای بالا را صحیح انجام نداده اید.

اگر کار میکنید، ادامه میدهیم ....
پورت SQL Server معمولا 1433 است و مقدار آن در SSCM مشخص میشود.
اگر دلیل خاصی ندارید که عوضش نکنید، الان پورت SQL Server در برنامه SSCM چیست؟ 1433 یا 7080 است؟

اگر Firewall دارید باید پورت مذکور را در فایروال هم سرور و هم کلاینت باز کنید.
(اگر سرور شما در اینترنت قرار دارد و شما از طریق اینترنت به سرور متصل میشوید باید تنظیماتی هم در مودم یا هر نوع Gateway که دارید انجام دهید که چون گفتید کارتان ربطی به اینترنت و... ندارد و شبکه داخلی است، از این بخش صرف نظر میکنیم. )

خوب سرور شما یک IP دارد.
آیا الان رایانه کلاینت این IP را دیده و Ping میکند؟
اگر نمیکنید یعنی شبکه تان، کایل کشی و سوییچ و... مشکل دارد و ربطی به برنامه شما یا SQL Server و... ندارد،

بعد Ping اگر بلد هستید ( اگر نیستید هم با یک سرچ در اینترنت پیدا خواهید کرد) Telnet روی IP و Port تعریف شده SQL Server تست کنید.

تازه الان باید برنامه کلاینت را در رایانه کلاینت و با IP سرور امتحان کنید.
انشاا... موفق باشید
1399-01-19 00:07
zahmah

 
پورت 7080 را خودم توی sscm تغییر داده ام: IP All

مورد زیر را متوجه نشدم:
باید پروژه تان با EF نوشته باشید و با EF به دیتابیس وصل شده باشید.
نه! من برای اتصال از entity data model استفاده کرده ام.

برنامه ام exe است
Mixed Mode فعال است.
پروتکل TCP در برنامه SSCM فعال است.

فایل mdf و ldf دیتابیس در محلی در خود سرور کپی و دیتابیس Attach شده.

در قسمت Security>Login یک User,Pass با تنظیمات مناسب ایجاد شده.

برنامه درون رایانه سرور کار می کند

در Firewall ویندوز پورت مذکور هم سرور و هم کلاینت باز است.(inbound و outbound)

خوب سرور شما یک IP دارد.
رایانه کلاینت IP سرور را دیده و Ping میکند

remote desktop هم انجام می دهد
1399-01-19 22:50
حاجی شریفی
مؤسس سایت
 
سلام
با توضیحات تان حداقل مواردی از حالات محتمل حذف میشود
و یک نکته شاید مهم هم در صحبت تان بود ...

نقل قول نوشته شده توسط: zahmah
نه! من برای اتصال از entity data model استفاده کرده ام

یعنی در برنامه تان یک نوعی مدل گرافیکی از دیتابیس و جداول دارید؟
یعنی جایی در برنامه خودتان هست که مربع مربع و به صورت گرافیکی جداول و فیلدها و... را میبینید؟
از قدیم موارد Model-Based در دات نت زیاد داشته ایم
TypedDataSet/TypedDataAdapter
Linq2Sql
EF ModelFirst
T4
و...

تقریبا همه اینها ConnectionString را در فایل app.config در زمان طراحی ذخیره میکنند
بعد کامپایل این فایل تغییر نام پیدا میکند به PROJECTNAME.exe.config

در یک حالت هم داریم که ConnectionString در Settings پروژه ذخیره میشود.

در یک حالت هم داریم که حتی کلا فرمت و شکل ConnectionString متفاوت است ...
چیزی شبیه این
<connectionStrings >
<add name ="KEY" connectionString ="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SERVER;initial catalog=DB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;"
providerName ="System.Data.EntityClient" />
</connectionStrings >


اگر ارتباط شما با دیتابیس از طریق هر کدام از این ORM ها و حالات باشد، نکته مهم این است که شاید اصلا ConnectionString را عوض نکرده باشید !

وقتی دستوری مانند این مینویسید :
var  con1 = new  SqlConnection("**DB1**");
var com1 = new SqlCommand("***", con1);
...
var con2 = new SqlConnection("**DB2**");
var com2 = new SqlCommand("***", con2);
...

یعنی از هیچ ORM و یا Model ای استفاده نمیکنید و خودتان دستی هر بار ConnectionString را میدهید.
این حالت به کل پروژه اعمال نمیشود و لحظه ای و فقط برای همان SqlConnection است.
در بار اول میتوانید به یک IP و دیتابیس متصل شوید و بار دوم به یک IP و دیتابیس دیگر ، به هم ارتباطی ندارد
همواره باید دقت کنید که در همه دستورات و هربار و هربار ConnectionString درست را داده باشید ...

ولی اگر نوعی از ارتباط Model-Based و یا حتی هر نوع ORM ای در پروژه تان داشته باشید
این ابزار چنین کار نمیکنند و ConnectionString را یکجا مجتمع میکنند تا در هر استفاده نیاز به بیان آن نباشد.

اگر چنین باشد یعنی شما یک ConnectionString دیگر یکجایی بین app.config یا Project > Settings دارید که شاید اصلا نرفته اید سراغش و تغییرش هم نداده اید !

پس مجدد میپرسم ...
آیا هیچ Model گرافیکی درون پروژه تان برای تعریف دیتابیس و جداول و... دارید؟
طوری دیگری هم بخواهم بپرسم ، آیا فایل هایی مانند *.xsd, *.xsc, *.xss, *.tt, *.dbml, *.edmx و... در محل فایل های پروژه تان دارید؟

نگاهی به app.config بیاندازید، آیا آنجا تگ < connectionStrings > و یا چیزی شبیه ConnectionString دارید ؟

نگاهی به Project > Properties > Settings بیاندازید، آیا آنجا سطری و متن و دیتایی شبیه ConnectionString دارید ؟

اگر دارید باید اینها را هم ویرایش کنید.
1399-01-19 23:21
zahmah

 
سلام
حق با شماست.
در app.config کد زیر را پیدا کردم:
<connectionStrings>
<add name="DataManagementEntities" connectionString="metadata=res://*/MyEntityModel.csdl|res://*/MyEntityModel.ssdl|res://*/MyEntityModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=DataManagement;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>


که IP سرور در آن نیست.(اصلا کل کانکشن استرینگ متفاوت است)

چگونه IP و پورت و User.Pass را در اینجا تنظیم کنم؟
یا نمیشه این چند خط کد را کلا حذف کرد؟ چون من IP را در یک فایل استریم ذخیره کرده ام

و آیا باید حتما کانکشن استرینگ در هر دو جا تعریف شود؟

در ضمن همانطور که گفته بودید یک نوع مدل گرافیکی از دیتابیس و جداول بنام MyEntityModel.edmx در Solution Explorer دارم
1399-01-21 03:28 استخراج ConnectionString اصلی EntityClient
حاجی شریفی
مؤسس سایت
 
سلام
نقل قول نوشته شده توسط: zahmah
در ضمن همانطور که گفته بودید یک نوع مدل گرافیکی از دیتابیس و جداول بنام MyEntityModel.edmx در Solution Explorer دارم

EntityFramework ModelFirst
بله، روش پرمصرف و جالبی بوده

نقل قول نوشته شده توسط: zahmah
در app.config کد زیر را پیدا کردم
من IP را در یک فایل استریم ذخیره کرده ام

طبق قاعده باید برای خودتان سوال پیش می آمد که IP را دستی ذخیره کرده اید و در SqlConnection/SqlCommand استفاده میکنید ...
در دستورات کار با EFModelFirst که IP را نداده اید؟
خوب پس Model از کجا ConnectionString را میگیرد؟ Model از کجا میفهمد IP چیست؟

الآن یک سوالی که برایم پیش آمده ، این است که آیا واقعا از Model فوق در کدتان هم استفاده کرده اید؟
چون همه دستوراتی که تا الآن در اینجا نوشته بودید بدون Model و با استفاده از SqlConnection/SqlCommand مستقیم بوده!
این app.config که گذاشته اید، تاثیری در کدهای مستقیم SqlConnection/SqlCommand تان ندارد.
پس: یعنی شما هم از EFModelFirst و هم مستقیم از SqlConnection/SqlCommand استفاده کرده اید؟

نقل قول نوشته شده توسط: zahmah
چگونه IP و پورت و User.Pass را در اینجا تنظیم کنم؟
یا نمیشه این چند خط کد را کلا حذف کرد؟
چون من IP را در یک فایل استریم ذخیره کرده ام
و آیا باید حتما کانکشن استرینگ در هر دو جا تعریف شود؟

حذف و خواندنش از جای دیگر کمی کدتان را پیچیده میکند.
ساده ترین کار آن است که اجازه دهید ConnectionString همینجا بماند
کافی است متن بین دو &quot; را ویرایش کنید، وسط این دو همان ConnectionString خودتان است.
خودتان هم برای غیر EFModelFirst و کدنویسی مستقیم با SqlConnection/SqlCommand میتوانید ConnectionString را از همینجا بخوانید

برای پیشنهاد فوق میتوانید اسمبلی های زیر را به پروژه تان Add-Reference کنید :
System.Configuration
System.Data.Entity
از منوی Project > Add Reference > Framework
public static class  PSettings
{
private static string m_ConnectionString = null ;

public static string ConnectionString
{
get
{
if (m_ConnectionString == null )
{
string data = System.Configuration.ConfigurationManager.ConnectionStrings["DataManagementEntities"].ConnectionString ;
var builder = new System.Data.EntityClient.EntityConnectionStringBuilder(data) ;
m_ConnectionString = builder.ProviderConnectionString;
}
return m_ConnectionString;
}
}
}

// حالا میتوانید در کدنویسی مستقیم هم شبیه این عمل کنید

using (var con = new SqlConnection(PSettings.ConnectionString))
using (var com = new SqlCommand("***SQL***", con))
{
con.Open();
//...
//...
//...


البته اگر بخواهیم وسط دعوا نرخ تعیین کنیم ! میتوانیم بگوییم که طبق اصول معماری و مهندسی نرم افزار استفاده از متغییرهای static و توابع static آنهم بدین شکل ، خیلی بد و قبیح است ! و باید از معماری های جایگزین زیباتر و مفیدتری مانند DI استفاده شود و...و... ولی الآن گمان کنم جای این مبحث نباشد و شما احتمالا میخواهید زودتر کدتان کار کند.
پس بیخیال


فقط دقت کنید که app.config بعد کامپایل و در کنار exe تان نامش تغییر میکند به PROJECTNAME.exe.config
موفق باشید
1399-01-21 07:59
zahmah

 
سلام
با تشکر از راهنمایی بسیار عالی تان.

اگر اشتباه نکنم کد بالا عملیات read را از app.config انجام می دهد. من اگر خواسته باشم کانکشن استرینگ را در زمان اجرا (runtime) تغییر بدهم چه قطعه کدی نیاز دارم؟

البته فکر کنم نیازی به آن نباشد چون من فقط نیاز به تغییر آی پی سرور دارم که این کار را در یک فایل خارجی انجام میدهم.

ولی آی پی سرور را که از فایل خارجی میگیرم را چگونه در کد xml فایل app.config تغییر دهم؟
1399-01-22 23:19
zahmah

 
سلام
این کد را برای تغییر کانکشن استرینگ در فایل app.config پیدا کردم :

XmlDocument XmlDoc = new XmlDocument();
//Loading the Config file
XmlDoc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
foreach (XmlElement xElement in XmlDoc.DocumentElement)
{
if (xElement.Name == "connectionStrings")
{
//setting the coonection string
xElement.FirstChild.Attributes[2].Value = "Data Source= " + txt_ServerIP.Text + ",1433;Initial Catalog=db_DM;User ID=usr;Password=123;Connect Timeout=45";
}
}
//writing the connection string in config file
XmlDoc.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);


متاسفانه موقع اجرا خطای زیر رو نشون میده:
Unable to cast object of type 'System.Xml.XmlComment' to type 'System.Xml.XmlElement'
1399-01-23 08:47 کد ویرایش app.config
zahmah

 
یا کد زیر که هیچ خطایی نمیدهد و app.config را هم تغییر نمی دهد(بدون استفاده از try...catch):
// Get the application configuration file.
System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
// Get the current connection strings count.
int connStrCnt = ConfigurationManager.ConnectionStrings.Count;
// Create the connection string name.
string csName = "ConnStr" + connStrCnt.ToString();
// Create a connection string element and
// save it to the configuration file.
// Create a connection string element.
ConnectionStringSettings csSettings =new ConnectionStringSettings(csName,"LocalSqlServer: data source=127.0.0.1;Integrated Security=SSPI;" +"Initial Catalog=aspnetdb", "System.Data.SqlClient");
// Get the connection strings section.
ConnectionStringsSection csSection = config.ConnectionStrings;
// Add the new element.
csSection.ConnectionStrings.Add(csSettings);
// Save the configuration file.
config.Save(ConfigurationSaveMode.Modified);
1399-01-23 23:15 ویرایش EntityClient-ConnectionString در App.Config
حاجی شریفی
مؤسس سایت
 
سلام
یک نکته بی ربط !
اگر کدهای برنامه نویسی را بین تگ های بسته و باز CODE قرار دهید با ظاهر بهتری در سایت نشان داده خواهند شد
[ C O D E ] *** [/ C O D E ]

نقل قول نوشته شده توسط: zahmah
یا کد زیر که هیچ خطایی نمیدهد و app.config را هم تغییر نمی دهد

بله نمونه کد خوبی پیدا کرده اید و بسیار نزدیک است و کار هم میکند !

اول)
برسیم به آنکه که چرا شما فکر میکنید کار نمیکند ؟!
این کد باید کار کند، حدس میزنم به جای صحیح نگاه نکردید.
فرض کنید پروژه شما در پوشه Proj1 قرار دارد
وقتی برنامه را داخل VS اجرا میکنید، حدس میزنم شما به سراغ فایل Proj1\app.config رفته اید و دیده اید عوض نشده
درحالیکه VS برنامه شما را کامپایل ودر پوشه Proj1\bin\Debug کپی کرده
فایل config تان هم شده Proj1\bin\Debug\EXENAME.exe.config
اگر بروید و فایل فوق را نگاه کنید، احتمال میدهم تغییرات را خواهید دید.

پس کد کار کرده و در برنامه واقعی مشکلی ندارد.

دوم)
باید دقت کنید که ConnectionString شما از نوع EntityClient است.
metadata=res://*/MyEntityModel.csdl|res://*/MyEntityModel.ssdl|res://*/MyEntityModel.msl;provider=System.Data.SqlClient;provider connection string=&quot; *** &quot;


اگر دقت کنید، در واقع خود رشته اتصال EntityClient داخلش سه بخش بزرگتر دارد
metadata  =res://*/MyEntityModel.csdl|res://*/MyEntityModel.ssdl|res://*/MyEntityModel.msl;
provider =System.Data.SqlClient;
provider connection string =&quot; *** &quot;

شما فقط باید ProviderConnectionString را ویرایش کنید
اگر بخش های اضافه دیگر حذف شود، Model شما کار نخواهد کرد
پس باید آنها را هم به ConnectionString اضافه کنید

اسمبلی های زیر را به پروژه تان Add-Reference کنید :
System.Configuration
System.Data.Entity

کد زیر مقادیر قبلی را میخواند و به بخش های metadata و provider قبلی دست نمیزند و همانطور باقی میگذارد و فقط ProviderConnectionString را تغییر و Save میکند
public void  SetConnectionString1(string  newValue)
{
var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var csElement = config.ConnectionStrings.ConnectionStrings["DataManagementEntities"];
var builder = new System.Data.EntityClient.EntityConnectionStringBuilder(csElement.ConnectionString);
builder.ProviderConnectionString = newValue;
csElement.ConnectionString = builder.ConnectionString;
config.Save(ConfigurationSaveMode.Modified);
}


این کد بخش های metadata و provider را دستی با مقادیر مناسب پروژه تان پر میکیند و کل رشته اتصال نهایی را Save میکند.
این کد از زاویه ای شاید بهتر هم باشد ولی اگر نام Model را در پروژه تغییر دادید و metadata تان عوض شد، باید دقت کنید و یادتان باشد که این کد را اصلاح کنید
public void  SetConnectionString2(string  newValue)
{
var builder = new System.Data.EntityClient.EntityConnectionStringBuilder();
builder.Metadata = "res://*/MyEntityModel.csdl|res://*/MyEntityModel.ssdl|res://*/MyEntityModel.msl";
builder.Provider = "System.Data.SqlClient";
builder.ProviderConnectionString = newValue;

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var csElement = config.ConnectionStrings.ConnectionStrings["DataManagementEntities"];
csElement.ConnectionString = builder.ConnectionString;
config.Save(ConfigurationSaveMode.Modified);
}


در ضمن شاید بد نباشد پس از تغییرات فوق برنامه تان را Close-Start کنید تا در دفعه بعد که بالا می آید با تغییرات جدید مجدد اجرا شود.
اگر پروژه تان WinForm است دستور System.Windows.Forms.Application.Restart(); بد نیست.
موفق باشید.
1399-03-30 21:45 استخراج آی پی از app.config
zahmah

 
سلام
کانکشن استرینگ نرم افزارم به صورت خودکار در app.config پروژه سی شارپم ایجاد شده است.
چطور می توانم آی پی سرور را Read کرده و آن را ویرایش کنم؟

آیا راهی هست که کانکشن استرینگ را از app.config بیرون آورد و به صورت دستی در هنگام لود نرم افزار به شکل زیر تعریف کرد؟
con = new SqlConnection("Data Source=192.168.1.100,1433;Initial Catalog=DataManagement;User ID=myName;Password=123456;Connect Timeout=45");
1399-04-04 09:14 ویرایش ConnectionString در App.Config
حاجی شریفی
مؤسس سایت
 
سلام
نقل قول نوشته شده توسط: zahmah
چطور می توانم آی پی سرور را Read کرده و آن را ویرایش کنم؟

اسمبلی System.Configuration را به پروژه اضافه کنید

برای خواندن کل ConnectionString میتوانید از کدی شبیه این استفاد ه کنید:
public static string  GetConnectionString(string  key)
{
return System.Configuration.ConfigurationManager.ConnectionStrings[key].ConnectionString;
}


برای فقط خواندن بخش DataSource از ConnectionString که همان IP,Port سرور است ، میتوانید کدی شبیه این داشته باشید:
public static string  GetConnectionStringDataSource(string  key)
{
string cs = System.Configuration.ConfigurationManager.ConnectionStrings[key].ConnectionString;
var cb = new System.Data.SqlClient.SqlConnectionStringBuilder(cs);
return cb.DataSource;
}


برای ذخیره کل یک ConnectionString جدید هم میتوانید کدی شبیه این را استفاده کنید:
public static void  SetConnectionString(string  key, string  connectionString)
{
var config = System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None);
config.ConnectionStrings.ConnectionStrings[key].ConnectionString = connectionString;
config.Save(System.Configuration.ConfigurationSaveMode.Modified);
System.Configuration.ConfigurationManager.RefreshSection("connectionStrings");
}


این کد هم با کمک توابع قبلی فقط DataSource یک ConnectionString را تغییر میدهد و با بقیه بخش ها کاری ندارد:
public static void  SetConnectionStringDataSource(string  key, string  dataSource)
{
string cs = System.Configuration.ConfigurationManager.ConnectionStrings[key].ConnectionString;
var cb = new System.Data.SqlClient.SqlConnectionStringBuilder(cs);
cb.DataSource = dataSource;
SetConnectionString(key, cb.ConnectionString);
}


برای تغییر و ذخیره ConnectionString در اجرای برنامه با VS باید دقت کنید که VS برنامه شما را کامپایل و در مسیر bin\Debug کپی میکند
پس وقتی از درون VS برنامه را اجرا کنید app.config موجود در سورس پروژه ویرایش و تغییر نمیکند
ولی اگر به مسیر bin\Debug بروید مشاهده میکنید که برنامه صحیح کار کرده و ConnectionString ویرایش شده
طبیعتا در برنامه نهایی هم مشکلی نخواهید داشت.

برای ویرایش ConnectionString میتوانید از کنترلر آماده زیر هم استفاده کنید.
http://support.h02.ir/fwlink/?LinkId=1001372507


SqlServer-ConnectionString-Editor-WinForm-Control لاتین



SqlServer-ConnectionString-Editor-WinForm-Control فارسی


موفق باشید.