none
c# -ile vfp veritabanındakı verileri sql server tablosundakı verilere göre güncelleme RRS feed

  • 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.


    15 Kasım 2016 Salı 15:17

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). 


     

    15 Kasım 2016 Salı 17:20
    Yanıtlayıcı
  • 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).

    15 Kasım 2016 Salı 18:58
    Yanıtlayıcı

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

    15 Kasım 2016 Salı 16:28
  • 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). 


     

    15 Kasım 2016 Salı 17:20
    Yanıtlayıcı
  • 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.




    15 Kasım 2016 Salı 18:24
  • 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).

    15 Kasım 2016 Salı 18:58
    Yanıtlayıcı