PDA

View Full Version : سوال: اتصال به database موقع پیاده سازی در پروژه ای که از LinqToSql استفاده شده



hahaie
جمعه 01 آبان 1394, 16:10 عصر
سلام دوستان
من یه پروژه ی مهم برای سر کار دارم انجام میدم که قراره دیتابیس پروژه روی یک سرور قرار بگیره و نرم افزار روی کلاینت ها نصب بشن.
من توی نرم افزار برای اتصال به دیتابیس و همچنین برای اتصال گرید ویوها به جداول از Linq استفاده میکنم.
همونطور که میدونید جهت استفاده از Linq اول که باید از طریق منوی Toolsو سپس انتخاب Connect To Database به دیتابیس وصل شد و بعد از اون آیتم Linq To SQL Classes را به پروژه اضافه کرد و...
حالا چیزی که برام خیلی مهمه اینه که ضمن توجه به استفاده از Linq موقع پیاده سازی نرم افزار جهت اتصال به دیتابیسی که روی سرور هستش و IP و... داره باید چکار کنم؟
ممنون میشم راهنمایی کنین

am_al_59
شنبه 02 آبان 1394, 05:40 صبح
خدا اول از همه google و بعدش stackoverflow و codeproject و سرچ انجمن رو از ما نگیره نمیدونم چرا هیچکی استفاده نمیکنه :لبخندساده:
شما بطور عادی پروژت رو تعریف کن بعدش هم دستی هم توی برنامت میتونی connectionString رو تغییر بدی
Linq همه کدهایی که ایجاد میکنه بر اساس دیتابیسی هست که شما بهش میدی وقتی کارش انجام شد شما میتونی هرزمانی که خواستی کانکشن استرینگ رو تغییر بدی و کلاً آدرس دیتابیس روی WAN یا LAN بدی به جای local دیتابیس هم ممکنه با نسخه ای که شما از روش linq رو ساختی فرق کنه که اینم مهم نیست
اگر جدول و توابع زیاد تر داشته باشه که مشکلی نیست نه برای اتصال نه برای کار
اگر کمتر داشته باشه بازهم مشکلی نیست فقط برای اتصال اما در این حالت تا زمانی برای کار مشکلی نیست که ارجاعی به قسمت ناقص یا معیوب نباشه

اینها توضیحات اضافه بود که ممکنه الان سوالش برای شما پیش نیومده که در لینک زیر گفته نشده بود بقیه کامل در لینک زیر شرح داده شده

این بنده خدا هم زمان عید بود سوال شما رو داشت آخر سر هم به جواب رسید
http://barnamenevis.org/showthread.php?490797-پایگاه-داده-آنلاین-برای-سی-شارپ&highlight=آنلاین+linq (http://barnamenevis.org/showthread.php?490797-پایگاه-داده-آنلاین-برای-سی-شارپ&highlight=آنلاین+linq)

hahaie
شنبه 02 آبان 1394, 11:42 صبح
am_al_59 عزیز،اول که ممنون زحمت کشیدی.آخه تو گوگل و... سرچم که بزنی بازم این منظور من رو نمیشه پیدا کرد!
در مورد لینکی که گذاشتین آخرین پست شما تو همون لینک خیلی به جواب من نزدیکتره چون من سر کار دیدم که شرکتای دیگه خیلی راحت میان روی سرور ما دیتابیسشون را attach میکنن و توی برنامشون(که روی کلاینتای ما نصبه) توی یک فرم خیلی راحت آی پی سرور و نام دیتابیس،نام یوزر دیتابیس و پسورد اون رو میگیرن و راحت به دیتابیسشون وصل میشن.
من حتی این موضوع رو توی لینک زیر مطرح کردم ولی هنوز کسی جواب قطعی نداده:

http://barnamenevis.org/showthread.php?510554-%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D8%A8%D9%87-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D8%A7%D8%B2-%D8%AF%D8%B1%D9%88%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%88-%D8%A7%D8%B2-%D8%B7%D8%B1%DB%8C%D9%82-%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1-VS&p=2273587#post2273587

ضمن اینکه اگه جوابی برای لینک فوق دارین بگین که ممنون میشم ،
بحث دیگه اینه که خب حالا چطوری میتونیم تگ connection string موجود در فایل app.config رو براساس ورودی های یک فرم تنظیم کنیم؟
به خاطر همه چی ممنون

DrPedram
دوشنبه 11 آبان 1394, 23:12 عصر
بفرمایید دوست عزیز
http://barnamenevis.org/showthread.php?511288-%D9%88%D9%82%D8%AA%DB%8C-%D8%A8%D9%87-%D9%88%D8%B3%DB%8C%D9%84%D9%87-linq-%D8%A8%D9%87-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D9%85%D8%AA%D8%B5%D9%84-%D9%85%DB%8C%D8%B4%D9%85%D8%8C%D8%A7%DB%8C%D9%86-%D9%85%D9%87%D9%85%D9%87-%DA%A9%D9%87-DB-%DA%A9%D8%AC%D8%A7%D8%B3%D8%AA-%D9%88-Connection-String-%DA%86%DB%8C%D9%87%D8%9F&highlight=linq+%D8%AC%D8%AF%D9%88%D9%84

