PDA

View Full Version : سوال: چگونگی اتصال نرم افزار به بانک اس کیو ا ل در سیستم دیگر از طریق برنامه نویسی سوکت



zrasekhi
جمعه 07 بهمن 1390, 20:18 عصر
سلام دوستان .
نرم افزار من در چندین سیستم نصب شده است و بانک در روی یک سیستم دیگر قرار دارد . من می خواهم سیستم های دیگر براحتی به بانک روی سیستم سرور وصل شوند. شنیدم اگه از طریق سوکت وصل شوند خیلی امن تر است و امکان هک کردن بانک وجود ندارد . کسی هست که بتونه به من کمک کنه؟

zarrinnegar
جمعه 07 بهمن 1390, 23:18 عصر
توی برنامه نویسی سوکت ، در واقع شما باید با یک پورت کار کنید و اطلاعات رو از طریق اون بگیرید و بفرستید
توی این حالت ، برنامه سمت کلاینتها دیگه با ado و یا Linq به sqlserver وصل نمیشن و اصلا بانک اطلاعات رو نمیشناسند

شما در حالت عادی هر بار که برنامه اجرا میشه بوسیله یک Connectionstring و مقداری که داخل اون تنظیم میشه به بانک اطلاعات لاگین میکنید و اطلاعات رو رد و بدل میکنید تو این حالت شما با یک User , pass به sql وصل میشید که اگر کسی اون نام کاربری و رمز رو بفهمه میتونه به sql متصل بشه و اطلاعات رو دستکاری کنه

توی روش سوکت ، و یا روش Remote برنامه شما دیگه بانک رو نمیبینه و لازم هم نیست ببینه
یک برنامه واسط نوشته میشه که میتونه از نوع winApp و یا WinService و یا حتی ConsoleApp باشه
لایه BL رو توی اون مینویسید . تمام پروسیجر های لازم برای Insert, Update , Delete , Select برای تمام جداول موجود توی sql
بعد بوسیله این لایه از برنامه این توابع رو فراخوانی میکنید و فقط مقادیر رو بهش پاس میدید و اون لایه BL هم اطلاعات رو به sql میده و یا ازش میگیره و به برنامه شما پس میده

این روش هم برنامه نویسی شما رو 3 لایه میکنه و هم دیتا رو امن میکنه

توی این حالت لایه BL تنها چیزی که به برنامه میده DataTable هست که داخلش اطلاعات شماست
میشه از WinService هم استفاده کرد ولی یخورده سرعتش توی شبکه Local کمه و بیشتر به درد اینترنت و ارتباط وبی میخوره ولی اینجا دیگه از Datatable خبری نیست و اطلاعات بصورت آرایه و Xml رد و بدل میشه

نحوه پیاده سازیش فعلا میتونید یه search درباره RemotableObject توی Google انجام بدید و از روی مثالهایی که داره بتونید راه اندازی کنید
من این کار رو انجام دادم ولی متاسفانه فرصت آموزشش رو ندارم

hadis shaeidi
شنبه 08 بهمن 1390, 14:42 عصر
برای پیاده سازی چیزی که دوستمون میگن شما بایددرکل بیاین بانکتون رودرپوشه binوسپسdebugسمت برنامه سرورقرابدید.
سپس درسمت کلاینت بایدبتونیدبامتدهای ارسال ودریافت سوکت پروگرمینگ(برنامه نویسی سوکت)به بانک دسترسی داشته باشید.
حالابرانوشتنconectionstring سمت کلاینت میتونیدبه این طریق عمل کنیدبه طورمثال اگه اسم بانکتون university باشه:
string connectionString = null;
connectionString = "server=" + this.serverName + ";Initial Catalog=UNIVERSITY_DATA.MDF;Integrated Security=True";

meisam3322
شنبه 08 بهمن 1390, 16:07 عصر
برای پیاده سازی چیزی که دوستمون میگن شما بایددرکل بیاین بانکتون رودرپوشه binوسپسdebugسمت برنامه سرورقرابدید.
سپس درسمت کلاینت بایدبتونیدبامتدهای ارسال ودریافت سوکت پروگرمینگ(برنامه نویسی سوکت)به بانک دسترسی داشته باشید.
حالابرانوشتنconectionstring سمت کلاینت میتونیدبه این طریق عمل کنیدبه طورمثال اگه اسم بانکتون university باشه:
string connectionString = null;
connectionString = "server=" + this.serverName + ";Initial Catalog=UNIVERSITY_DATA.MDF;Integrated Security=True";


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

