WPF ile SQL Server Veri Tabanı Bağlantısı

Konuyu Okuyanlar (0 kayıtlı üye )

sdkbyrm

olwα.ɴeт
Üyelik Tarihi
23 Aralık 2020
Mesajlar
813
Beğeniler
1
Puanı
3
Ticaret: 0 / 0 / 0
Bu yazımızda C# WPF Form kullanarak Sql Server veritabanı bağlantısı kuracağız. Bu bağlantı örneğinde Temel Veritabanı İşlemleri (Select,Insert,Update,Delete) haricinde ayrıca Class kullanımı, DataBinding kullanımı, DataContext kullanımı,ObservableCollection kullanımı, Veri Filtreleme gibi konular hakkında da bilgi bulabilirsiniz. Projeyi kısaca açıklamak gerekirse;

Projemizde ticaret isimli Sql veritabanında bulunan musteri isimli tabloya bağlantı kuracağız. Form açıldığında musterilere ait ad ve soyad bilgisi sol tarafa yerleştirmiş olduğumuz listbox kontrolünde gelecek. Bu işlemi ItemTemplate ve DataTemplate kullanarak gerçekleştireceğiz.
Daha sonra listbox’ta tıklanan müşteriye göre detay bilgilerinin sağ tarafta bulunan textbox nesneleri ve Datetimepicker nesnesinde görüntülenmesini DataContext kullanarak gerçekleştireceğiz.


Buttonlarımız Ekleme, Silme ve Güncelleme işlemlerini gerçekleştirecek.Bu işlemlerde Sorgularımızı Parametre kullanarak oluşturacağız. Ayrıca Veri Çekme işlemi için Veritabanımıza uygun bir şekilde tasarladığımız Class yapısını kullanacağız.

Listbox kontrolünün üstünde yer alan textbox kontrolünü ise Veri filtrelemede kullanacağız. Veri filtreleme işlemini farklı bir yöntemle gerçekleştireceğiz. ObservableCollection koleksiyonunu List koleksiyonuna Linq komutlarını kullanarak filtreleyeceğiz ve listbox kontrolüne ItemSource özelliğini kullanarak bağlayacağız.

Projemize ait ticaret veritabanındaki musteri tablomuz:
vt1

Yeni bir WPF Form Application projesi oluşturarak projemize başlayalım.

İlk olarak Solution Explorer penceresinde Projemizin üstüne sağ tıklayarak Model isminde yeni bir klasör oluşturuyoruz. Daha sonra bu klasör üstünde yine sağ tıklayarak Add-Class diyoruz. Örneğimizde Class’ ımızın ismi Musteri.cs olarak verildi.

daire_class_1

Musteri isimli Sınıfımızı veritabanımızdaki alanlara uygun bir şekilde aşağıdaki gibi oluşturalım.

Musteri.cs:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

public class Musteri
{
public Musteri()//Kurucu Metot oluşturduk.
{
Tarih = DateTime.Now; //Yeni musteri oluşturulduğunda
} //Tarihin bugünün tarihi olarak gelmesini sağlıyoruz.
int _no;

public int No
{
get { return _no; }
set { _no = value; }
}
string _ad;

public string Ad
{
get { return _ad; }
set { _ad = value; }
}
string _soyad;

public string Soyad
{
get { return _soyad; }
set { _soyad = value; }
}
DateTime _tarih;

public DateTime Tarih
{
get { return _tarih; }
set { _tarih = value; }
}
string _telefon;

public string Telefon
{
get { return _telefon; }
set
{
if (value !="")
_telefon = value;
else
_telefon = "Telefon Numarası Yok";
}
}
Daha sonra form tasarımına geçiyoruz.

wpf_veri_tasarım


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

<Window x:Class="WpfClassVeri.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="www.yazilimkodlama.com" Height="500" Width="700" Loaded="Window_Loaded">
<Grid Name="grd1">
<Grid.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="White" Offset="0"/>
<GradientStop Color="#FF3A2828" Offset="1"/>
</LinearGradientBrush>
</Grid.Background>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="217"/>
<ColumnDefinition Width="475*"/>
</Grid.ColumnDefinitions>
<StackPanel VerticalAlignment="Top" Grid.Column="0">

<TextBox x:Name="txtAra" HorizontalAlignment="Left" Height="23"
TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="202" TextChanged="TextBox_TextChanged" Margin="5,5,0,0"/>

<ListBox x:Name="lstMusteri" SelectionChanged="lstMusteri_SelectionChanged" Height="442" Margin="5,5,10,0" >
<ListBox.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="White" Offset="0"/>
<GradientStop Color="#FF4E989B" Offset="1"/>
</LinearGradientBrush>
</ListBox.Background>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Ad}"/>
<TextBlock Text="{Binding Soyad}" Margin="10,0,0,0"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>