hahaie
یک شنبه 01 آذر 1394, 20:54 عصر
آقا خداییش یکی که اطلاعاتش کامله جوابی بده که منو بقیه به یه نتیجه ای برسیم.
من مدتهاست گیر این موضوعم.
توی لینکی که دوستان گذاشتن فقط فهمیدم توی فایل app.config کانکشن استرینگ هست.
خب حالا چند تا سوال پیش میاد:
1.اولا اینکه این کانکشن استرینگی که اینجا هست حالا به هر طریقی که ستش کنیم توی تمام پروژه اعمال میشه؟مثلا وقتی که ما یه گرید ویو رو به صورت ویزارد به جدول وصل میکنیم تو یکی از مراحل ویزارد کانکشن استرینک میپرسه(یا نشون میده).آیا برا اونجا هم ست میشه؟
2.خب چطوری میشه مقدار این کانکشن استرینگ موجود توی app.config رو با استفاده از کد تغییر داد.منظورم اینه که یه فرم طراحی کنیم که اسم دیتابیس،آی پی سرور،یوزر و پسورد دیتابیس و... رو از کاربر بگیره و بعد توی همین app.config ست کنه؟
خدا خیرش بده اونی رو که یه جواب درست به ما بده تا ما هم بفهمیم!!

ali_md110
یک شنبه 01 آذر 1394, 23:51 عصر
کانکشن استرینگ فایل ریشه app.config در تمام پروژه قابل استفاده هست حتی در ویزاردها
نمونه یک فایل ریشه



<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrame workSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/>
</startup>
<connectionStrings>
<add name="CnnString" connectionString="Data Source=192.168.50.22;
Persist Security Info=True;
User ID=a;Password=a;
Initial Catalog=mydb"/>

</connectionStrings>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFac tory, EntityFramework"/>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
</providers>
</entityFramework>
</configuration>

اگر نام رشته اتصال ما CnnStringباشد جهت دسترسی در کد سی شارپ بدینصورت هست


using (var cnn = new SqlConnection(ConfigurationManager.ConnectionStrin gs["CnnString"].ConnectionString))
{
}

این نکته مهم که فضای نام که در اسمبلی System.Configoration هست باید به برنامه رفرنس داده بشود
تغییر کانکشن استرینگ فایل کانفیگ در کدها
کانگشن استرینگ یک رشته هست و باید تکه های اون رشته رو از هم جدا کرد و مقدار دهی کرد
میتونیم از یک کلاس برای نگهداری اجزای زشته اتصال استفاده کنیم
و یک کلاس دیگه برای جدا کردن رشته
در کدهایی که در زیر فرستادم این کار انجام شده



SplitString SplitData { get; set; }
IList<SplitString> SplitStringList { get; set; }
private void LoadConnectionStrings()
{
var cnSection = ConfigurationManager.OpenExeConfiguration(Configur ationUserLevel.None);
String connString = cnSection.ConnectionStrings.ConnectionStrings["CnnString"].ConnectionString;
SplitStringList = new List<SplitString>();
string[] split = connString.Split(new[] { ';'});
var counter = 0;
foreach (var s in split)
{
if (s.Trim() != "")
{
counter = counter + 1;
SplitData = new SplitString(counter, s.Split(new[] { '=' })[1]);
SplitStringList.Add(SplitData);

}
}
txtServerName.Text = SplitStringList.Single(x => x.Counter == 1).Value;
txtID.Text = SplitStringList.Single(x => x.Counter == 3).Value;
txtPass.Text = SplitStringList.Single(x => x.Counter == 4).Value;
txtDB.Text= SplitStringList.Single(x => x.Counter == 5).Value;

}
private void ChangeConnectionSettings(ConnectionStringItem cp)
{
var cnSection = ConfigurationManager.OpenExeConfiguration(Configur ationUserLevel.None);
String connString = cnSection.ConnectionStrings.ConnectionStrings[cp.Name].ConnectionString;
connString = ChangeConnectionStringItems(connString, "Data Source", cp.DataSource);
//connString = ChangeConnectionStringItems(connString, "provider connection string=\"server", cp.DataSource);
connString = ChangeConnectionStringItems(connString, "User ID", cp.Username);
connString = ChangeConnectionStringItems(connString, "Password", cp.Password);
connString = ChangeConnectionStringItems(connString, "Initial Catalog", cp.InitCatalogue);
//connString = ChangeConnectionStringItems(connString, "Database", cp.InitCatalogue);
cnSection.ConnectionStrings.ConnectionStrings[cp.Name].ConnectionString = connString;
cnSection.Save();
ConfigurationManager.RefreshSection("connectionStrings");
}
private String ChangeConnectionStringItems(string connString, string option, string value)
{
String[] conItems = connString.Split(';');
String result = "";
foreach (String item in conItems)
{
if (item.StartsWith(option))
{
result += option + "=" + value + ";";
}
else
{
result += item + ";";
}
}
return result;
}

public class SplitString
{
public SplitString(int counter, string value)
{
Counter = counter;
Value = value;
}

public int Counter { get; set; }
public string Value { get; set; }

}
public class ConnectionStringItem
{
public String Name { get; set; }
public String DataSource { get; set; }
public String Username { get; set; }
public String Password { get; set; }
public String InitCatalogue { get; set; }

public ConnectionStringItem(String name, String dataSource, String username, String password,
String initCat)
{
Name = name;
DataSource = dataSource;
Username = username;
Password = password;
InitCatalogue = initCat;
}
}

private void btnSave_Click(object sender, EventArgs e)
{
var csc = new ConnectionStringItem("CnnString", txtServerName.Text.Trim(),
txtID.Text.Trim(), txtPass.Text.Trim(), txtDB.Text.Trim());
ChangeConnectionSettings(csc);
}