عاقلانه هست که وقتی داری از sql server استفاده میکنی. همینطور که از نامش پیداست ، میتونه بانک رو بوسیله IP و یا نام سرور متصل کنه . همانطور که دوستمون فرمودند. حالا بجای استفاده از نام سرور میتونی به جای نوشتن server بیای از IP استفاده کنی که میشه :

Data Source=192.168.1.3

zarrinnegar
شنبه 08 بهمن 1390, 23:40 عصر
توی این روشها دسترسی کاربران به sql انجام میشه و هر کسی توی شبکه میتونه به sql وصل بشه و اطلاعات رو بیرون بکشه
ولی روشی رو که من گفتم به این صورت نیست
راه اندازیش هم اونقدر سخت نیست

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

zrasekhi
یک شنبه 09 بهمن 1390, 17:53 عصر
zarrinnegar (http://barnamenevis.org/member.php?31940-zarrinnegar) عزیز ممون از راهنماییهات . من هم خودم تو برنامم از سه لایه نویسی استفاده کردم.ولی منظور شما را در موردRemotableObject نمی فهمم . توی گوگل هم سرچ کردم برنامشو هم دیدم ولی چیزی ازش سر در نیاوردم.
میشه بیشتر توضیح بدین ؟RemotableObject اصلا چی هست و به چه دردی می خوره؟

zarrinnegar
دوشنبه 10 بهمن 1390, 00:14 صبح
RemotableObject یعنی اینکه من یک تعداد تابع درست کردم برای Insert,Update,Delete,select و گذاشتم در اختیار یک Listener
حالا اون منتظره فزمان client ها است
یک client بهش وصل میشه با یک آدرس IP و یک پورت مثلا 8090 و میتونه یک رمز هم داشته باشه که هر کسی وصل نشه

توی کلاینت هم لیست توابع رو داریم
بعد از اینکه وصل شد بهش میگه من از تابع های موجود ، select_Person رو میخوام با این مقدار Code=120
حالا اون سرور که منتظر فرمان من بود تابع رو با پارامترش میگیره و به من یک DataTable برمیگردونه
و من از اون DataTable استفاده میکنم و فیلدهاشو به TextBox ها وصل میکنم

تا اینجا که من هیچ ارتباطی با sql نداشتم و نمیخوام هم داشته باشم
من اون سرور رو میشناسم و درخواستم رو میگم

تابع Insert_Person رو صدا میزنم و میگم با این مقدارها ایجاد کن
اون هم تابع رو با پارامتر ها میگیره و Insert میکنه بعد به من میگه مثلا True یعنی با موفقیت درج شد
پس ایجا باز هم نه کانکشنی دارم نه دسترسی به بانک

فقط ایطوری مینویسم

bool t;
t=Myremote.Insert_Person(txt_Code.text,txt_name.te xt,txt_ID.text,...);
if (t == false)
messagebox.show("اطلاعات درج نشد.");
else
messagebox.show("اطلاعات با موفقیت درج شد.");



حالا سمت اون سرور چه اتفاقی می افته
همون اتفاقاتی که توی لایه B.L قراره بافته یعنی یک کانکشن و command و execute و open و close و ... و هر چی که مربوط به sql هست


تفاوتش با برنامه 3 لایه ای که الان شما دارید مینویسید اینه که dll مربوط به B.L رو به برنامه اضافه میکنید و توی client اون تابع هارو صدا میزنید و چون داخل کلاینت صدا زده میشه نیاز به کانکشن استرینگ داره ، پس client باید به sql دسترسی داشته باشه

ولی توی روش بالا ، Client نیاز به دسترسی نداره

شکلش اینطوری میشه

81687

zrasekhi
چهارشنبه 12 بهمن 1390, 22:58 عصر
سلام zarrinnegar عزیز.ممنون از راهنماییتون ولی من باز هم متوجه منظور شما نشدم.من تو برنامه ام این طوری عمل کردم: توی لایه دال رشته کانکشن استرینگ را می سازم و توابع Excute را خروجی های مختلف پیاده سازی میکنم. توی لایه BLL توابع مربوط به Insert,update,delete,select را پیاده سازی می کنیم . و توی لایه U I فقط توابع لایه BLL را صدا می زنیم.ولی با روش شما نمی دونم باید چگونه عمل کنم اگه براتون امکان داره توی یک برنامه کوچیک روشتون را توضیح بدین. تا حالا هیچ کس به غیر شما نتونسته بود یه جواب درستی را بهم بده و ممنون میشوم که برام جوابتون را میل کنید:
ZRASEKHI89@gmail.com

zarrinnegar
چهارشنبه 12 بهمن 1390, 23:16 عصر
خیلی خلاصه میگم امیدوارم با توجه به کمبود وقتی که دارم بتونم منظور رو برسونم (آخه هنوز تاپیک آموزش جانوس رو هم به همین دلیل نتونستم بروز کنم و شرمنده دوستانم هستم)

1 - یک پروژه WinApp درست کن به نام مثلا P_Server
داخل Form1 این کد ها رو بزار

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;


namespace P_Server
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

// using TCP protocol
TcpChannel channel = new TcpChannel(8099);
ChannelServices.RegisterChannel(channel);

RemotingConfiguration.RegisterWellKnownServiceType (typeof(BL_DLL.COUNTRY), "blsCOUNTRY", WellKnownObjectMode.Singleton);
}
}
}


