11 Mayıs 2012 Cuma

Veritabanındaki Tüm Kayıtları Tablo Yapılarını Bozmadan Silme

Bu seferki notumu ben deneyimlemedim ama çalışma arkadaşım görevini nasıl hallettiğini benimle paylaştı.. Pratik bir çözüm olduğundan notlarımda bulunsun istedim..
Mevzu veritabanımızın tüm kayıtlarını tablo yapılarımızı bozmadan boşaltmaktı. Başka başka şirketlere kurulumlarda pratiklik sağlayacak bir Stored procedure gerekliydi.. Komacaaan bir veri tabanımız olduğundan alt alta updateler deleteler trucateler anlamsız olacaktı; ki tabloların bir dolu bağlantısı keyleri vs vardı.. O zaman biz dee

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
EXEC sp_MSForEachTable 'DELETE FROM ?'
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'

 
kodlarını pratik olarak kullanıp sorunsuzca işimizi hallederiz. :)
Kodumdan gelen bu temiz veritabanını senin için hazırladım.... :P

8 Mayıs 2012 Salı

WCF Services - The maximum message size quota for incoming messages (65536) has been exceeded.



Son birkaç zamandır işlevini bile tam anlamadığım WCF Serviceslarla uğraşıyordum.. Herzamanki gibi mononun laneti vuku buldu ve pek çok gıcık engelle karşılaşıp ondan bundan yardım alaraktan serviceten doğru cevabı alabilip son aşamaya kadar gelebildim. Son aşama dediğim de servisten gelen metodları çalıştırıp sonuçları bir xml dosyasına yazdırmaktı.. Bu kadar basitti yani,, ne olurdu hemencik olsaydı :) Ama olmaaz, eğer hemen olursa uğursuzluk gelir..
Neyse sorunum bu defa da bazı metodların çalışırken
"The maximum message size quota for incoming messages (65536) has been exceeded. bla bla bla"
şeklinde bir hata vermesiydi.. Araştırdım ettim, sorunun app.config dosyasındaki
maxBufferSize ve maxReceivedMessageSize ayarlarıyla olduğunu keşfettim. Gel gelelim bu ayarları ne yaparsam yapayım aynı hatayı almaya devam ettim. Adeta yaptığım değişikliği kaale almıyordu program. Tam çözümü buldum derken olmaması cesaretimi kırmıştı.. Ama sonra bir forumda o şahane postu gördüm.. Linki:

http://forums.asp.net/post/4700212.aspx

Bu linkten hareketle app.config dosyamdaki alanlardan sadece
     maxBufferSize="2147483647"
     maxBufferPoolSize="524288"
     maxReceivedMessageSize="2147483647">
     <readerQuotas
      maxDepth="2147483647"
      maxStringContentLength="2147483647"
      maxArrayLength="2147483647"
      maxBytesPerRead="2147483647"
      maxNameTableCharCount="2147483647" />
ve

<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
alanlarımı değiştirip çalıştırdım. Hatadan eser kalmamıştı..
Her ne kadar WCF lerle uğraşırken çok sıkılmışsam da hatanın çözümünü bulmanın değeri paha biçilemez.
İnternete nasıl teşekkür edeceğimi bilemiyorum :)

25 Nisan 2012 Çarşamba

Stored Procedure Invalid Object Name

Notlarımda bulunsun..

Stored Procedure oluşturduktan sonra manasız bir şekilde "Invalid Object Name" diyerek SP'nin altını kırmızıyla çiziyorsa SQLServer ımız,
Edit -> Intellisense -> Refresh Local Cache
istiyor demektir.. :)

24 Nisan 2012 Salı

SQL Computed Column ile Ayrıntılı Tarih Tablosu

