SMO və C# – SQL Server tapma və bağlanma
Salam dostlar. Yeni məqaləyə xoş gəlmişsizniz. Bundan öncə SMO nədir sualına cavab yazmışdıq. Ama yenədə qısa şəkildə xatırlatma edərək Visual Studio proqramı üzərində C# proqramlaşdırma dilindən və SMO-nun imkanlarından istifadə edərək Local kompyuterimizdə mövcud olan SQL Serverimizi tapıb ona bağlanacayıq.
Smo nədir ?
Smo (Sql menegment object) SQL serverə bağlanaqraq üzərində bir çox əməliyyatları yerinə yetirə bilməmiz üçün vasitədir.
Nə üçün C#? C# məcburidirmi?
Xeyir c sharp məcburi deyildir, siz bildiyiniz .Net proqramlaşdırma dilinin hər hansı biriylə eyni işləri görə bilər və nəticə əldə edə bilərsinz. Burada proqramlaşdırma dili proqramımıza dizayn vermə, şəkilləndirmə və s üçün gərəkir. İşin kökündə SMO durur.
SMO-nu hardan və necə əladə edəbilərik?
C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies – adresindən əldə edə bilərsiniz. Bu qovluğu açdığınızda bir çox DLL-lərlə qarşılaşacaqsınız ama bizə gərəkli olanlar aşağıdakılardır
-
Microsoft.SqlServer.Smo
Microsoft.SqlServer.SmoExtended
Microsoft.SqlServer.SqlEnum
Microsoft.SqlServer.Management.Sdk.Sfc
Microsoft.SqlServer.ConnectionInfo
Aşağıdakı sorğu ilə əməliyyat sistemimizdə qurulu olan SQL Server(lər)i çağıra bilərik.
DataTable dt = SmoApplication.EnumAvailableSqlServers(false);
ServerConnection ServerBaglantisi = new ServerConnection(Server instance, string username, string password); — ServerConnection metonu Server yuxarıdakı prinsiplə işləyir
Aşağıdakı sorğu parçasıyla biz Servermizə Server Authentication yolu ilə bağlana bilərik
void SQL_Baglan(string ServerAdi) { ServerConnection ServerBaglantisi_1 = new ServerConnection(ServerAdi, IstifadeciAdi, Sifre); ServerBaglantisi_1.LoginSecure = false; ServerBaglantisi_1.MultipleActiveResultSets = true; srv = new Server(ServerBaglantisi_1); srv.ConnectionContext.Connect(); }
Aşağıdakı sorğu parçasıyla biz Servermizə Windows Authentication yolu ilə bağlana bilərik
void SQL_Baglan(string ServerAdi) { ServerConnection ServerBaglantisi = new ServerConnection(ServerAdi); ServerBaglantisi.LoginSecure = true; ServerBaglantisi.MultipleActiveResultSets = true; srv = new Server(ServerBaglantisi); srv.ConnectionContext.Connect(); }
Visual Studio proqramımızı açaraq bu dll-ləri referansımıza əlavə edək və Bismillah deyərək ilk SMO proqramımızı yazmağa başlayaq.
Proqramımızın ekran görüntüləri:
Şəkil 1
Şəkil 2
Şəkil 3
Yuxarıda verdiyim şəkillərdən ilk proqramımızda nələr olacaq anlamışsınız yəqin ki. Yenədə mən yazılı olaraq bildirim.
Şəkil 1 –ə diqqət edin:
- 6 ədəd Label
1 ədəd ComboBox
2 ədəd TextBox
3 ədəd Button
2 ədəd RadioButton
1 ChekBox
Şəkil 2 –yə diqqət edin:
- 2 ədəd Windows Form
1 ədəd class
Şəkil 3 -ə diqqət edin:
- 1 ədəd label
Bu qədər tanışlıqdan sonra kod tərəfinə keçək və kodlrımızı ələ almağa başlayaq:
- Məqalənin sonunda mövzuya tam hakim ola bilməniz üçün C#-la verilmiş bəzi metodlar və operatorlar haqqında daha geniş məlumatlara (məqalələr) keçid linkləri verilib.
İlk olaraq SMO_Giris adlı class açaraq sorğularımızı yazaq:
using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; using System.Windows.Forms; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SMO_Nedir { public class SQL_Giris { Server srv; #region --- Sql servere bağlantı sorğumuzu yazaq public void SQL_Baglan(string ServerAdi, string IstifadeciAdi, string Sifre, bool GirisTipi) { SMO smo = new SMO(); smo.Srv = srv; <strong> </strong> srv = null; try { if (GirisTipi == true) { ServerConnection ServerBaglantisi_1 = new ServerConnection(ServerAdi, IstifadeciAdi, Sifre); ServerBaglantisi_1.LoginSecure = false; ServerBaglantisi_1.MultipleActiveResultSets = true; srv = new Server(ServerBaglantisi_1); srv.ConnectionContext.Connect(); } else { ServerConnection ServerBaglantisi = new ServerConnection(ServerAdi); ServerBaglantisi.LoginSecure = true; ServerBaglantisi.MultipleActiveResultSets = true; srv = new Server(ServerBaglantisi); srv.ConnectionContext.Connect(); } smo.Srv = null; smo.Close(); Smo_Managment mng = new Smo_Managment(); mng.Srv = srv; mng.label1.Text = "SQL Serverlə bağlantı quruldu"; mng.ShowDialog(); } catch (SmoException ex) { MessageBox.Show("Xəta: " + ex.Message); } catch (Exception ex) { MessageBox.Show("Xəta: " + ex.Message); } } #endregion #region --- Əməliyyat sistemindəki SQL Serverlərin siyahısını listə topla public List<string> Serverler = new List<string>(); public void ServerleriGetir() { SMO smo = new SMO(); smo.Srv = srv; DataTable dt = SmoApplication.EnumAvailableSqlServers(false); if (dt.Rows.Count > 0) { foreach (DataRow dr in dt.Rows) { Serverler.Add(dr["Name"].ToString()); } } } #endregion } }
Daha sonra SMO formumuzu açaq və sorğularımızı yazmağa davam edək:
using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace SMO_Nedir { public partial class SMO : Form { private Server srv; public Server Srv { get { return srv; } set { srv = value; } } SQL_Giris Giris = new SQL_Giris(); /*SMO_Giris adlı class-ımızı formumuza tanıtdırırq*/ public SMO() { InitializeComponent(); } bool GirisTipi; /* Geri qayıdacaq nəticəni yuxarıda yazmış olduğumuz SMO_Giris adlı class-ımıza göndərmək üçün Giristipi adlı bir bolean yazırıq (Bool tiplər geriyə true və ya false dəyər göndərir) */
SMO formumuzun OnLoad hadisəsinə aşağıdakı sorğunu yazaq:
private void SMO_Load(object sender, EventArgs e) { #region --- Form açılarkən giriş tipi aşağıdakı kimi gəlsin. İstifadəçi istədiyi təqdirdə manual(əllə) dəyişər. GirisTipi = false; txt_IstifadeciAdi.Enabled = false; txt_Sifre.Enabled = false; #endregion Giris.ServerleriGetir(); /*Bu sorğuyla üstdə yazmış olduğumuz class içərisindəki ServerləriGetir Public void-imizi çağırırıq*/ ServerAdi.Items.AddRange(Giris.Serverler.ToArray<string>()); /*Daha sonra yenə SQL_Giris class-ımız da hazırlamış olduğumuz List-silsiləsinin tərkibi ServaerAdi adlı comboBox-umuza doldururuq*/ }
Daha sonra BtnBağlan Buttonumuzun üzərində iki dəfə klikləyərək OnClick hadisəsini açaq və bu sorğunu yazaq:
private void btnBaglan_Click(object sender, EventArgs e) { Giris.SQL_Baglan(ServerAdi.SelectedItem.ToString(), txt_IstifadeciAdi.Text, txt_Sifre.Text, GirisTipi); }
Bundan sonra rdbServerAuthentication RadioButtonumuzun üzərində iki dəfə klikləyərək OnCheckedChanced hadisəsinə aşağıdakı kodları yazaq:
private void rdbServerAuthentication_CheckedChanged(object sender, EventArgs e) { #region --- Giriş tipi kontrolu (Əgər ServerAuthentication.Checked == true -dursa (yəni rdbServerAuthentication semilmişsə)istifadəçi adı və şifrə TextBox-larımız aktiv olsun əks halda bu TexBox-lar passiv olsun) if (rdbServerAuthentication.Checked == true) { GirisTipi = true; txt_IstifadeciAdi.Enabled = true; txt_Sifre.Enabled = true; } else { GirisTipi = false; txt_IstifadeciAdi.Enabled = false; txt_Sifre.Enabled = false; } #endregion }
Bundan sonra rdbWindowsAuthentication RadioButtonumuzun üzərində iki dəfə klikləyərək OnCheckedChanced hadisəsinə aşağıdakı kodları yazaq:
private void rdbWindowsAuthentication_CheckedChanged(object sender, EventArgs e) { #region --- Giriş tipi kontrolu (Əgər ServerAuthentication.Checked == true -dursa (yəni rdbServerAuthentication semilmişsə)istifadəçi adı və şifrə TextBox-larımız aktiv olsun əks halda bu TexBox-lar passiv olsun) if (rdbServerAuthentication.Checked == true) { GirisTipi = true; txt_IstifadeciAdi.Enabled = true; txt_Sifre.Enabled = true; } else { GirisTipi = false; txt_IstifadeciAdi.Enabled = false; txt_Sifre.Enabled = false; } #endregion } } }
Daha sonra SQL_managment adlı formumuzu açaraq 1 ədə label yerləşdirək və sorğumuzu yazaq:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; namespace SMO_Nedir { public partial class Smo_Managment : Form { private Server srv; public Server Srv { get { return srv; } set { srv = value; } } public Smo_Managment() { InitializeComponent(); } private void Smo_Managment_Load(object sender, EventArgs e) { } private void Smo_Managment_FormClosing(object sender, FormClosingEventArgs e) { Application.Exit(); /*Bu form bağlandıqda proqrama aid bütün servisləri bağla*/ } } }
Bütün bunları etdikdən sonra artıq test etmək olar:
Əgər sizdə sorğuları doğru bir şəkildə yazdınızsa bu pəncərə sizə ilk SMO proqramınızı müvəffəqiyətlə yazdığınızı bildirəcəkdir.
SMO məqalə silsiləmizin növbəti hissəsində inşallah SQL Serverimizin xüsusiyyətlərini və Verilənlər Bazası(Database), sənəd qrupları(File Group) və sənədlərin siyahısını əldə edərək Visual Studio-da hazırlaığımız dizayna uyğun yerlərdə göstərəcəyik.
Yararlı olması ümüdü ilə…