اینجا یک TCp Channel با یک شماره پورت ایجاد میکنیم مثلا 8099
بعد این Channel را رجیستر میکنیم

بعد از لایه B.L که بعد میسازیم یک کلاس از آن را انتخاب کرده و بصورت Remoting Object آن را رجیستر میکنیم
این قسمت برای تک تک کلاسهای موجود در لایه B.L باید در این قسمت نوشته شود.

zarrinnegar
چهارشنبه 12 بهمن 1390, 23:25 عصر
2 - ایجاد لایه B.L
در این قسمت یا در داخل همان P_Server و یا بصورت جداگانه یک پروژه بصورت کنترل کتابخانه ایجاد کنید با نام BL_DLL ( که در بالا گفته شد)
داخل آن یک کلاس مثلا برای Country ایجاد کنید و دستورات زیر را بنویسید

using System;
using System.Data;
using System.Windows.Forms;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Linq;
using System.Data.SqlClient;
using System.Data.Linq;
using System.Collections.Generic;

namespace BL_DLL
{
public class COUNTRY : MarshalByRefObject
{

#region insert COUNTRY
public bool Insert(string name, string Acode1)
{
//دستورات Insert
Return True;
}
#endregion


#region Update COUNTRY
public bool Update(string Country_No, string Country_Name)
{
//دستورات Update
return true;
}
#endregion


#region Delete COUNTRY
public bool Delete(string Country_No)
{
//دستورات حذف
Return True;
}
#endregion


#region Select COUNTRY
public DataTable select(string COUNTRY_NO)
{
Datatable DT = New Datatable();
//دستورات select
return DT
}
#endregion

}
}
در این جا چیزی که مهم است این است که کلاس باید از MarshalByRefObject ارث بری نماید تا P_Server بتواند آن را شناخته و با آن کار کند

تمامی کلاسهای مورد نظر را به این صورت ایجاد کنید

zarrinnegar
چهارشنبه 12 بهمن 1390, 23:48 عصر
3 - ساخت فرم اصلی برنامه
در این قسمت شما برنامه اصلی را ایجاد کنید و در form1 یا فرم اصلی این کدها را وارد کنید

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels.Tcp;

namespace MyProject
{
public partial class Form1 : Form
{

public Form1()
{
InitializeComponent();
CreateVisualStyleColors();
TcpChannel chanel=new TcpChannel ();
// ChannelServices.RegisterChannel(chanel);

}
}
}



در این جا دوباره یک Channel ایجاد شده و رجیستر میشود

حالا هر کجا که بخواهید از لایه B.L استفاده کنید ابتدا با پورت به آن متصل شده و یک آبجکت از آن شیئ ریموت درست میکنیم و بعد از آن به پروسیجر های داخل آن دسترسی پیدا میکنیم

