none
Access databsede Linq sorgusu kullanmak RRS feed

  • Soru

  • Merhaba Accesde bir tablom var Ben burda linq to sql klası kullanmaya çalışıyorum.Bu sebepten bir adet  DataContext class olşturdum.aşağıdaki gibi

    class MyDataContext : DataContext
        {
            public MyDataContext(IDbConnection con)
                : base(con)
            {
    
    
            }
        }

    Daha sonra button click olayında bu kodlarla tabloya ulaşıp sorgu yazmaya çalışıorum.Fakat tablo adı gelmiyor halbuki Access değilde sql olsaydı sorun olmuyordu.Gerçi sorgunun altındaki kodlarında çalışıp çalışmayacağını bilmiyorum tamamen deneme yanılma yaptım .Access de linq kullanamın yolu böyle  birşeymi.Nasıl yapmalıyım

      using (con = new OleDbConnection(cnnstr))
                {
                    MyDataContext contx = new MyDataContext(con);
    
                    var query= from c in contx......//tablo adı yok
               
                  
                  
                   
                    contx.Connection.Open();
    
                    dataGridView1.DataSource = contx.ExecuteCommand(query);
                   }

    1 Ekim 2014 Çarşamba 12:11

Yanıtlar

  • Tabii ki oncelikli ve siddetli tavsiye databaseden sayilmayan Access'i database diye kullanmamaniz.

    Access ile Linq kullanacak iseniz DataContext yerine, codeplexten IQToolkit alin ve onu kullanin (Tom Brothers'in IQToolkit contrib'ini bulursaniz o aracla da kolaylikla data classlarinizi yaratabilirsiniz).

    Ornek:

    void Main()
    {
      string path = @"C:\Users\Cetin\Documents\MyTest.accdb";
      string conStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path;
    
      var provider = new AccessQueryProvider(new OleDbConnection(conStr), new AttributeMapping(typeof(MyDbAttributes)), QueryPolicy.Default);
    
      provider.Connection.Open();
      // Veritabanina gidenleri gormek istersen
      provider.Log = Console.Out;
    
      try
      {
          var db = new MyDb(provider);
          
          // 3 yeni musteri
          Musteri m1 = new Musteri { Ad = "Ali", Soyad = "Xx", Cep = "111" };
          Musteri m2 = new Musteri { Ad = "Ahmet", Soyad = "Yy", Sabit = "222" };
          Musteri m3 = new Musteri { Ad = "Veli", Soyad = "Zz", Cep = "333", Sabit = "444", Adres = "aaaa", Tarih = DateTime.Today };
    
          // Musterileri ekle ve idlerini al
          var mId1 = db.Musteriler.Insert(m1, m => m.ID);
          var mId2 = db.Musteriler.Insert(m2, m => m.ID);
          var mId3 = db.Musteriler.Insert(m3, m => m.ID);
    
          // 3.Musteriye 2 tane is ekle
          var is1 = new Is { Ada = "Ada1", IsAdi = "AAAA", Ucret=600, KimlikMusteri = mId3 };
          var is2 = new Is { Ada = "Ada2", IsAdi = "BBBB", Ucret=200, KimlikMusteri = mId3 };
          
          var iId1 = db.Isler.Insert(is1, i => i.ID);
          var iId2 = db.Isler.Insert(is2, i => i.ID);
          
          // 3.musteriye eklenen islerden ilkine 1 odeme ekle
          // eski bir musteriye de olabilirdi - var mId3 = 1;
          
          var borc = db.Isler.Where (i => i.KimlikMusteri == mId3).Sum (i => i.Ucret);
          var odenen = db.Odemeler.Where (o => o.Is.KimlikMusteri == mId3).Sum (o => o.Alinan);
          
          var odeme1 = new Odeme { OdemeYapan = "Ben", Alinan=50, Kalan=borc-odenen-50, KimlikIs = iId1, Tarih = DateTime.Now};
          
          db.Odemeler.Insert( odeme1 );
          
          // istersen kayitlari bir yerde goster
          // dataGridView1.DataSource = db.Musteriler.ToList();
      }
      finally
      {
          provider.Connection.Close();
      }
    }
    
    public partial class MyDb
    {
        private IEntityProvider provider;
    
        public MyDb(IEntityProvider provider)
        {
            this.provider = provider;
        }
    
        public IEntityProvider Provider
        {
            get { return this.provider; }
        }
    
        public virtual IEntityTable<Is> Isler
        {
            get { return this.Provider.GetTable<Is>("Isler"); }
        }
        public virtual IEntityTable<Musteri> Musteriler
        {
            get { return this.Provider.GetTable<Musteri>("Musteriler"); }
        }
        public virtual IEntityTable<Odeme> Odemeler
        {
            get { return this.Provider.GetTable<Odeme>("Odemeler"); }
        }
    }
    
    public partial class MyDbAttributes : MyDb
    {
        public MyDbAttributes(IEntityProvider provider)
            : base(provider)
        {
        }
    
        [Table(Name = "Musteriler")]
        [Column(Member = "ID", IsPrimaryKey = true, IsGenerated = true)]
        [Column(Member = "Ad")]
        [Column(Member = "Soyad")]
        [Column(Member = "Cep")]
        [Column(Member = "Sabit")]
        [Column(Member = "Tarih")]
        [Association(Member = "Isler", KeyMembers = "ID", RelatedEntityID = "Isler", RelatedKeyMembers = "KimlikMusteri")]
        public override IEntityTable<Musteri> Musteriler
        {
            get { return base.Musteriler; }
        }
    
        [Table(Name = "Is")]
        [Column(Member = "ID", IsPrimaryKey = true, IsGenerated = true)]
        [Column(Member = "KimlikMusteri")]
        [Column(Member = "IsAdi")]
        [Column(Member = "Ada")]
        [Column(Member = "Parsel")]
        [Column(Member = "Ucret")]
        [Association(Member = "Musteri", KeyMembers = "KimlikMusteri", RelatedEntityID = "Musteriler", RelatedKeyMembers = "ID")]
        [Association(Member = "Odemeler", KeyMembers = "ID", RelatedEntityID = "Odemeler", RelatedKeyMembers = "KimlikIs")]
        public override IEntityTable<Is> Isler
        {
            get { return base.Isler; }
        }
    
        [Table(Name = "Odeme")]
        [Column(Member = "ID", IsPrimaryKey = true, IsGenerated = true)]
        [Column(Member = "KimlikIs")]
        [Column(Member = "OdemeYapan")]
        [Column(Member = "Alinan")]
        [Column(Member = "Tarih")]
        [Column(Member = "Kalan")]
        [Association(Member = "Is", KeyMembers = "KimlikIs", RelatedEntityID = "Isler", RelatedKeyMembers = "ID")]
        public override IEntityTable<Odeme> Odemeler
        {
            get { return base.Odemeler; }
        }
    }
    
    // Entity Class
    public class Musteri
    {
        public int ID;
        public string Ad;
        public string Soyad;
        public string Cep;
        public string Sabit;
        public string Adres;
        public DateTime? Tarih;
        public IList<Is> Isler;
    }
    
    public class Is
    {
        public int ID;
        public int KimlikMusteri;
        public string IsAdi;
        public string Ada;
        public string Parsel;
        public decimal Ucret;
    
        public Musteri Musteri;
        public IList<Odeme> Odemeler;
    }
    
    public class Odeme
    {
        public int ID;
        public int KimlikIs;
        public string OdemeYapan;
        public decimal Alinan;
        public decimal Kalan;
        public DateTime? Tarih;
    
        public Is Is;
    
    }

    • Yanıt Olarak İşaretleyen CHSARPCSHARP 2 Ekim 2014 Perşembe 13:51
    1 Ekim 2014 Çarşamba 12:16
    Yanıtlayıcı