Peş peşe yayınlarımdan da farkedileceği üzere bugünlerde raporlarla başım dertte.. Hiç de sevmem kendilerini ama ne yapalım ekmek parası :)
Rapor yaparken yaparken yine bir gün müdürüm yanıma geldi ve ayrıntılı tarih tablosunun raporlarda gerekli olacağını söyledi. Hatta sonraki zamanlarda resmi tatil günlerini içerecek bir tablo yapacağımızın da sinyalini verdi.. Resmi tatil günleri muhtemelen manuel bir tablo olacak ama ayrıntılı tarih tablosu dediğim olay çok hoş :)
Şöyle ki SQL in computed Column özelliğini kullanmak bu tabloyla nasip oldu ve hoşuma da gitti..

Tablomun create scripti şu :

USE [Database]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[TARIH_TANIM](
    [TARIH] [date] NOT NULL,
    [GUN]  AS (datepart(day,[TARIH])),
    [AY]  AS (datepart(month,[TARIH])),
    [CEYREK]  AS (datepart(month,[TARIH])/(4)+(1)),
    [YIL]  AS (datepart(year,[TARIH])),
    [HAFTA_GUN]  AS (case when datepart(weekday,[TARIH])=(1) then (7) else datepart(weekday,[TARIH])-(1) end),
 CONSTRAINT [PK_TARIH_TANIM] PRIMARY KEY CLUSTERED
(
    [TARIH] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

Biz scriptle değil, tablo oluştururken kolon ayarlarından Computed Column Specification -> (Formula) alanını kullanarak formülleri ekledik .. En çok ilgimi çeken formüller Pazarı 7. gün yapan ve yılın çeyreklerini hesaplayan formüldü.. Neyse, tablomuz hazır..

Ama bitmedi ya içini nasıl dolduracağız?
ASP.NET te basit bir kod işimizi görür.. :

using System;
using _7GEN.Data;

public partial class lab_tarih_doldur : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        var sql = new SQL(ExceptionBehaviour.Throw);// burası bizim projeye özel bir sınıf.. Ayrıca kullanmak istersek sql bağlantılarımızı kendimiz karşılamak zorundayız :)

        var tarih = DateTime.Now.AddYears(5).Date;

        while (DateTime.Now.AddYears(-10) < tarih)
        {
            var command = sql.CreateCommand("INSERT INTO TARIH_TANIM(TARIH) VALUES (@TARIH)");

            sql.AttachParameter(command, "@TARIH", tarih);

            sql.Execute(command);

            tarih = tarih.AddDays(-1);
        }
    }
}

Bu kadar basitmiş..
Mutlaka aynılarının daha güzelleri yapılabiliyordur ama JAVA ve ORACLE saplantılı aşkından sonra .NET ve SQL e ısınmaya mı başlayacağım ne? :)

Kısmet..

Rapora Göre Farklı Parametre Atama ASP.NET RS

Müdürüm bazen beni çok fena ümitlendiriyor, bazen de çok fena komplekse sokuyor :) Bugün komplekse girdiğim günlerden biriydi..
Namaz arası verip biraz da işten kaytarıp geri yerime döndüğümde bir de baktım bilgisayarımın başında müdürüm oturuyor. O an başımdan aşağıya kaynar sular döküldü,, çünkü üzerinde uğraştığım kodu henüz tamamlamamıştım ve sanırım kodda biraz saçmalamıştım.. Utandım haliyle.. Neyse ki "ne yapmaya çalıştığını anlamadım ama... " ifadesi dışında fazla bir ezme söz konusu olmadı :P Sağolsun.
Yapmaya çalıştığım şey, elimdeki peeek çok rapora ASP.NET üzerinde ayrı ayrı parametre tanımlamaktansa, elimdeki rapora göre belli parametreleri atayabileyimdi. Ben kendi çapımda ...... ServerReport.GetParameters().Contains( ......... metoduyla uğraşıyordum.. Bakın hocam/müdürüm bu olayı hangi basit yöntemle çözmüş..
list ve LINQ kullanarak..
örnek kodumu da yayınlayayım da malum unutacağım sonra da lazım olacak :) ;

    protected void RaporaParametreAta()
    {
        this.ReportViewer1.ServerReport.ReportServerCredentials = new CustomReportCredentials();

        var raporParemetreler = this.ReportViewer1.ServerReport.GetParameters();

        var parm = new List<ReportParameter>();

        parm.Add(new ReportParameter("ILANID", this.Numara.ToString()));

        if (raporParemetreler.Any(c => c.Name == "ILKTARIH"))
        {
            parm.Add(new ReportParameter("ILKTARIH", this.txtBasTar.Text));
        }

        if (raporParemetreler.Any(c => c.Name == "SONTARIH"))
        {
            parm.Add(new ReportParameter("SONTARIH", this.txtBitTar.Text));
        }

        this.ReportViewer1.ServerReport.SetParameters(parm);
        this.ReportViewer1.ServerReport.Refresh();

    } 