</ListBox>

</StackPanel>

<TextBlock Grid.Column="1" HorizontalAlignment="Left" Margin="143,73,0,0" TextWrapping="Wrap" Text="No" VerticalAlignment="Top"/>
<TextBlock Grid.Column="1" HorizontalAlignment="Left" Margin="141,101,0,0" TextWrapping="Wrap" Text="Adı" VerticalAlignment="Top" RenderTransformOrigin="5.066,-6.5"/>
<TextBlock Grid.Column="1" HorizontalAlignment="Left" Margin="123,129,0,0" TextWrapping="Wrap" Text="Soyadı" VerticalAlignment="Top"/>
<TextBlock Grid.Column="1" HorizontalAlignment="Left" Margin="88,186,0,0" TextWrapping="Wrap" Text="Doğum Tarihi" VerticalAlignment="Top"/>
<TextBlock Grid.Column="1" HorizontalAlignment="Left" Margin="120,157,0,0" TextWrapping="Wrap" Text="Telefon" VerticalAlignment="Top"/>
<TextBox Name="txtNo" Grid.Column="1" HorizontalAlignment="Left" Height="23" Margin="181,66,0,0" IsEnabled="False"
TextWrapping="Wrap" Text="{Binding No}" VerticalAlignment="Top" Width="186"/>
<TextBox Name="txtAd" Grid.Column="1" HorizontalAlignment="Left" Height="23" Margin="181,94,0,0"
TextWrapping="Wrap" Text="{Binding Ad}" VerticalAlignment="Top" Width="186"/>
<TextBox Name="txtSoyad" Grid.Column="1" HorizontalAlignment="Left" Height="23" Margin="181,122,0,0"
TextWrapping="Wrap" Text="{Binding Soyad}" VerticalAlignment="Top" Width="186"/>
<TextBox Name="txtTelefon" Grid.Column="1" HorizontalAlignment="Left" Height="23" Margin="181,150,0,0"
TextWrapping="Wrap" Text="{Binding Telefon}" VerticalAlignment="Top" Width="186"/>
<DatePicker Name="dp1" Grid.Column="1" HorizontalAlignment="Left" Margin="181,178,0,0"
VerticalAlignment="Top" Width="186" SelectedDate="{Binding Tarih}"/>
<Label Content="www.yazilimkodlama.com" Grid.Column="1" Foreground="Beige" HorizontalContentAlignment="Center"
HorizontalAlignment="Left" Margin="10,388,0,0" VerticalAlignment="Top" Background="#FF930B0B" FontWeight="Bold" FontFamily="Source Sans Pro Black" FontSize="20" Width="279"/>
<Image Grid.Column="1" HorizontalAlignment="Left" Height="151" Margin="315,308,0,0"
VerticalAlignment="Top" Width="150" Source="ahmetcansever.png" Stretch="Fill"/>
<Button Content="EKLE" Grid.Column="1" HorizontalAlignment="Left" Margin="263,227,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
<Button Content="YENİ" Grid.Column="1" HorizontalAlignment="Left" Margin="183,227,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/>
<Button Content="SİL" Grid.Column="1" HorizontalAlignment="Left" Margin="183,252,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_2"/>
<Button Content="GÜNCELLE" Grid.Column="1" HorizontalAlignment="Left" Margin="263,252,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_3"/>

</Grid>
</Window>
XAML kodlarını inceleyelim. Bilindiği gibi kontrolleri Toolbox’tan eklediğimiz zaman XAML kodları otomatik olarak eklenmekte. Fakat bizim burada müdahale etmemiz gereken bir kaç yer var.

Grid’ e bir isim veriyoruz. Örneğimizde Name=”grd1″ şeklinde ayarladık. Burada Grid layout’una isim vermemizin nedeni kod kısmında DataContext işleminde bu ismi kullanmamız gerektiği içindir.

Renklendirme ile ilgili XAML kısımlarını atlayabiliriz. Sizde tasarımıza Properties penceresinden istediğiniz gibi renk verebilirsiniz. XAML kodları otomatik olarak eklenecektir.

Listbox kontrolüne dikkat edelim. Burada ItemTemplate ve DataTemplate kullanımının yapıldığını görmekteyiz. Bu işlemleri yaptıktan sonra bağlantı sonrası listbox’ kontrolünde Ad ve Soyad bilgisinin görüntülenmesi sağlanacaktır.