hahaie
دوشنبه 02 آذر 1394, 13:18 عصر
ممنون دوست عزیز.حالا با توجه به کدی که توی دکمه save نوشتین این کد برای کل پروژه کافیه؟منظورم اینه که مثلا من اگر یه گرید رو خواستم به صورت ویزارد به یک جدول وصل کنم(میدونید که یکی از مراحل این ویزارد تعریف کانکشن استرینگ هست)اون رو باید چکار کنم؟

Mahmoud.Afrad
دوشنبه 02 آذر 1394, 15:36 عصر
برای ساخت کانکشن از کلاس SqlConnectionStringBuilder و برای ذخیره در app.config از رفرنس و فضای نام System.Configuration استفاده کنید:

private void SaveConnection(string connectionName, string dataSource, string initialCatalog, string username, string password)
{
SqlConnectionStringBuilder csb = new SqlConnectionStringBuilder
{
DataSource = dataSource,
NetworkLibrary = "DBMSSOCN",
InitialCatalog = initialCatalog,
UserID = username,
Password = password
};
Configuration config = ConfigurationManager.OpenExeConfiguration(Configur ationUserLevel.None);
ConnectionStringSettings dbConnString = config.ConnectionStrings.ConnectionStrings[connectionName];
if (dbConnString == null)
{
config.ConnectionStrings.ConnectionStrings.Add(new ConnectionStringSettings(connectionName,
csb.ConnectionString));
}
else
{
dbConnString.ConnectionString = csb.ConnectionString;
}
config.Save(ConfigurationSaveMode.Modified, true);
ConfigurationManager.RefreshSection("connectionStrings");
}

از اونجایی که LinqToSql کانکشن خودش رو از setting میخونه بایست حتما کانکشن جدید رو از فایل app.config خونده و به سازنده مدل context ارسال کنید.

ConnectionStringSettings dbConnection = System.Configuration.ConfigurationManager.Connecti onStrings[connectionName];
DataClasses1DataContext db = new DataClasses1DataContext(dbConnection.ConnectionStr ing);

Yanehsar
دوشنبه 02 آذر 1394, 22:25 عصر
برای ساخت کانکشن از کلاس SqlConnectionStringBuilder و برای ذخیره در app.config از رفرنس و فضای نام System.Configuration استفاده کنید:

private void SaveConnection(string connectionName, string dataSource, string initialCatalog, string username, string password)
{
SqlConnectionStringBuilder csb = new SqlConnectionStringBuilder
{
DataSource = dataSource,
NetworkLibrary = "DBMSSOCN",
InitialCatalog = initialCatalog,
UserID = username,
Password = password
};
Configuration config = ConfigurationManager.OpenExeConfiguration(Configur ationUserLevel.None);
ConnectionStringSettings dbConnString = config.ConnectionStrings.ConnectionStrings[connectionName];
if (dbConnString == null)
{
config.ConnectionStrings.ConnectionStrings.Add(new ConnectionStringSettings(connectionName,
csb.ConnectionString));
}
else
{
dbConnString.ConnectionString = csb.ConnectionString;
}
config.Save(ConfigurationSaveMode.Modified, true);
ConfigurationManager.RefreshSection("connectionStrings");
}

از اونجایی که LinqToSql کانکشن خودش رو از setting میخونه بایست حتما کانکشن جدید رو از فایل app.config خونده و به سازنده مدل context ارسال کنید.

ConnectionStringSettings dbConnection = System.Configuration.ConfigurationManager.Connecti onStrings[connectionName];
DataClasses1DataContext db = new DataClasses1DataContext(dbConnection.ConnectionStr ing);

سلام
یه سوال برای من پیش اومده وقتی که linq to sql رو اد می کنم بصورت اتوماتیک خودش کانکشن رو ایجادمیکنه مثله شکل زیر که از نوع application هستش و قابل تغییر توسط کاربر نیست درسته آیا137005؟؟؟؟؟؟

Mahmoud.Afrad
دوشنبه 02 آذر 1394, 22:52 عصر
سلام
یه سوال برای من پیش اومده وقتی که linq to sql رو اد می کنم بصورت اتوماتیک خودش کانکشن رو ایجادمیکنه مثله شکل زیر که از نوع application هستش و قابل تغییر توسط کاربر نیست درسته آیا137005؟؟؟؟؟؟

بله ، اونجایی که bold کردم همینو گفتم. به خاطر همین کانکشن جدید رو توی app.config ذخیره و موقع نمونه سازی از مدل، کانکشن رو خونده و به سازنده ارسال میکنیم.
میتونید پراپرتی connection از datacontext رو بزارید روی none (با این کار کانکشن از settings حذف میشه)
و
application settings رو هم false کنید (با این کار در صورتی که کانکشن none نباشه ، کانکشن به کلاس context منتقل میشه)
البته اگر تغییری روی مدل context ایجاد کنید دوباره کانکشن پیشفرض ایجاد خواهد شد

http://www.west-wind.com/WebLog/images/200701/WindowsLiveWriter/LINQToSQLand.ConfigConnectionStringValue_1232A/DataContextPropertySheet_3.png

hahaie
سه شنبه 03 آذر 1394, 06:37 صبح
Mahmood.Afrad جان هدف از پست اولتو من نفهمیدم منظورت اینه که روش Ali_md110 اشتباهه؟؟
ضمنا جواب پست من(اونی که بعد از پست Ali_md110 اومده)رو که ندادین،حداقل جواب اون رو بدین!!!