Zekalıyım ama işte böyle bir yapamamışlık içindeyim ;p

20 Nisan 2012 Cuma

Asp.Net te Java jar kullanmak - IKVM

Tamamen Asp.Net le yazılmış olan projemizde kullanılmak üzere müşterimiz, kendilerine özgü güvenlik kuralları nedeniyle Java ile yazılmış bir jar dosyasını projemize dahil etmemizi söyledi.. jar to exe programları mı denemedik, cmd de dll e mi çevirmeye çalışmadık, beceremedik. Sonra kısa bir araştırma sonucu bu iş için yazılmış ücretsiz IKVM dosyalarına ulaşıp projemize dahil ettik. 17 kadar dll ekledi projeye ve kodumuz sorunsuz bir şekilde çalıştı :)
Teşekkürler IKVM! :p

Raporu İlk yüklemede scroll çıkması; sonraki yüklemelerde scroll çıkmaması

Başlık komik oldu ama ben olsam böyle aratırdım :D arama yapmayı becerememek böyle olsa gerek.. Sonuç olarak bulamadım da zaten çözümü :)
Sorunu çözmek için ümitli fakat faydasız çırpınışlarımı gören müdürüm bana acımış olacak ki çırpınışıma katıldı.. 1-2 saat çırpındıktan sonra sorunun AsyncRendering özelliğini false yapmış olmamdan kaynaklandığını gördük :) O kadar çok oynamıştım ki ayarlarla öyle bir şeyi değiştirdiğimi dahi hatırlamıyorum..
Yani nadir olur ama eğer asp.net te bir sayfada rapor çalıştırırken ilk yüklemede scroll çıkıp diğer yüklemelerinizde scroll çıkmıyorsa muhtemelen bu raporun asenkron çalışmamasından kaynaklanıyordur. Önce sayfayı getirip sonra raporu hazırladığı için oluyormuş.. Demek ki neymiş,, AsyncRendering = True imiş..

Rapora Sadece Print Modunda Görünen Alanlar Eklemek

VS2008 de raporlarla uğraşırken parametreleri sadece çıktı alırken yazdırma ihtiyacı doğdu. Bu ihtiyaç sonucu müdürümle RenderFormat.IsInteractive özelliğinin yazıcı modunda farklı değer döndürdüğünü keşfedip kullandık ve oldu :)
Şöyle yaptık= Göstermek istediğimiz alanlara Expression ekleyerek içlerine

=IIF(Globals!RenderFormat.IsInteractive,"","Rapor Tarihi: ")     ya da eğer bu alanları Rectagle içine alırsak Visibility özelliğine
=IIF(Globals!RenderFormat.IsInteractive,True,False)

gibi bir kontrol ekledik. Bu kontrole göre Globals!RenderFormat.IsInteractive yazıcıda false; çalışırken true değeri döndürüyor. Hal böyleyken Yazıcı modunda görünüp ekranda görünmez oldu :)

Öyle işte ..