public BL_DLL.COUNTRY RmtCountry = (BL_DLL.COUNTRY)Activator.GetObject(typeof(BL_DLL. COUNTRY), "TCP://127.0.0.1:8099/blsCountry");
و بعد از آن
DataTable DT = New Datatable();
Dt=RmtCountry.select(Country_No);
و بعد این دیتاتیبل رو به هر چی خواستی وصل کن

برای Insert
RmtCountry.Insert(txt_Country_Name.Text,"1");

برای Update
RmtCountry.Update(1, txt_Country_Name.Text);



اینجا یک نکته وجود داره و اون هم اینه که توی دستورات بالا یک IP آدرس میبینی که مربوط به دستگاهی میشه که برنامه P_Server روش اجرا میشه و در واقع Listiner ما محسوب میشه

حالا برای تست گرفتن باید اول برنامه P_Server رو اجرا کنی که یک فرم خالیه بعد برنامه اصلی رو اجرا کنی

zarrinnegar
چهارشنبه 12 بهمن 1390, 23:54 عصر
میبینی که ما در Client هیچ دسترسی به بانک اطلاعات sql نداریم و نیازی هم نداریم
ما به P_Server وصل میشیم بعد میگیم تابع Insert رو با این پارامتر اجرا کن ، اون هم اجرا میکنه و میگه True و یا False
میگیم select کن اون هم نتیجه رو برمیگردونه

شما میتونید حتی برای select و یا هر پروسیجر دیگه چندین Overload بنویسید که مثلا وقتی select رو انتخاب میکنید بگه 4 نوع وجود دارن و اولی یعنی همه رکرود ها دومی یعنی کد بدی و یک رکورد برگردونه و سومی نام بدی و هر چی شبیه بود برگردونه و ...
توی کلاینت هم کد نویسی راحت میشه

ardeshir1365
سه شنبه 25 بهمن 1390, 13:37 عصر
3 - ساخت فرم اصلی برنامه
در این قسمت شما برنامه اصلی را ایجاد کنید و در form1 یا فرم اصلی این کدها را وارد کنید

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels.Tcp;

namespace MyProject
{
public partial class Form1 : Form
{

public Form1()
{
InitializeComponent();
CreateVisualStyleColors();
TcpChannel chanel=new TcpChannel ();
// ChannelServices.RegisterChannel(chanel);

}
}
}



