none
Dataset içine bir kaç farklı mdb den tablo ekleyip bunlar arasında dataset içinde join ilişkisi olan sql sorgular nasıl çalıştırırım RRS feed

Tüm Yanıtlar

  • LINQ Kullanarak yapabilirsiniz.. Aşağıda LINQPad ile bir örnek hazırladım.

    void Main()
    {
    	DataTable categoryTable = new DataTable();
    	categoryTable.Columns.Add("Id");
    	categoryTable.Columns.Add("Name");
    
    	DataTable productTable = new DataTable();
    	productTable.Columns.Add("Id");
    	productTable.Columns.Add("CategoryId");
    	productTable.Columns.Add("Name");
    	productTable.Columns.Add("Price");
    
    	FillCategories(categoryTable);
    	FillProducts(productTable);
    	categoryTable.Dump();
    	productTable.Dump();
    	var result = productTable.AsEnumerable()
    	.Join(categoryTable.AsEnumerable(), pr => pr["CategoryId"], cat => cat["Id"], (pr, cat) => new
    	{
    		ProductId = pr["Id"],
    		CategoryName = cat["Name"],
    		ProductName = pr["Name"]			
    	});
    	result.Dump();
    }
    
    static void FillCategories(DataTable categoryTable)
    {
    	var row = categoryTable.NewRow();
    	row["Id"] = 1;
    	row["Name"] = "Computers";
    	categoryTable.Rows.Add(row);
    
    	var row2 = categoryTable.NewRow();
    	row2["Id"] = 2;
    	row2["Name"] = "Books";
    	categoryTable.Rows.Add(row2);
    }
    static void FillProducts(DataTable productTable)
    {
    	var row = productTable.NewRow();
    	row["Id"] = Guid.NewGuid();
    	row["CategoryId"] = 1;
    	row["Name"] = "Asus NJ600 Laptop";
    	row["Price"] = 1364.85m;
    	productTable.Rows.Add(row);
    
    	var row2 = productTable.NewRow();
    	row2["Id"] = Guid.NewGuid();
    	row2["CategoryId"] = 2;
    	row2["Name"] = "SQL Server 2014 Features";
    	row2["Price"] = 66.85m;
    	productTable.Rows.Add(row2);
    }
    

    Sonuç :


    oguzkurtcuoglu.com


    31 Mart 2016 Perşembe 07:11
  • Sil bastan Linq ogrenmeniz gerekmiyor, Linq ayri bir sey degil, zaten dilin icinde, yani C# 3.5 ve sonrasini ogrenmis oluyorsunuz.

    Illa dataset ile yapacaksaniz, relation ekleyip kullanabilirsiniz. Ya da illa isin icine SQL karistirmak istiyorsaniz, o zaman da, ornegin SQLite'yi referanslariniza ekleyip, DataSet'e aldiklarinizi, Sqlite'da bir "in memory" database'e alip orada SQL kullanabilirsiniz.

    Ya da olayi kokten database seviyesinde halledersiniz derdim ama mdb yani access'i database niyetine kullandiginizi goruyorum :( Yine de olabilir, yanlis hatirlamiyorsam access VBA destekliyordu. Ya da access'te, diger databaselerdekine benzer, farkli databaseleri isaret eden syntax olabilir (is access olunca cok da bir sey beklememek lazim).


    Not: Bu arada, Linq dogrudan SQL komutlarini da izin veriyor.
    31 Mart 2016 Perşembe 12:10
    Yanıtlayıcı
  • Ne yazik ki hersey istedigin gibi olmuyor. Linklerden birisi benim blog:

    Blog linki

    Ilk blog girisi burada, Subat 2009'da basliyor ve Linq var sadece (ve giriste biraz C#).

    31 Mart 2016 Perşembe 13:53
    Yanıtlayıcı
  • Bizim milletimiz neden yeni bişey çıktığında "yeniyse kolaylık olması ve daha iyi çalışması için yapılmıştır" ibaresini kabul edemiyor anlamıyorum. 10 yılda ne sql'i öğrendiniz öyle? En başta dataset, datatable gibi yapıları bile kullanmanız gereksizken hala sql diye diretmeyin kendinize. Yenilikleri takip etseniz o kadarda zor bişey değil bunlar. Gün geçtikçe insanlara yük çıkarmak için değil kolaylaştırmak için bişeyler yapılıyor unutmayın..

    oguzkurtcuoglu.com


    31 Mart 2016 Perşembe 14:46
  • C# ogrenseydin keske.
    31 Mart 2016 Perşembe 22:24
    Yanıtlayıcı
  • Ya oyle bir sey yok. Linq cok daha iyisini de yapiyor. Linq'yu yanlis anliyorsun. Anlami Language INtegrated Query, yani dile entegre sorgulama. Numaralanabilen (baska sekilde soylemek gerekirse cogul sekli olan) her sey icin sorgulama sagliyor. Ornegin, Directory.GetFiles, int[] (array of integers), DataTable.Rows, ...

    Kullanildigi degisik yerlere gore degisik isimlendirmeler yapilabiliyor (Linq To SQL, Linq to EF, Linq to objects, Linq to DataSet, Linq to Excel, Linq to CSV, Linq to Access, Linq to XML ...). Aralarinda uc asagi bes yukari farkliliklar olmasina ragmen temel felsefe Linq.

    Neyse felsefe yerine sana bir ya da bir kac ornek gondereyim. Buraya yazarsam kalabalik olacak ve forum mesajlarinin formati gittikce daralan sekilde oluyor, onun icin ilk sorunun altina yazayim ornek ya da ornekleri.

    7 Nisan 2016 Perşembe 12:54
    Yanıtlayıcı
  • Hocam hiç uğraşma, bunun derdi ortalığı trollemek, diğer konuya baksana bi :)

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    7 Nisan 2016 Perşembe 12:57
    Moderatör
  • Bu ornek dogrudan OleDbDataAdapter ile access'ten (databaseden saymadigim) aldigi tablolarla calisiyor. Bir dataset'e farkli 4 tabloyu aliyoruz once, sirf farkli mdb'lerden gelmis DataTable'lari taklit etmek icin. Ornekler icin LinqPad'i indirip kullandigini var sayiyorum:

    void Main()
    {
    	string path = @"D:\Data\Northwind.mdb";
    	string conStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path;
    
        var ds = new DataSet();
    	new OleDbDataAdapter("select * from Customers", conStr).Fill(ds,"Customers");
    	new OleDbDataAdapter("select * from Orders", conStr).Fill(ds,"Orders");
    	new OleDbDataAdapter("select * from Employees", conStr).Fill(ds,"Employees");
    	new OleDbDataAdapter("select * from [Order Details]", conStr).Fill(ds,"OrderDetails");
    	
        var fullData = from c in ds.Tables["Customers"].AsEnumerable()
    	               join o in ds.Tables["Orders"].AsEnumerable() on c.Field<string>("CustomerId") equals o.Field<string>("CustomerId")
    				   join e in ds.Tables["Employees"].AsEnumerable() on o.Field<int?>("EmployeeId") equals e.Field<int?>("EmployeeId")
    				   join od in ds.Tables["OrderDetails"].AsEnumerable() on o.Field<int?>("OrderId") equals od.Field<int?>("OrderId")
    				   select new {
    				      CustomerId = c.Field<string>("CustomerId"),
    					  Company = c.Field<string>("CompanyName"),
    					  Salesman = string.Format("{0} {1}", e.Field<string>("FirstName"), e.Field<string>("LastName")),
    					  OrderId = o.Field<int?>("OrderId"),
    					  OrderDate = o.Field<DateTime?>("OrderDate"),
    					  ShipDate = o.Field<DateTime?>("ShippedDate"),
    					  ProductId = od.Field<int?>("ProductID"),
    					  UnitPrice = od.Field<decimal?>("UnitPrice"),
    					  Quantity = od.Field<short?>("Quantity"),
    					  Tutar = od.Field<decimal?>("UnitPrice") * od.Field<short?>("Quantity")
    				   };
      // fullData.Dump();
      fullData.Where(d => d.CustomerId == "ALFKI").Dump();
    }

    Ciktisi:

    7 Nisan 2016 Perşembe 13:00
    Yanıtlayıcı
  • Bu da yine access'le bir ornek, ancak IQToolkit ile Linq to access kullaniyor:

    void Main()
    {
      // Form layout
      Form f = new Form {Text="Ornek",Width=600};
      SplitContainer sc = new SplitContainer {Dock=DockStyle.Fill, SplitterDistance=100};
      DataGridView dgv = new DataGridView { Dock=DockStyle.Fill };
      ListBox lb = new ListBox {Dock=DockStyle.Fill};
      sc.Panel1.Controls.Add( dgv );
      sc.Panel2.Controls.Add( lb );
      f.Controls.Add(sc);
      // Form layout
    
      var db = new Db();
      
      dgv.DataSource = db.Musteriler.ToList();
    
      // DataGridView Cell Click event
      // Kod optimize degil. ID degisti mi diye bakmiyor.
       dgv.CellClick += (sender, args) => {
         
        var id = (string)((DataGridView)sender).CurrentRow.Cells[0].Value;
        
        var siparisler = (from o in db.Siparisler.Where (s => s.CustomerId == id)
                       let saticiInfo = string.Format("[{0}] {1} {2}", o.OrderId, o.Satici.FirstName, o.Satici.LastName)
                       select new {Satici=saticiInfo, o.CustomerId, o.OrderDate, o.OrderId, o.EmployeeId, o.ShippedDate, o.RequiredDate })
                       .ToList();
    
        lb.DataSource = null;
        lb.Items.Clear();
        lb.DataSource = siparisler;
        lb.DisplayMember = "Satici";
      };
      
      f.Show();
    }
    
    #region Database Yardimci Katman
    public class Db 
    {
      private AccessQueryProvider provider;
      public Db()
      {
        string path   = @"D:\data\Northwind.accdb";
        string conStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+path;
          
        provider= new AccessQueryProvider(new OleDbConnection(conStr), new ImplicitMapping(), QueryPolicy.Default);
      }
    
      public IEntityTable<Customer> Musteriler { 
        get { return this.provider.GetTable<Customer>("Customers"); } 
        private set {} }
    
      public IEntityTable<Order> Siparisler { 
        get { return this.provider.GetTable<Order>("Orders"); } 
        private set {} }
    
      public IEntityTable<Employee> Personel { 
        get { return this.provider.GetTable<Employee>("Employees"); } 
        private set {} }
    }
    #endregion
    
    #region Entity Classlari
    public class Customer {
        public string CustomerId { get; set; }
        public string ContactName { get; set; }
        public string CompanyName { get; set; }
        public List<Order> Siparisler { get; set; } // musterinin siparisleri
    }
    
    public class Order {
     public int OrderId { get; set; }
     public string CustomerId { get; set; }
     public int EmployeeId { get; set; }
     public DateTime OrderDate { get; set; }
     public DateTime? RequiredDate { get; set; }
     public DateTime? ShippedDate { get; set; }
     
     public Customer Musteri { get; set; } // siparisin sahibi
     public Employee Satici { get; set; } // siparisi alan musteri temsilcisi
    }
    
    public class Employee {
     public int EmployeeId { get; set; }
     public string FirstName { get; set; }
     public string LastName { get; set; }
     public DateTime? BirthDate { get; set; }
     public DateTime? HireDate { get; set; }
     
     public List<Order> Orders { get; set; } // bu temsilcinin Siparisleri
     
     // List/comboya baglanirsa otomatik DisplayMember
     public override string ToString()
     {
          return string.Format("[{0}] {1} {2}", this.EmployeeId, this.FirstName, this.LastName );
     }
    }
    #endregion

    7 Nisan 2016 Perşembe 13:17
    Yanıtlayıcı
  • Evet o konuyu yeni gordum ve harcadigim zamana acidim.
    7 Nisan 2016 Perşembe 13:42
    Yanıtlayıcı
  • Ya sen saka misin. Sana dosdogru calisan, test edilmis kod verdik. Kod C# kodu, sen VB.Net koduna "benzetmeye" calismissin.

    Ben VB.Net bilmiyorum, tamam ama sen daha benim bildigim kadarcik VB.Net bilmeden, ne diye VB.Net kodu gibi yaziyorsun ki? Sen bunlari yapmaya baslamadan once, kullanmaya calistigin dilin temelini ogrensen cok daha iyi edersin.

    Neyse, ben gene VB.Net'e cevrilmis ornegini yazayim bari:

    Sub Main
    	Dim path As String = "D:\Data\Northwind.mdb"
    	Dim conStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & path
    
    	Dim ds = New DataSet()
    	Dim s1 = New OleDbDataAdapter("select * from Customers", conStr).Fill(ds, "Customers")
    	Dim s2 = New OleDbDataAdapter("select * from Orders", conStr).Fill(ds, "Orders")
    	Dim s3 = New OleDbDataAdapter("select * from Employees", conStr).Fill(ds, "Employees")
    	Dim s4 = New OleDbDataAdapter("select * from [Order Details]", conStr).Fill(ds, "OrderDetails")
    
    	Dim fullData = From c In ds.Tables("Customers").AsEnumerable() _
    		Join o In ds.Tables("Orders").AsEnumerable() On c.Field(Of String)("CustomerId") Equals o.Field(Of String)("CustomerId") _
    		Join e In ds.Tables("Employees").AsEnumerable() On o.Field(Of System.Nullable(Of Integer))("EmployeeId") Equals e.Field(Of System.Nullable(Of Integer))("EmployeeId") _
    		Join od In ds.Tables("OrderDetails").AsEnumerable() On o.Field(Of System.Nullable(Of Integer))("OrderId") Equals od.Field(Of System.Nullable(Of Integer))("OrderId")
    		Select New With { _
    		 .CustomerId = c.Field(Of String)("CustomerId"), _
    		 .Company = c.Field(Of String)("CompanyName"), _
    		 .Salesman = String.Format("{0} {1}", e.Field(Of String)("FirstName"), e.Field(Of String)("LastName")), _
    		 .OrderId = o.Field(Of System.Nullable(Of Integer))("OrderId"), _
    		 .OrderDate = o.Field(Of System.Nullable(Of DateTime))("OrderDate"), _
    		 .ShipDate = o.Field(Of System.Nullable(Of DateTime))("ShippedDate"), _
    		 .ProductId = od.Field(Of System.Nullable(Of Integer))("ProductID"), _
    		 .UnitPrice = od.Field(Of System.Nullable(Of Decimal))("UnitPrice"), _
    		 .Quantity = od.Field(Of System.Nullable(Of Short))("Quantity"), _
    		 .Tutar = od.Field(Of System.Nullable(Of Decimal))("UnitPrice") * od.Field(Of System.Nullable(Of Short))("Quantity") _
    	}
    	' fullData.Dump();
    	fullData.Where(Function(d) d.CustomerId = "ALFKI").Dump()
    
    End Sub

    Not: Sabahin 6'sinda 24 saat PC basinda filan, bunlarla sizlanma. Bunlar her yazilimcinin hayatinda normal olarak olan seyler. Onun yerine seviyeni bozmadan soru sormayi, verilen cevaplari anlamayi ogren. Tabii bir de kullanmaya calistigin dili ogren once.

    8 Nisan 2016 Cuma 11:32
    Yanıtlayıcı