En iyi yanıtlayıcılar
c# -ile vfp veritabanındakı verileri sql server tablosundakı verilere göre güncelleme

Soru
-
Merhaba arkadaşlar. Sql serverdeki tablodaki verileri tek seferde vpf veritabanına aktarmam lazım. (*dbf uzantılı).
sql serverdeki tablom şu şekilde. Kisinin işlediyi günü göre aldığı maaş ve ondan tutulan (çıkılan) faizler% yani Vergi ve Fond kolonlari, alacagi maaş (Kalan kolonu) ve HesabNumarası
1) Sql serverdatabase
İd Kisiİd Maas Gun Vergi Fond Kalan HesabNumarasi
1 2 250 12 18% 5% 170 987654321023
vpf veritabanımda şu şekilde
2) vpv database
HesabNumarası Mebleg
vpf deki veritabanında hesab numaraları ve kişinin alacagı maaş tutmak için olan Mebleg kolonu var. Mebleg kolonundakı verileri kişinin keçen ay aldıkları maaşlardır.
Uzun sözün kısası benim yapmak istediyim vpf veritabanını(*dbf uzantılı ) C# daha önceden belirtdiyim klasörün içine taşıyorum. Sonra C# tarafda butonna bir defa click etdiyimde sql veritabanındakı verileri bir defada dbf uzantılı veritabanındakı kolonlara güncellesin. Yani sql deki tabloda hesab numarasına uyğun olan Kalan kolonundakı meblegi dbf uzantılı veritabanındakı Mebleg kolonlarına güncellesin.
- Düzenleyen vusal.nurehmedov 15 Kasım 2016 Salı 15:19
Yanıtlar
-
Oncelikle sunu belirteyim, VFP'yi linked server olarak eklemeyi denemeyin hic (niyetiniz sadece okumak degilse, ya da sybase ADS gibi bir driver kullanmiyorsaniz unutun).
Ikincisi, VFP eger lokal bir cursor ile calismiyorsa, bulk insert benzeri isleri dogrudan yapamazsiniz (neyseki lokal cursor yarattirmak icin numaralari var).
Ucuncusu, eger C# uygulamaniz VFPOLEDB'yi kullanacak ise (resmi VFP driveri o), projeniz target platform olarak x86 secmis olmali.
Dogru mu anladim, eger SQL serverda:
HesabNumarasi, Kalan 123, 100 234, 300 455, 500
diye 3 kayit varsa, VFP'de sonucta:
HesabNumarasi, Mebleg 123, 100 234, 300 455, 500
olacak? Eger dogruysa, ve kayit sayisi cok fazla degilse, en kolayi, hem SQL server hem VFP'ye baglanti acip dongude insert ya da update yapmak. Eger VFP'de onceden:
HesabNumarasi, Mebleg 666, 150 333, 230
varsa ne olacak? Onlar kalacak mi? Kalacaklarini ve sonucta:
HesabNumarasi, Mebleg 666, 150 333, 230 123, 100 234, 300 455, 500
yapacagimizi farzediyorum:
using (SqlConnection scn = new SqlConnection(@"server=.\SQLExpress;Database=dbAdi;Trusted_Connection=yes")) using (OleDbConnection vfp = new OleDbConnection(@"Provider=VFPOLEDB;Data Source=c:\Dizin Adi")) { OleDbCommand update = new OleDbCommand("update vfpTabloAdi set Mebleg = ? where HesabNumarasi = ?", vfp); update.Parameters.AddWithValue("mebleg", 0M); update.Parameters.AddWithValue("hno", ""); // string ? OleDbCommand insert = new OleDbCommand("insert into vfpTabloAdi (HesabNumarasi, Mebleg) values (?,?)", vfp); insert.Parameters.AddWithValue("hno", ""); insert.Parameters.AddWithValue("mebleg", 0M); scn.Open(); vfp.Open(); var reader = new SqlCommand("select hesabNumarasi as hn, kalan from sqlTablo", scn).ExecuteReader(); while (reader.Read()) { var mebleg = (decimal)reader["kalan"]; var hesap = (string)reader["hn"]; update.Parameters["mebleg"].Value = mebleg; update.Parameters["hno"].Value = hesap; if (update.ExecuteNonQuery() < 1) { insert.Parameters["mebleg"].Value = mebleg; insert.Parameters["hno"].Value = hesap; insert.ExecuteNonQuery(); } } scn.Close(); vfp.Close(); }
Eger veri sayisi coksa o zaman yapilabilecek bazi numaralar var. Cok oldugunu sanmiyorum, onun icin o numaralarla kafa karistirmayayim (tum datayi XML string olarak gonderip hafizada lokal cursor yaratmak gibi).
- Yanıt Olarak İşaretleyen vusal.nurehmedov 16 Kasım 2016 Çarşamba 16:35
-
Hepsi SQL'den guncellenecek ise, 0 yapmaya ne gerek var anlamadim ama oyle olsun:
using (SqlConnection scn = new SqlConnection(@"server=.\SQLExpress;Database=dbAdi;Trusted_Connection=yes")) using (OleDbConnection vfp = new OleDbConnection(@"Provider=VFPOLEDB;Data Source=c:\Dizin Adi")) { OleDbCommand update = new OleDbCommand("update vfpTabloAdi set Mebleg = ? where HesabNumarasi = ?", vfp); update.Parameters.AddWithValue("mebleg", 0M); update.Parameters.AddWithValue("hno", ""); // string ? scn.Open(); vfp.Open(); // tum hesaplarda mebleg 0 yapiliyor new OleDbCommand("update vfpTabloAdi set Mebleg = 0", vfp); var reader = new SqlCommand("select hesabNumarasi as hn, kalan from sqlTablo", scn).ExecuteReader(); while (reader.Read()) { var mebleg = (decimal)reader["kalan"]; var hesap = (string)reader["hn"]; update.Parameters["mebleg"].Value = mebleg; update.Parameters["hno"].Value = hesap; update.ExecuteNonQuery(); } scn.Close(); vfp.Close(); }
3000 az sayilir, onun icin baska sey gerekmez (yavaslik olursa o zaman dusunuruz).
- Yanıt Olarak İşaretleyen vusal.nurehmedov 16 Kasım 2016 Çarşamba 16:35
Tüm Yanıtlar
-
Buradaki sorun nedir? Her iki DB'ye de C#'da okuyamıyor musunuz?
Aslında C#'a bile gerek yok. Direk sql içinden de yapabiliyor olmanız lazım. VFP db'yi linked DB olarak sql'e ekleyip bir sorgu ile güncelleyebilirsiniz.
http://pgnchess.com
http://dergikapaklari.com -
Oncelikle sunu belirteyim, VFP'yi linked server olarak eklemeyi denemeyin hic (niyetiniz sadece okumak degilse, ya da sybase ADS gibi bir driver kullanmiyorsaniz unutun).
Ikincisi, VFP eger lokal bir cursor ile calismiyorsa, bulk insert benzeri isleri dogrudan yapamazsiniz (neyseki lokal cursor yarattirmak icin numaralari var).
Ucuncusu, eger C# uygulamaniz VFPOLEDB'yi kullanacak ise (resmi VFP driveri o), projeniz target platform olarak x86 secmis olmali.
Dogru mu anladim, eger SQL serverda:
HesabNumarasi, Kalan 123, 100 234, 300 455, 500
diye 3 kayit varsa, VFP'de sonucta:
HesabNumarasi, Mebleg 123, 100 234, 300 455, 500
olacak? Eger dogruysa, ve kayit sayisi cok fazla degilse, en kolayi, hem SQL server hem VFP'ye baglanti acip dongude insert ya da update yapmak. Eger VFP'de onceden:
HesabNumarasi, Mebleg 666, 150 333, 230
varsa ne olacak? Onlar kalacak mi? Kalacaklarini ve sonucta:
HesabNumarasi, Mebleg 666, 150 333, 230 123, 100 234, 300 455, 500
yapacagimizi farzediyorum:
using (SqlConnection scn = new SqlConnection(@"server=.\SQLExpress;Database=dbAdi;Trusted_Connection=yes")) using (OleDbConnection vfp = new OleDbConnection(@"Provider=VFPOLEDB;Data Source=c:\Dizin Adi")) { OleDbCommand update = new OleDbCommand("update vfpTabloAdi set Mebleg = ? where HesabNumarasi = ?", vfp); update.Parameters.AddWithValue("mebleg", 0M); update.Parameters.AddWithValue("hno", ""); // string ? OleDbCommand insert = new OleDbCommand("insert into vfpTabloAdi (HesabNumarasi, Mebleg) values (?,?)", vfp); insert.Parameters.AddWithValue("hno", ""); insert.Parameters.AddWithValue("mebleg", 0M); scn.Open(); vfp.Open(); var reader = new SqlCommand("select hesabNumarasi as hn, kalan from sqlTablo", scn).ExecuteReader(); while (reader.Read()) { var mebleg = (decimal)reader["kalan"]; var hesap = (string)reader["hn"]; update.Parameters["mebleg"].Value = mebleg; update.Parameters["hno"].Value = hesap; if (update.ExecuteNonQuery() < 1) { insert.Parameters["mebleg"].Value = mebleg; insert.Parameters["hno"].Value = hesap; insert.ExecuteNonQuery(); } } scn.Close(); vfp.Close(); }
Eger veri sayisi coksa o zaman yapilabilecek bazi numaralar var. Cok oldugunu sanmiyorum, onun icin o numaralarla kafa karistirmayayim (tum datayi XML string olarak gonderip hafizada lokal cursor yaratmak gibi).
- Yanıt Olarak İşaretleyen vusal.nurehmedov 16 Kasım 2016 Çarşamba 16:35
-
Cetin abi her zaman ki gibi detaylı bilgi için teşekkür ediyorum. Veri sayısı 3000 -den fazla. VFP -de önceden var olan sadece mebleg kolonundakı veriler sıfırlanıcak. Yani vfp -de ki, tüm verilerin yerinde kalıcak hesabno ad, soyad ve başka sadece mebleg kolonundakı veriler 0 (sıfır) olucak. Sonra update işlemi yapılacak. Sizin örnekde ki, gibi desek
HesabNumarasi, Mebleg
123, 0.00
234, 0.00
455, 0.00
Birde unutmamışken bunu deyiyim. İnsert işlemi olmuycak, sadece önceden var olan verilerin meblegi güncellenek. Hani önceden sıfırlamışdık ya o sıfırların yerine sqldeki mebleg güncellenecek.
- Düzenleyen vusal.nurehmedov 15 Kasım 2016 Salı 18:34
-
Hepsi SQL'den guncellenecek ise, 0 yapmaya ne gerek var anlamadim ama oyle olsun:
using (SqlConnection scn = new SqlConnection(@"server=.\SQLExpress;Database=dbAdi;Trusted_Connection=yes")) using (OleDbConnection vfp = new OleDbConnection(@"Provider=VFPOLEDB;Data Source=c:\Dizin Adi")) { OleDbCommand update = new OleDbCommand("update vfpTabloAdi set Mebleg = ? where HesabNumarasi = ?", vfp); update.Parameters.AddWithValue("mebleg", 0M); update.Parameters.AddWithValue("hno", ""); // string ? scn.Open(); vfp.Open(); // tum hesaplarda mebleg 0 yapiliyor new OleDbCommand("update vfpTabloAdi set Mebleg = 0", vfp); var reader = new SqlCommand("select hesabNumarasi as hn, kalan from sqlTablo", scn).ExecuteReader(); while (reader.Read()) { var mebleg = (decimal)reader["kalan"]; var hesap = (string)reader["hn"]; update.Parameters["mebleg"].Value = mebleg; update.Parameters["hno"].Value = hesap; update.ExecuteNonQuery(); } scn.Close(); vfp.Close(); }
3000 az sayilir, onun icin baska sey gerekmez (yavaslik olursa o zaman dusunuruz).
- Yanıt Olarak İşaretleyen vusal.nurehmedov 16 Kasım 2016 Çarşamba 16:35