PDA

View Full Version : سوال در مورد برنامه تحت شبکه



m_h_2007
سه شنبه 11 تیر 1387, 23:31 عصر
سلام می خوام یه برنامه تحت شبکه بنویسم می خواستم ببینم برنامه ای که روی کلاینت ها نصب میشه در connectionString باید به ip سرور وصل بشه آیا این درسته ؟چطوری سرور رو شناسایی می کنه و از SQL Server که روی سرور نصبه استفاده می کنه ؟منظورم اینه که فقط یه SQL Server روی سرور نصبه و تمام کلاینت ها از DB روی اون استفاده کنن به چه صورته ؟

bachebahal_1363
جمعه 14 تیر 1387, 09:10 صبح
می تونی تو برنامت از یه کانکشن استفاده کنی که نام سرورش متغییر باشه :

"Data Source=" + strconnection + ";Initial Catalog=Samandb;Integrated Security=SSPI";

که strconnection رو برابر نام سروری که از طریق جستجوی دیتابیس بدست آوردی یا IP سرور مورد نظر قرار بده و بعد connectionstring رو در setting برنامه خودت ذخیره کنی و هر موقع نیاز به connectionstring داشتی از اون استفاده کنی .

برای بدست آوردن سرور هم از دستور زیر به صورت Asyncroniz استفاده کن :
ابتدا یک کلاس به برنامه خودت اضافه کن به صورت زیر

class FindServer
{
public static string[] findServer(DataTable servers)
{
servers = SqlDataSourceEnumerator.Instance.GetDataSources();
ArrayList ar = new ArrayList();

for (int i = 0; i < servers.Rows.Count; i++)
{
//ar.Add(servers.Rows[i]["ServerName"].ToString() + "\\" + servers.Rows[i]["InstanceName"].ToString());
ar.Add(servers.Rows[i]["ServerName"].ToString());
//System.Threading.Thread.Sleep(500);

}
return (string[])ar.ToArray(typeof(string));

}
}

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


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 FindSqlServer.Classes;

namespace FindSqlServer
{
public delegate string[] DoSthCallBack(DataTable dt);
public delegate void ShowResultCallBack(string[] result);
public partial class Frm_NetServer : Form
{
public Frm_NetServer()
{
InitializeComponent();
}
private void GetAsyncResult(IAsyncResult res)
{
DoSthCallBack dc = (DoSthCallBack)res.AsyncState;
string[] result = dc.EndInvoke(res);
ShowResultCallBack shw = new ShowResultCallBack(ShowResult);
this.Invoke(shw, new object[] { result });

}
private void ShowResult(string[] result)
{
Lst_Servername.Items.Clear();
Lst_Servername.Enabled = true;
foreach (string n in result)
Lst_Servername.Items.Add(n);
Lst_Servername.Items.Add(Environment.MachineName.T oString());
}
string strNetServer;
private void Btn_ServerName_Click(object sender, EventArgs e)
{
strNetServer = Lst_Servername.SelectedItem.ToString();
this.Close();

}
public string ServerName
{
get
{
return strNetServer;
}
}

private void Frm_NetServer_Load(object sender, EventArgs e)
{
Lst_Servername.Enabled = false;
Lst_Servername.Items.Add("جستجوی دیتابیس ...");

DoSthCallBack dc = new DoSthCallBack(FindServer.findServer);
AsyncCallback ac = new AsyncCallback(GetAsyncResult);
DataTable servers = new DataTable();
dc.BeginInvoke(servers, ac, dc);
}

private void Lst_Servername_SelectedIndexChanged(object sender, EventArgs e)
{
Btn_ServerName.Enabled = true;
}

}
}


نمونه ای از برنامه رو برات ضمیمه کردم .
اگر در نوشتن اطلاعات در setting برنمه هم مشکلی داشتی بگو برات بیشتر توضیح بدم .
نکته : در نوشتن این برنامه از آموزش های مفید آقای طباطبایی بهره های فراوانی برده شده.