none
VERİYİ TOBASE64 OLARAK SQL E KAYIT ETMEK RRS feed

  • Soru

  • Merhaba sql veritabanıma forumum üzerindeki bir texboxdan aldığım veriyi tobase64 şeklinde kayıt işlemi gerçekleştiriyorum. Daha sonra bu veriyi çözülmüş şekilde formuma da geri çağırabiliyorum. Fakat ben bu verilerin çözülmüş halini formum açılır açılmaz datagridimde göstermek istiyorum. Bu işlemi nasıl yapabilirim. Teşekkürler.

    Bu şekilde çağırınca doğal olarak veritabanından verinin tobase64 şekli geliyor

    Sqldataadapter da=New sqldataadapter("select * from test", baglanti) ;
    Datatable Dt=datatable();
    da. Fill(Dt);
    Datagridview1.datasource=Dt;

    Veriyi datagride çağırırken hangi yolu izlemeliyim?

    31 Aralık 2019 Salı 14:34

Tüm Yanıtlar

  • Birden fazla yolu var:

    DECLARE @t TABLE (id INT IDENTITY, b64Kolon VARCHAR(MAX), ornek VARCHAR(10));
    
    INSERT INTO @t
    (
        b64Kolon,
        ornek
    )
    VALUES
    ('QWxp', 'ornek1'),
    ('VmVsaQ==','ornek2'),
    ('QWhtZXQ=','ornek3'),
    ('TWVobWV0','ornek4');
    
    
    SELECT id, 
    CAST(CAST('' AS XML)
    	.value('xs:base64Binary(sql:column("b64kolon"))', 'VARBINARY(MAX)') AS VARCHAR(max))
        AS b64Kolon, ornek
    	FROM @t; 

    Yani SqlDataAdapter'in ilk parametresinde:

    SqlDataAdapter da = new SqlDataAdapter(@"SELECT id, 
    CAST(CAST('' AS XML)
    	.value('xs:base64Binary(sql:column(""b64kolon""))', 'VARBINARY(MAX)') AS VARCHAR(max))
        AS b64Kolon, digerKolonAdi
    	FROM test", baglanti); 

    seklinde yazabilirsiniz. Burada b64Kolon, base64 kodlanmış kolonunuzun adi.

    Ikinci bir yol, Linq kullanmak, daha kısa ve anlasilir:

    void Main()
    {
        DataContext db = new DataContext(@"server=.\SQLexpress;trusted_connection=yes;database=SampleDb");
    
    	var data = db.GetTable<B64test>()
    	.Select(b => new {
    		ID = b.ID,
    		B64Kolon = Encoding.UTF8.GetString(Convert.FromBase64String(b.B64Kolon)),
    		b.Ornek
    	});
        
        Form f = new Form{Width=600, Height=600};
        DataGridView dgv = new DataGridView {Dock=DockStyle.Fill};
        f.Controls.Add( dgv );
        
        dgv.DataSource = data.ToList();
        
        f.Show();
    }
    
    [Table(Name = "b64Test")]
    public class B64test
    {
    	[Column]
    	public int ID { get; set; }
    	[Column]
        public string B64Kolon { get; set; }
        [Column]
        public string Ornek { get; set; }
    }

    Linq orneginde kullanılan tablonun kodu:

    CREATE TABLE b64test (id INT IDENTITY, b64Kolon VARCHAR(MAX), ornek VARCHAR(10));
    
    INSERT INTO dbo.b64test
    (
        b64Kolon,
        ornek
    )
    VALUES
    ('QWxp', 'ornek1'),
    ('VmVsaQ==','ornek2'),
    ('QWhtZXQ=','ornek3'),
    ('TWVobWV0','ornek4');
    

    Bir baska yol, madem böyle kolonlarım olacak, o zaman CLR function yazıp bunu database'e eklemek. O zaman o fonksiyonu MS SQL server'in sanki öyle bir fonksiyonu varmış gibi kullanabilirsiniz.  



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    31 Aralık 2019 Salı 15:13
    Yanıtlayıcı
  • Birden fazla yolu var:

    DECLARE @t TABLE (id INT IDENTITY, b64Kolon VARCHAR(MAX), ornek VARCHAR(10));
    
    INSERT INTO @t
    (
        b64Kolon,
        ornek
    )
    VALUES
    ('QWxp', 'ornek1'),
    ('VmVsaQ==','ornek2'),
    ('QWhtZXQ=','ornek3'),
    ('TWVobWV0','ornek4');
    
    
    SELECT id, 
    CAST(CAST('' AS XML)
    	.value('xs:base64Binary(sql:column("b64kolon"))', 'VARBINARY(MAX)') AS VARCHAR(max))
        AS b64Kolon, ornek
    	FROM @t; 

    Yani SqlDataAdapter'in ilk parametresinde:

    SqlDataAdapter da = new SqlDataAdapter(@"SELECT id, 
    CAST(CAST('' AS XML)
    	.value('xs:base64Binary(sql:column(""b64kolon""))', 'VARBINARY(MAX)') AS VARCHAR(max))
        AS b64Kolon, digerKolonAdi
    	FROM test", baglanti); 

    seklinde yazabilirsiniz. Burada b64Kolon, base64 kodlanmış kolonunuzun adi.

    Ikinci bir yol, Linq kullanmak, daha kısa ve anlasilir:

    void Main()
    {
        DataContext db = new DataContext(@"server=.\SQLexpress;trusted_connection=yes;database=SampleDb");
    
    	var data = db.GetTable<B64test>()
    	.Select(b => new {
    		ID = b.ID,
    		B64Kolon = Encoding.UTF8.GetString(Convert.FromBase64String(b.B64Kolon)),
    		b.Ornek
    	});
        
        Form f = new Form{Width=600, Height=600};
        DataGridView dgv = new DataGridView {Dock=DockStyle.Fill};
        f.Controls.Add( dgv );
        
        dgv.DataSource = data.ToList();
        
        f.Show();
    }
    
    [Table(Name = "b64Test")]
    public class B64test
    {
    	[Column]
    	public int ID { get; set; }
    	[Column]
        public string B64Kolon { get; set; }
        [Column]
        public string Ornek { get; set; }
    }

    Linq orneginde kullanılan tablonun kodu:

    CREATE TABLE b64test (id INT IDENTITY, b64Kolon VARCHAR(MAX), ornek VARCHAR(10));
    
    INSERT INTO dbo.b64test
    (
        b64Kolon,
        ornek
    )
    VALUES
    ('QWxp', 'ornek1'),
    ('VmVsaQ==','ornek2'),
    ('QWhtZXQ=','ornek3'),
    ('TWVobWV0','ornek4');

    Bir baska yol, madem böyle kolonlarım olacak, o zaman CLR function yazıp bunu database'e eklemek. O zaman o fonksiyonu MS SQL server'in sanki öyle bir fonksiyonu varmış gibi kullanabilirsiniz.  



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    SqlDataAdapter da = new SqlDataAdapter(@"SELECT id, 
    CAST(CAST('' AS XML)
    	.value('xs:base64Binary(sql:column(""b64kolon""))', 'VARBINARY(MAX)') AS VARCHAR(max))
        AS b64Kolon, digerKolonAdi
    	FROM test", baglanti); 
    Cevabınız için teşekkürler, şu parametredeki CAST(CAST('' AS XML) deki bir tek tırnak boşluk bir tek tırnak mı? Çünkü çift tırnak işareti ile başlamış daha sonra kapatmamışsınız? Bir de bu kod satırını acaba açıklayarak yazabilir misiniz?

    31 Aralık 2019 Salı 15:52
  • Orada iki tane tek tirnak var, çift tırnak yok.

    XQuery extension method sql:column kullanarak ve XML'e cast ederek degeri alip varbinary(max)'a oradan da varchar(max)'e cast ediyoruz. Sonuc o kolondaki degerin base64'den once bytes[] sonra varchar'a çevrilmiş hali.

    Ancak dediğim gibi Linq versiyonu daha kısa, basit ve anlasilir.

    Simdi kizacaksiniz ama, baslangicta kizarsiniz diye dogrudan çözüm verdim. Aslında asil soru neden base64 sakladiginiz. varbinary saklasanız, bu çevrimler gerekmezdi ve yaklaşık 3 kat daha az yer kaplardi. 



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    1 Ocak 2020 Çarşamba 19:53
    Yanıtlayıcı