Sırada TextBox kontrollerimiz var. Burada Text özelliklerini yukarıda gördüğünüz gibi Binding etmeniz gerekiyor. Burada Binding No, Binding Ad vs.. yazımlarının oluşturduğumuz Class alanlarına göre yapıldığını hatırlatalım.

wpf_sinif_tasarım

Şimdi C# tarafına geçelim.Öncelikle eklememiz gereken namespace’leri ekliyoruz. Burada en alttaki namespace sizin oluşturduğunuz proje ismine göre değişiklik gösterecektir. Uygun bir şekilde yazılması gerekir.




1
2
3
4
5
6

using System.Collections.ObjectModel;
using System.Data.SqlClient;
using WpfClassVeri.Model;// Model isimli oluşturduğumuz klasörün
// içindeki Class kullanımı için gerekli (WPFClasVeri projemizin adı)
Daha sonra kullanacağımız bazı nesneleri public olarak tanımlayalım.


1
2
3
4
5
6
7

SqlConnection baglanti;
SqlDataReader dr;
SqlCommand komut;
Musteri m;
ObservableCollection<Musteri> musteriler;
Bağlantı cümlemizi Form açıldığına hazır olacak şekilde kurucu metot içine yazıyoruz.


1
2
3
4
5
6
7

public MainWindow()
{
InitializeComponent();
baglanti = new SqlConnection("Data Source=.; Initial Catalog=ticaret; Integrated Security=true");
}
Daha sonra verilerin çekilmesi işlemini Listele isimli bir metot tanımlayarak gerçekleşiriyoruz. Bu metodu incelediğimizde Class yapısını ve ObservableCollection koleksiyonunu kullandığını görüyoruz.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

public void Listele()
{

musteriler= new ObservableCollection<Musteri>();
komut = new SqlCommand();
komut.Connection = baglanti;
komut.CommandText = "SELECT *FROM musteri";
baglanti.Open();
dr = komut.ExecuteReader();
while(dr.Read())
{
m = new Musteri();
m.No = (int)dr[0];
m.Ad = dr[1].ToString();
m.Soyad = dr[2].ToString();
m.Tarih = (DateTime)dr[3];
m.Telefon = dr[4].ToString();
musteriler.Add(m);
}
baglanti.Close();
lstMusteri.ItemsSource = musteriler;

}
Oluşturduğumuz metodu Form_Load kısmında çağıralım.


1
2
3
4
5
6

private void Window_Loaded(object sender, RoutedEventArgs e)
{
Listele();
}
Bu işlem sonucunda Form açıldığında Listbox içine Müşteriye ait Ad ve Soyad Bilgisinin gelmesini sağladık.Şimdi de Listbox’ta tıklana kişinin detay bilgilerinin diğer Textbox’ lara gelmesini sağlayalım. Binding işleminin en güzel tarafını görelim.
?



1
2
3
4
5
6
7
8

private void lstMusteri_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
Musteri secilen = new Musteri();
secilen = (Musteri)lstMusteri.SelectedItem;
grd1.DataContext = secilen;
}
Sırada temel veri tabanı işlemleri var. Yani Insert,Update ve Delete. Bu işlemler için Buttonlarımızı kullanıyoruz.

Kaydet :


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

private void Button_Click(object sender, RoutedEventArgs e)
{
komut = new SqlCommand();
komut.Connection = baglanti;
komut.CommandText = "INSERT INTO musteri (ad,soyad,dtarih,tel) VALUES (@ad,@soyad,@tarih,@telefon)";
komut.Parameters.AddWithValue("@ad",txtAd.Text);
komut.Parameters.AddWithValue("@soyad", txtSoyad.Text);
komut.Parameters.AddWithValue("@tarih", dp1.SelectedDate.Value);
komut.Parameters.AddWithValue("@telefon",txtTelefon.Text);
baglanti.Open();
komut.ExecuteNonQuery();
baglanti.Close();
Listele();
}
Güncelle:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

private void Button_Click_3(object sender, RoutedEventArgs e)
{
komut = new SqlCommand();
komut.Connection = baglanti;
komut.CommandText = "UPDATE musteri SET ad=@ad,soyad=@soyad,dtarih=@tarih,tel=@telefon WHERE mno=@no";
komut.Parameters.AddWithValue("@ad", txtAd.Text);
komut.Parameters.AddWithValue("@soyad", txtSoyad.Text);
komut.Parameters.AddWithValue("@telefon", txtTelefon.Text);
komut.Parameters.AddWithValue("@tarih", dp1.SelectedDate.Value);
komut.Parameters.AddWithValue("@no", txtNo.Text);
baglanti.Open();
komut.ExecuteNonQuery();
baglanti.Close();
}
 
Üst Alt