اقای zarrinnegar (http://barnamenevis.org/member.php?31940-zarrinnegar) من از vs2010 استفاده میکنم ولی ویژوال من نمیتونه فضای نام زیر رو بشناسه ، در اصل فقط از قسمت tcp داره خطا میگیره ولی فضای نام های قبلیش رو میشناسه

using System.Runtime.Remoting.Channels.Tcp;

zarrinnegar
سه شنبه 25 بهمن 1390, 14:10 عصر
به REFERENCE برنامه اضافه کن
BROWS کن و از .nET انتخاب کن و اضافه کن درست میشه

ardeshir1365
سه شنبه 25 بهمن 1390, 14:47 عصر
به REFERENCE برنامه اضافه کن
BROWS کن و از .nET انتخاب کن و اضافه کن درست میشه

در قسمتی که گفتین چنین چیزی
using System.Runtime.Remoting.Channels.Tcp; وجود نداشت
یه راه حل دیگه؟؟؟؟؟؟؟؟؟؟؟

mahmoodof
سه شنبه 25 بهمن 1390, 15:41 عصر
سلام و خسته نباشيد دوستان گرامي
من براي طراحي يك سايت ساده از بانك اطلاعاتي sqlexpress كه با خود visualstudio نصب ميشه ، استفاده كردم.
رشته اتصال رو به صورت زير تعريف كردم.
con.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirecto ry|Database.mdf;Integrated Security=True;User Instance=True";
توي كامپيوتر خودم هيچ مشكلي نداره !!!!! به درستي كار ميكنه ولي زماني كه ميبرم توي يه كامپيوتر ديگه.
پيغام خطاي بانك اطلاعاتي ميده . بايد چيكار كنم تا مشكل رفع بشه ؟!!!
ممنونم.ياعلي ...

zarrinnegar
سه شنبه 25 بهمن 1390, 19:47 عصر
در قسمتی که گفتین چنین چیزی
using System.Runtime.Remoting.Channels.Tcp; وجود نداشت
یه راه حل دیگه؟؟؟؟؟؟؟؟؟؟؟

دنبال چی گشتی که نبود؟
Add Reference کن توی .Net دنبال System.Runtime.Remoting بگرد و اضافه کن

zarrinnegar
سه شنبه 25 بهمن 1390, 19:52 عصر
سلام و خسته نباشيد دوستان گرامي
من براي طراحي يك سايت ساده از بانك اطلاعاتي sqlexpress كه با خود visualstudio نصب ميشه ، استفاده كردم.
رشته اتصال رو به صورت زير تعريف كردم.
con.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirecto ry|Database.mdf;Integrated Security=True;User Instance=True";
توي كامپيوتر خودم هيچ مشكلي نداره !!!!! به درستي كار ميكنه ولي زماني كه ميبرم توي يه كامپيوتر ديگه.
پيغام خطاي بانك اطلاعاتي ميده . بايد چيكار كنم تا مشكل رفع بشه ؟!!!
ممنونم.ياعلي ...
ظاهرا درسته
یا sqlExpress نداره و یا instance داره یعنی با یک نام sql رو نضب کردی
اگر همه چی درست بود باید تصویر خطار رو و خطی که خطا میگیره بزاری

mahmoodof
چهارشنبه 26 بهمن 1390, 22:40 عصر
سلام دوست گرامی
مشکل از نصب نرم افزار نیست.تو جاهای مختلف چک کردم ولی مشکلی نداره ! حتی یه بار روی یه کام‍یوتر خودم نرم افرارشو به صورت کامل نصب کردم ولی نشد که نشد. موقعی که اجرا میکنم خطای زیر رو میده !

82743

82744
ممنونم . یا علی...

zarrinnegar
پنج شنبه 27 بهمن 1390, 19:51 عصر
دوست عزیز
از متن پیغام مشخص است که در sql server گزینه Allow Remote Connection تیک نخورده و برای کانکشن های ریموتی ست نشده است
تنظیمات sql رو بررسی کنید

linux
پنج شنبه 27 بهمن 1390, 21:59 عصر
سلام دوستان .
نرم افزار من در چندین سیستم نصب شده است و بانک در روی یک سیستم دیگر قرار دارد . من می خواهم سیستم های دیگر براحتی به بانک روی سیستم سرور وصل شوند. شنیدم اگه از طریق سوکت وصل شوند خیلی امن تر است و امکان هک کردن بانک وجود ندارد . کسی هست که بتونه به من کمک کنه؟
کلا وب سرویس راه حل بهتری هست

mahmoodof
جمعه 28 بهمن 1390, 13:04 عصر
دوست عزیز
از متن پیغام مشخص است که در sql server گزینه Allow Remote Connection تیک نخورده و برای کانکشن های ریموتی ست نشده است
تنظیمات sql رو بررسی کنید

دوست گرامي ، من از sqlexpress استفاده كردم.در رابطه با اين تنظيمات ميتونيد ، بيشتر توضيح بدين ؟؟
ممنونم.يا علي...

zarrinnegar
جمعه 28 بهمن 1390, 14:17 عصر
این لینک رو ببین
(http://support.microsoft.com/kb/914277)

mahmoodof
دوشنبه 01 اسفند 1390, 05:53 صبح
سلام دوست گرامي ، اين لينك متاسفانه به من كمكي نكرد‌!!!!!
بعضي ها ميگن كه ديتابيس بايد Attach بشه !!!
ميشه در اين مورد توپيح بدين ؟!! ديتابيس من با sqlexpress ساخته شده.
يا علي...

mahmoodof
چهارشنبه 03 اسفند 1390, 14:57 عصر
كسي نيست جواب بده ؟!!!!!!!!!!!! شما رو به خدا يكي جواب بده ، لازم دارم اخه ...
سوالم اين بود :
من براي طراحي يه سايت ساده از بانك اطلاعاتي sqlexpress استفاده كردم.
رشته اتصال رو به صورت زير تعريف كردم:


con.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirecto ry|Database.mdf;Integrated Security=True;User Instance=True";

زماني كه سايت طراحي شده رو توي يه كامپيوتر ديگه ميبرم.اجرا نميشه و خطا ميده !!! بعضي ها ميگن بايد Attach بشه ، كه من اينكارو بلد نيستم . ميشه توضيح بدين.