hahaie
شنبه 07 آذر 1394, 16:41 عصر
یه مسلمون پیدا نمیشه این تاپیک مفید رو به انتها برسونه و جواب منو بده؟؟ :عصبانی++:
فقط اگه امکانش هست بی دلیل کد جدید نگذارین....

خود Mahmood_Afrad اگه جواب سوالی که از پستش رو پرسیدم بده خیلی بهتره
Mahmood Afrad جان این سوال هم جواب بدی ممنون میشم:
1.اینکه تکه کد دومی که 3 خط هستش این رو کجا باید نوشتش؟داخل همون تابع؟
2.توی پست بعدترت گفتی که یه سری پروپرتی باید ست کنیم.این پروپرتی ها مال چی هستش؟من dataclasses ی که با انتخاب Link to Sql ایجاد کردم رو انتخابش کردم ولی همچین پروپرتی هایی نداره؟(از ویژوال 2013)استفاده میکنم.
ضمنا من توی خیلی از پروژه ها دیدم از Data Link Properties استفاده میکنن،اون چطوریه؟(ضمیمه رو ببینید)
137100

137101
ممنون

Mahmoud.Afrad
شنبه 07 آذر 1394, 20:35 عصر
متد SaveConnection ای که من گذاشتم کانکشن ایجاد میکنه و اونو توی app.config ذخیره میکنه. همون کاری که کد ali_md110 (http://barnamenevis.org/member.php?18325-ali_md110) انجام میده ، منتها از کلاس خود دات نت استفاده کردم.
برای ایجاد و ذخیره کانکشن میتونی یک فرم طراحی کنی و توسط یکی از متدهایی که من یا ali_md110 (http://barnamenevis.org/member.php?18325-ali_md110) قرار دادیم، برای ذخیره در فایل استفاده کنی. و یا اینکه از فایل .udl که خودت گفتی استفاده کنی. در این حالت دیگه نیازی به طراحی فرم برای گرفتن آی پی و یوزر و پسورد نداری .
مهم این هست که موقعی که میخواهی از روی dataclasses نمونه بسازی (new کنی) باید کانکشن رو هر جا ذخیره کردی ، بخونی و به متد سازنده dataclasses ارسال کنی تا از اون کانکشن استفاده کنه(همون کاری که توی اون سه خط کردم. برای اینکه بتونم کانکشن رو از app.config بخونم از Configuration استفاده کردم. اگر کانکشن رو در جایی غیر از app.config ذخیره کنی نیازی به استفاده از Configuration نداری)

hahaie
یک شنبه 08 آذر 1394, 07:06 صبح
ممنون دوست عزیز.
1.اگه زحمتی نیست میشه طرز استفاده از فایل udl رو هم بگین؟
2.ضمنا اگه میشه پارامترهای اون تابع رو بجز یوزر و پسورد یه توضیح مختصری بدین.
3.همچنین موفقیت آمیز بودن اتصال رو کجا باید چک کرد و چطوری؟
ممنون

hahaie
یک شنبه 08 آذر 1394, 16:28 عصر
کسی نیست جواب بده؟؟؟
Mahmood_Afrad کجایی؟؟؟؟؟

Mahmoud.Afrad
یک شنبه 08 آذر 1394, 17:58 عصر
فایل udl در sqlclient قابل استفاده نیست.

It is possible to supply connection information for an OleDbConnection in a Universal Data Link (UDL) file; however you should avoid doing so. UDL files are not encrypted, and expose connection string information in clear text. Because a UDL file is an external file-based resource to your application, it cannot be secured using the .NET Framework. UDL files are not supported for SqlClient.


منبع
https://msdn.microsoft.com/en-us/library/ms254500.aspx

پس کانکشن باید در جایی مثل app.config ، setting ، فایل xml ، فایل معمولی و یا رجیستری ذخیره بشه.

اون متدی که من نوشتم کانکشن رو در app.config ذخیره میکنه.
connectionName نامی هست که کانکشن به این نام ذخیره خواهد شد. برای خواندن کانکشن هم از همین نام استفاده میشه. میتونید حذفش کنید و یک مقدار پیشفرض به جاش استفاده کنید.
dataSource شامل IP و port
initialCatalog نام دیتابیس

https://www.connectionstrings.com/sqlconnection/connect-via-an-ip-address


بعد از دریافت اطلاعات و ساختن کانکشن، اونو به datacontext ارسال و یکبار open کنید

DataClasses1DataContext db = new DataClasses1DataContext("whatever");
try
{
db.Connection.Open();
MessageBox.Show(@"Connection is correct!");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

hahaie
سه شنبه 10 آذر 1394, 16:43 عصر
Mahmood_Afrad عزیز ممنون از جوابتون.چند تایی سوال دیگه :خجالت:
1.whatever که نوشتین همون پارامتر connectionname هست؟
2.برای اینکه توی هر فرم بتونم به جداول دسترسی پیدا کنم از DataContext یه new ساختم(توی هر فرم).بنابراین طبق پست بالایی شما اگه قرار باشه توی هر فرم که من new میکنم کانکشن رو open کنم که منطقی نیست.بنابراین لازمه که این کار فقط یکبار انجام بشه.نظرتون چیه و باید چکار کرد؟
3.برا تست باید از پروژه setup ساخت و در حالت exe این کار رو کرد؟آخه توی ویژوال استادیو وقتی بخوایم این کد رو تست کنیم چون اومدیم از طریق پنجره ی connect to database(منوی tools اگه اشتباه نکنم) به دیتابیس لوکال متصل شدیم یه مشکلی نیست اینجا؟؟؟ !!! :گیج:

Mahmoud.Afrad
سه شنبه 10 آذر 1394, 19:18 عصر
بله ، whatever همون کانکشن هست.

اونجایی که open استفاده شده برای تست کانکشن در زمانی هست که ip و یوزر و پسورد رو از کاربر میگیرید. اونجا بعد از ایجاد کانکشن ، یکبار open میکنید که ببینید آیا اطلاعات درست هست یا نه. اگر بود کانکشن رو ذخیره میکنید.

میتونید یک پراپرتی static در یک کلاس ایجاد کنید و در متد main کانکشن رو بخونید و در این پراپرتی قرار بدید. هر جا DataContext را new میکنید کافیه اون پراپرتی رو بهش ارسال کنید.

hahaie
چهارشنبه 11 آذر 1394, 11:09 صبح
ممنون دوست عزیز.فعلا دسترسی به پروژه ندارم که ببینم میشه یا نه انشاءالله چند روز دیگه.
مهندس جان کاش جواب سوال سومم رو هم میدادین...
فکر میکنم این تاپیک یکی از مفیدترین تاپیک ها از آب در اومد!واقعا جای تشکر از Mahmoud.Afrad داره.

hahaie
پنج شنبه 12 آذر 1394, 15:07 عصر
Mahmoud.Afrad (http://barnamenevis.org/member.php?71297-Mahmoud-Afrad) جواب سوال سوال سوم چی شد؟منتظرم

hahaie
شنبه 14 آذر 1394, 09:35 صبح
کسی نیست؟.......

davidrobert
شنبه 14 آذر 1394, 14:19 عصر
سلام دوستان
من یه پروژه ی مهم برای سر کار دارم انجام میدم که قراره دیتابیس پروژه روی یک سرور قرار بگیره و نرم افزار روی کلاینت ها نصب بشن.
من توی نرم افزار برای اتصال به دیتابیس و همچنین برای اتصال گرید ویوها به جداول از Linq استفاده میکنم.
همونطور که میدونید جهت استفاده از Linq اول که باید از طریق منوی Toolsو سپس انتخاب Connect To Database به دیتابیس وصل شد و بعد از اون آیتم Linq To SQL Classes را به پروژه اضافه کرد و...
حالا چیزی که برام خیلی مهمه اینه که ضمن توجه به استفاده از Linq موقع پیاده سازی نرم افزار جهت اتصال به دیتابیسی که روی سرور هستش و IP و... داره باید چکار کنم؟
ممنون میشم راهنمایی کنین

دوست عزیز من یک روش بهتر سراغ دارم برای شما هم سرعت کار شما بیشتر میشه برای ارتباط با دیتابیس هم مشکل شبکه کردن داشته نمیشید من تا الان هم با ای اف و هم با لینکیو و ADO کد نویسی کردم ولی در این روش ADO بهترین روش هستش امدم دیتابیس رو به صورت مجازی ساختم بدون نیاز به DataSet یا پروسیجیر و امدم به وسیله یه کلاس به دیتابیس اسکیول سرور وصل شدم همه به صورت LAN,WAN,Wireless وصل شدم قشنک جواب داده تنها کاری که من انجام دادم این بود مقدار اتصال رو IP تعریف کردم و چون تو اتصال دهی IP عوض میشه امدم تو تنظیمات برنامه گفتم IP تو تنظیمات برنامه ذخیره بشه و تو تنظیمات برنامه گفتم وقتی طرف روی کادر متن زد IP سیستم رو بگیر و بریز داخل سیستم و شما IP که اسکیول سرور هستش رو ورمیدارید به تمام برنامه های سرور میدید با IP سیستمی که دیتاببیس وصل هستش شخص به دیتابیس اصلی وصل میشه. بدون مشکل هر گند تا سیستم باشه با دادن IP به برنامه وصل میشید. و دیگه مشکل APP.config رو ندارید چون اصلا با App.config کار ندارید کار اتصال با دیتابیس با یک کد 7 خطی کلاس انجام میشه
http://barnamenevis.org/showthread.php?513735-%D8%AF%D9%81%D8%AA%D8%B1%DA%86%D9%87-%D8%AA%D9%84%D9%81%D9%86-%D8%A8%D8%A7-%D8%AA%DA%A9%D9%86%D9%88%D9%84%D9%88%DA%98%DB%8C-ADO-%D8%A8%D8%A7-SQL-Server
این سورس من هستش فقط کافی هستش در قسمت ادرس دهی به این صورت ادرسی دهی با IP کنید.
به این نو کانکشن میگن کانکشن با تنظیمات که IP رو از تنظیمات برنامه میگیره
@"Data Source=" +Properties.Settings.Default.IPSystem+ ";Initial Catalog=master;User ID=SayyehBan;Password=destory1991";

به این میگن گرفتن IP دستی
@"Data Source=192.168.110.1;Initial Catalog=master;User ID=SayyehBan;Password=destory1991";

hahaie
شنبه 14 آذر 1394, 15:20 عصر
davidrobert (http://barnamenevis.org/member.php?251829-davidrobert) عزیز، من و Mahmood.Afrad این همه رو اون موضوع بحث کردیم حالا بخوام روش رو عوض کنم و تازه بیام ببینم شما چی گفتین یکم سخته



Mahmood.Afrad جواب سوال 3 (از من رو)ندادی منم خواستم ببینم میشه توی VS از طریق سرور به دیتابیس وصل شد یا نه.برا همین اومدم دیتابیس رو از توی Server Explorer (که قبلا از طریق connect to database و بصورت local)حذف کردم.بعد دوباره خواستم از طریق پنجره Connect to Database به دیتابیس روی سرور کانکت بشم که نشد دوباره اومدم به صورت local وصل بشم که وصل شد اما حالا که پروژه را اجرا میکنم خطا میده:
به این کد که توی فایل Designer مربوط به DataContext هستش ایراد میگیره:


public DataBaseClassesDataContext(string connection) :

base(connection, mappingSource)

{

OnCreated();

}



متن خطا :
An unhandled exception of type 'system.ArgumentNullException' occured in system.Data.Linq.dll
بی زحمت هم جواب سوال 3 رو بگین هم رفع این مشکل رو :عصبانی++:
ممنون

hahaie
شنبه 14 آذر 1394, 17:12 عصر
جالبه اومدم تمام اونجاهایی که DataContext را new کرده بودم و بعد از این تاپیک اومده بودم آون رو به شکل زیر تغییر دادم:


dataclassesdatacontext1 da=new dataclaseesdatacontext1(string connection);

تغییری که دادم این بود که متغیر ورودی یعنی connection رو برداشتم و دیگه خطا نداد.
Mahmood.Afrad تو رو خدا بیا بگو چرا اینطور شده؟؟؟

hahaie
شنبه 14 آذر 1394, 17:50 عصر
آقا یه کارایی کردم (البته خودمم نفهمیدم باید فردا بشینم همه چیز رو مرتب کنم)ولی موقع اجرا که آدرس سرور و دیتابیس و ... رو بهش دادم این خطا رو نشون داد:
137257

davidrobert
شنبه 14 آذر 1394, 20:13 عصر
آقا یه کارایی کردم (البته خودمم نفهمیدم باید فردا بشینم همه چیز رو مرتب کنم)ولی موقع اجرا که آدرس سرور و دیتابیس و ... رو بهش دادم این خطا رو نشون داد:
137257
دوست عزیز میدونید اشکال کار در چی هستش. من میگم.
اول هر دستگاه یک IP مخصوص به خود را دارا می باشد. یعنی چه
یعنی اگه اسکیول سرور روی یک سیستم قرار داشته باشه و دیتابیس هم روی اون سیستم قرار داشته باشه اگه به صورت LAN به LAN وصل بشید به شما یک IP میده به شما اگه به صورت LAN و WAN وصل بشید یک IPدیگه میده و اگه به صورت LAN و Wireles وصل بشید یک IP دیگه سیستم به شما میده و در آخر اگه به صورت Wireless و Wirelss وصل بشید یک IP دیگه میده همین طور که مشاهده کردید 4 تا IP مختلف دریافت کردید از روی یک سیستم . ولی App.config رو نمی تونید کاری باهاش انجام بدید اون کانکشن ثابت خودش رو داره برای ارتباط یعنی app.config برای تغییر دادن محتواش کار رو سخت کرده و هتا این عمل باعث آسیب رساندن به برنامه میشه که اصلاً خوب نیست ولی تو روش من اصلا شما نیازی به app.configندارید فقط یه کادر متن قرار میدید و میگید بیاد برنامه IP سیستم رو داخل کادر متن نشان بده . حالا ما با این فرض که در نظر میگیریم میگیم 5 تا کامپیوتر داریم از اون 5 تا کامپیوتر اسکیول سرور روی یکی نصب هستش و باقی سیستم ها اسکیول سرور رو ندارن به همین دلیل ما تو رویداد دابل کلیک کادر متن میگیم اگه دوبار روی کادر متن خورد IP جدید رو بده اگه دوبار کلیک نکردید تو تنظیمات برنامه امدید مقدار IP رو تعریف کردید.
این تصویر رو مشاهده کنید این تصویر برنامه من هستش

http://s3.picofile.com/file/8224539968/Tools.pngقسمت لطفا IP رو وارد کنید در کادر متن IP پیش فرض از تنظیمات برنامه داره میخونه.
http://s6.picofile.com/file/8224541150/Properties_2.png
این هم قسمت تعریف Setting برای برنامه که تو وبلاگ خودم اموزش دادم.
http://www.sayyehban.blogfa.com/post/23
شما به این وسیله میاد IP رو پیش فرض تعریف میکنی و با زدن روی کادر متن IP جدید رو دریافت میکنید IP سیستم که روش اسکیول سرور هستش و به تمام سیستم های دیگه هم این IP رو میدی و سیستم شما به دیتابیس وصل میشه بدون هیچ مشکلی این که گفتم اثر تجربه خودم هستش و اون اموزشی ADO که دادم بخاطر این هستش که سرعت در برنامه نویسی خیلی مهم هستش که برنامه سریع به دیتابیس وصل بشه و اطلاعات رو بخونه بیاره برای نمایش LINNQ و EF هم تکنولوژِی خیلی خوبی هستش ولی یه ایراد داره وقتی تعداد جداول بیشتر بشه سرعت ارتباط با دیتابیس عفت پیدا میکنه و وقتی اطلاعات برنامه بیشتر بشه باز اطلاعات بیشتر عفت پیدا میکنه و این برای مشتری نارضایتی داره و مشتری بخاطر کدی سرعت برنامه شاکی میشه از برنامه شما به همین دلیل من این فایل آموزشی رو درست کردم به کمک استادام آقا مرباغی و برای شما قرار اددم تا برنامه رو طوری درست کنید ایراد نداشته باشه و سرعت برنامه زیاد باشه http://www.sayyehban.blogfa.com/post/24

hahaie
شنبه 14 آذر 1394, 20:58 عصر
دوست عزیز من راهمو رفتم و linq رو در پیش گرفتم بنابراین برگشت به عقب برام سخته.سورسی هم که گذاشته بودین من نفهمیدم دیتابیسش کجا هست!!
بعدشم شما توی این پیغام خطا از کجا فهمیدین من 4 تا IP مختلف دریافت کردم؟؟ :ناراحت:

خیلی ممنون از جواب دادنت ولی بهتره MahmoudAfrad بیاد بحثش رو تموم کنه.تا بعد اگه جواب نداد ببینم میتونم برگردم عقب و از راهنماییای شما استفاده کنم.
ای خدااااا MahmoudAfrad چرا جواب نمیدی؟؟؟؟

davidrobert
شنبه 14 آذر 1394, 23:15 عصر
دوست عزیز من راهمو رفتم و linq رو در پیش گرفتم بنابراین برگشت به عقب برام سخته.سورسی هم که گذاشته بودین من نفهمیدم دیتابیسش کجا هست!!
بعدشم شما توی این پیغام خطا از کجا فهمیدین من 4 تا IP مختلف دریافت کردم؟؟ :ناراحت:

خیلی ممنون از جواب دادنت ولی بهتره MahmoudAfrad بیاد بحثش رو تموم کنه.تا بعد اگه جواب نداد ببینم میتونم برگردم عقب و از راهنماییای شما استفاده کنم.
ای خدااااا MahmoudAfrad چرا جواب نمیدی؟؟؟؟

چون برنامه خودم من به صورت شبکه هستش و هر بار اینترنتم قطع میشه یه IP به هم میده اینترنت وصل میشه یه IP دیگه به هم میده و با وای فا وصل میشم یه IP دیگه بهم میده برای اینکه با مشکل بر خورد نکم تو تنظیمات هر وقت IP عوض بشه به IP جدید وصل میشم دوم دیتابیس قرار ندادم اسکریپت دیتابیسم رو قرار دادم برای کار کردن.

Mahmoud.Afrad
یک شنبه 15 آذر 1394, 04:40 صبح
اول اینکه در sqlserver ای که روی کامپیوتر سرور هست باید user جدید بسازید و نحوه لاگین به sqlserver را هم روی mixed mode قرار بگیره
http://www.dbsimplified.com/2011/10/change-windows-authentication-to-mixed.html

دوم اینکه باید تنظیمات سرور انجام شده و همچنین اجازه استفاده از پورت در فایروال ویندوز صادر شود
https://msdn.microsoft.com/en-us/library/bb909712.aspx
http://support.webecs.com/kb/a868/how-do-i-configure-sql-server-express-to-allow-remote-tcp-ip-connections-on-port-1433.aspx
https://www.blackbaud.com/files/support/infinityinstaller/content/installermaster/tkenablenamedpipesandtcpipconnections.htm
هر پورتی انتخاب میکنید باید همون پورت رو در فایروال ویندوز allow کنید.

یکبار سرویس sql را restart کنید.


پروسه بالا برای آماده سازی sqlserver هست که روی کامپیوتر سرور باید انجام بشه. برای اینکه تست کنید میتونید همین کارها را روی کامپیوتر خودتون انجام بدید. اگر فرض کنیم نام instance نصب شده روی سیستم sqlexpress هست و پورت را روی 1433 (طبق لینکهای بالا) تنظیم کردیم، کاربری به نام abc و پسورد 123 ایجاد کردیم و نام دیتابیس TestDB هست ، کانکشن برای اتصال به sqlexpressای که روی کامپیوتر خودتون نصب شده به صورت زیر خواهد بود
Data Source=127.0.0.1,1433\SQLEXPRESS;Initial Catalog=TestDB;User ID=abc;Password=123;

برای اینکه در visualstudio بتونید از طریق ip وصل بشید باید ip را به همراه port و نام instance وارد کادر server name کنید. برای مثال بالا 127.0.0.1,1433\SQLEXPRESS نام سرور محلی خواهد بود.


همونطوریکه گفتم برای اتصال به سرور در سیستم دیگر باید ip و پورت رو مطابق ip پورت سرور اصلاح کنید.

hahaie
یک شنبه 15 آذر 1394, 14:15 عصر
Mahmoud.Afrad (http://barnamenevis.org/member.php?71297-Mahmoud-Afrad) عزیز من با استفاده از متدی که توی پست 8 همین تاپیک گذاشتین سعی کردم به دیتابیس وصل بشم ولی همون پیغامی که توی پست 25 گذاشتم رو نشون میده.ضمن اینکه پورتی که بهش میدم درسته چون یه نرم افزار دیگه که دقیقا از همین آی پی و پورت استفاده میکنه از رو سیستمم وصل میشه مشکلی هم نداره.
همچنین با همون یوزر و پسوردها میتونم از طریق sql server managment لاگین کنم.
جهت تست اون پارامتر NetworkLibrary رو هم برش داشتم(نمیدونستم چیه)ولی جواب نداد.
connection string رو هم از csb.connectionstring چک کردم درست هستش :عصبانی++:
تو رو خدا آخرای کارم راهنمایی کنید.

davidrobert
یک شنبه 15 آذر 1394, 20:22 عصر
Mahmoud.Afrad (http://barnamenevis.org/member.php?71297-Mahmoud-Afrad) عزیز من با استفاده از متدی که توی پست 8 همین تاپیک گذاشتین سعی کردم به دیتابیس وصل بشم ولی همون پیغامی که توی پست 25 گذاشتم رو نشون میده.ضمن اینکه پورتی که بهش میدم درسته چون یه نرم افزار دیگه که دقیقا از همین آی پی و پورت استفاده میکنه از رو سیستمم وصل میشه مشکلی هم نداره.
همچنین با همون یوزر و پسوردها میتونم از طریق sql server managment لاگین کنم.
جهت تست اون پارامتر NetworkLibrary رو هم برش داشتم(نمیدونستم چیه)ولی جواب نداد.
connection string رو هم از csb.connectionstring چک کردم درست هستش :عصبانی++:
تو رو خدا آخرای کارم راهنمایی کنید.

بفرما دادش این فیلم اموزشی http://s6.picofile.com/file/8226697026/SQL_NETwork.swf.html توضیحات آقای Mahmoud.Afrad (http://barnamenevis.org/member.php?71297-Mahmoud-Afrad) رو کامل میکنه به وسیله این فیلم اموزشی میتونید تنظیمات شبکه تون رو انجام بدید و برنامه شما به صورت شبکه کار میکنه و به صورت شبکه به برنامه خودتون وصل میشید.

Mahmoud.Afrad
دوشنبه 16 آذر 1394, 03:28 صبح
کانکشن قبلی و کانکشن جدید رو بزار.

اگر میتونی پروژه رو پیام خصوصی کن یه نگاه بندازم.

hahaie
دوشنبه 16 آذر 1394, 07:46 صبح
کانکشن قبلی که از طریق local به دیتابیس وصل میشدم اینه:


<connectionStrings>
<add name="RewardSoftware.Properties.Settings.RewardDBConnect ionString" connectionString="Data Source=.;Initial Catalog=RDB;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>


ولی کانکشنی که الان از تابع شما میگیرم اینه:


Data Source=192.168.76.2\sql2008,1433;Initial Catalog=RDB;User ID=reward;Password=abcd@12345

ببینید از این میشه چیزی فهمید؟
ممنون

hahaie
دوشنبه 16 آذر 1394, 08:34 صبح
هوراااااااااااااااااااااا ااااااااااااااااااااااااا اااااااااااااااااا
آقا حل شد.
Mahmoud.Afrad (http://barnamenevis.org/member.php?71297-Mahmoud-Afrad) جان عزیز ای ول داری بخدا.گفتی پروژه رو برات بفرستم نشستم سبکش کردم(بعضی فرم ها و کدهایی که نیاز نبود رو حذف کردم) که بفرستم وقتی سبک شد دیدم اتصالشم درست شد.
واقعا جای تشکر داره از Mahmoud.Afrad (http://barnamenevis.org/member.php?71297-Mahmoud-Afrad) :تشویق: حتی ساعت پست ها رو که میدیدم می فهمیدم صبح های خیلی زود جواب منو داده.
خیلی ازت ممنونم کمک بزرگی بهم کردی:قلب:
Mahmoud.Afrad (http://barnamenevis.org/member.php?71297-Mahmoud-Afrad) فقط میگم ایت تاپیک خیلی بدرد بخور شد چون توی سایت هم دیدم خیلی سوال شده بود که یا جواب داده نشده بود یا نصفه رها شده بود....
هر طور که میدونی این پست(34) و 33 و 32 رو حذف کن و یه جایی توی سایت اگه صلاح میدونی معرفیش کن.
بازم از همه دوستانی که تو این تاپیک راهنمایی کردن ممنونم...
موفق باشید

Mahmoud.Afrad
دوشنبه 16 آذر 1394, 08:53 صبح
در سرور از طریق SQL server management studio سعی کنید با نام سرور .\sql2008 به همراه یوزر پسورد وارد بشید. اگر پیغام خطای A network-related ... داد به معنی اینه که نام instance یعنی sql2008 اشتباه هست. ولی اگر وارد شد، یعنی تنظیمات مربوط به پورت و ip که در SQL Server Configuration Manager انجام دادید ناقص هست. تست کنید و نتیجه رو بگید.

hahaie
دوشنبه 16 آذر 1394, 09:51 صبح
نه عزیز حل شد.....
توی سرور و حتی توی سیستم خودم به دیتابیس از طریق Sql Sertver وصل میشم.
فقط میمونه یه مشکل:
در مورد کدی که توی پست 16 گذاشتین:
چون قراره از DataClasses1DataContext یه نمونه جدید ساخته بشه و در همه جای فرم(منظورم همه رویداد های اشیاء فرم هستش)ازش استفاده بشه پس باید به صورت متغیر سراسری در کدهای مربوط به یک فرم تعریف بشه.حالا این مشکل پیش میاد که چون قراره connectionString ی که ایجاد میشه موقع تعریف نمونه به آن ارسال بشه خطا میده که Connectionstring هنوز null هستش چون کدهای مربوط به ایجاد connectionstring رو در رویداد login فرم نوشتم.
حالا نظرتون چیه؟

Mahmoud.Afrad
دوشنبه 16 آذر 1394, 10:02 صبح
کد پست 16 فقط برای تست بود که ببینید ip و یوزر و پسوردی که کاربر وارد میکنه درست هست یا نه. از این کد فقط در فرمی که ip و یوزر پسورد رو میگیرید برای test connection استفاده کنید نه جای دیگر.


در متد main در کلاس program کانکشن(لوکال یا دارای ip فرقی نداره) رو بخونید و در متغیر استاتیک قرار بدید. هر جا(از جمله در فرم لاگین) کانکشن رو به سازنده ارسال کنید.

hahaie
دوشنبه 16 آذر 1394, 10:46 صبح
آقا درست شد ممنون