Tüm Yanıtlar

  • Tabii ki oncelikli ve siddetli tavsiye databaseden sayilmayan Access'i database diye kullanmamaniz.

    Access ile Linq kullanacak iseniz DataContext yerine, codeplexten IQToolkit alin ve onu kullanin (Tom Brothers'in IQToolkit contrib'ini bulursaniz o aracla da kolaylikla data classlarinizi yaratabilirsiniz).

    Ornek:

    void Main()
    {
      string path = @"C:\Users\Cetin\Documents\MyTest.accdb";
      string conStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path;
    
      var provider = new AccessQueryProvider(new OleDbConnection(conStr), new AttributeMapping(typeof(MyDbAttributes)), QueryPolicy.Default);
    
      provider.Connection.Open();
      // Veritabanina gidenleri gormek istersen
      provider.Log = Console.Out;
    
      try
      {
          var db = new MyDb(provider);
          
          // 3 yeni musteri
          Musteri m1 = new Musteri { Ad = "Ali", Soyad = "Xx", Cep = "111" };
          Musteri m2 = new Musteri { Ad = "Ahmet", Soyad = "Yy", Sabit = "222" };
          Musteri m3 = new Musteri { Ad = "Veli", Soyad = "Zz", Cep = "333", Sabit = "444", Adres = "aaaa", Tarih = DateTime.Today };
    
          // Musterileri ekle ve idlerini al
          var mId1 = db.Musteriler.Insert(m1, m => m.ID);
          var mId2 = db.Musteriler.Insert(m2, m => m.ID);
          var mId3 = db.Musteriler.Insert(m3, m => m.ID);
    
          // 3.Musteriye 2 tane is ekle
          var is1 = new Is { Ada = "Ada1", IsAdi = "AAAA", Ucret=600, KimlikMusteri = mId3 };
          var is2 = new Is { Ada = "Ada2", IsAdi = "BBBB", Ucret=200, KimlikMusteri = mId3 };
          
          var iId1 = db.Isler.Insert(is1, i => i.ID);
          var iId2 = db.Isler.Insert(is2, i => i.ID);
          
          // 3.musteriye eklenen islerden ilkine 1 odeme ekle
          // eski bir musteriye de olabilirdi - var mId3 = 1;
          
          var borc = db.Isler.Where (i => i.KimlikMusteri == mId3).Sum (i => i.Ucret);
          var odenen = db.Odemeler.Where (o => o.Is.KimlikMusteri == mId3).Sum (o => o.Alinan);
          
          var odeme1 = new Odeme { OdemeYapan = "Ben", Alinan=50, Kalan=borc-odenen-50, KimlikIs = iId1, Tarih = DateTime.Now};
          
          db.Odemeler.Insert( odeme1 );
          
          // istersen kayitlari bir yerde goster
          // dataGridView1.DataSource = db.Musteriler.ToList();
      }
      finally
      {
          provider.Connection.Close();
      }
    }
    
    public partial class MyDb
    {
        private IEntityProvider provider;
    
        public MyDb(IEntityProvider provider)
        {
            this.provider = provider;
        }
    
        public IEntityProvider Provider
        {
            get { return this.provider; }
        }
    
        public virtual IEntityTable<Is> Isler
        {
            get { return this.Provider.GetTable<Is>("Isler"); }
        }
        public virtual IEntityTable<Musteri> Musteriler
        {
            get { return this.Provider.GetTable<Musteri>("Musteriler"); }
        }
        public virtual IEntityTable<Odeme> Odemeler
        {
            get { return this.Provider.GetTable<Odeme>("Odemeler"); }
        }
    }
    
    public partial class MyDbAttributes : MyDb
    {
        public MyDbAttributes(IEntityProvider provider)
            : base(provider)
        {
        }
    
        [Table(Name = "Musteriler")]
        [Column(Member = "ID", IsPrimaryKey = true, IsGenerated = true)]
        [Column(Member = "Ad")]
        [Column(Member = "Soyad")]
        [Column(Member = "Cep")]
        [Column(Member = "Sabit")]
        [Column(Member = "Tarih")]
        [Association(Member = "Isler", KeyMembers = "ID", RelatedEntityID = "Isler", RelatedKeyMembers = "KimlikMusteri")]
        public override IEntityTable<Musteri> Musteriler
        {
            get { return base.Musteriler; }
        }
    
        [Table(Name = "Is")]
        [Column(Member = "ID", IsPrimaryKey = true, IsGenerated = true)]
        [Column(Member = "KimlikMusteri")]
        [Column(Member = "IsAdi")]
        [Column(Member = "Ada")]
        [Column(Member = "Parsel")]
        [Column(Member = "Ucret")]
        [Association(Member = "Musteri", KeyMembers = "KimlikMusteri", RelatedEntityID = "Musteriler", RelatedKeyMembers = "ID")]
        [Association(Member = "Odemeler", KeyMembers = "ID", RelatedEntityID = "Odemeler", RelatedKeyMembers = "KimlikIs")]
        public override IEntityTable<Is> Isler
        {
            get { return base.Isler; }
        }
    
        [Table(Name = "Odeme")]
        [Column(Member = "ID", IsPrimaryKey = true, IsGenerated = true)]
        [Column(Member = "KimlikIs")]
        [Column(Member = "OdemeYapan")]
        [Column(Member = "Alinan")]
        [Column(Member = "Tarih")]
        [Column(Member = "Kalan")]
        [Association(Member = "Is", KeyMembers = "KimlikIs", RelatedEntityID = "Isler", RelatedKeyMembers = "ID")]
        public override IEntityTable<Odeme> Odemeler
        {
            get { return base.Odemeler; }
        }
    }
    
    // Entity Class
    public class Musteri
    {
        public int ID;
        public string Ad;
        public string Soyad;
        public string Cep;
        public string Sabit;
        public string Adres;
        public DateTime? Tarih;
        public IList<Is> Isler;
    }
    
    public class Is
    {
        public int ID;
        public int KimlikMusteri;
        public string IsAdi;
        public string Ada;
        public string Parsel;
        public decimal Ucret;
    
        public Musteri Musteri;
        public IList<Odeme> Odemeler;
    }
    
    public class Odeme
    {
        public int ID;
        public int KimlikIs;
        public string OdemeYapan;
        public decimal Alinan;
        public decimal Kalan;
        public DateTime? Tarih;
    
        public Is Is;
    
    }

    • Yanıt Olarak İşaretleyen CHSARPCSHARP 2 Ekim 2014 Perşembe 13:51
    1 Ekim 2014 Çarşamba 12:16
    Yanıtlayıcı
  • Hocam sizin dediğiniz gibi en mantıklısı sql ,böyle herşeyi sıfırdan hazırladıktan sonra nerde LinqTo sql kolaylığı
    2 Ekim 2014 Perşembe 13:50
  • Linq To SQL, ya da Entitiy Framework ... olunca hic bir hazirlik yapman gerekmedigi kanisina kapilma :) Sonucta statik olarak derlenen bir dille calisiyorsun. Linq To SQL veya EF ile bu baslangictaki tanim isini senin icin yapan araclar var, o kadar.

    Model First, Code first olunca arac yerine yazan sensin ama onu yapmayi hammallik gibi goruyorsan bir yerlerde elini tasin altina sokman gerekiyor.  NoSQL'lerde teorik olarak sema gerekmese de pratikte orada da sema kullaniyorsun.

    Kodun o kismi sadece bir kere yaziliyor nihayetinde. Bana da oturup SQL serverda yeni create table ... yazmasi ya da visual olarak tasarlamasi kulfet geliyor ya birinin yapmasi lazim :)

    2 Ekim 2014 Perşembe 15:18
    Yanıtlayıcı