Adam ne güzel anlatmış:
Sql Server Kısıtlamaları
VS.NET Kısa Yolları
Bu kadar çok kısa yol var mıymış? Peh peh peh…
http://www.dofactory.com/ShortCutKeys/ShortCutKeys.aspx#general
T-SQL “Divide By Zero” Hatasını Engellemek
SQL Server’da bir sorgumda Alan1/Alan2 gibi bir değer kullanmak zorundaydım.
Ancak Alan2 “0″ değeri aldığı zaman “divide by zero” hatası alıyordum. İsteğim bu gibi durumda eşitliğin değerinin “0″ olması idi.
Ayrıca Alan2 null değeri alırsa da eşitliğin null yerine “0″ olmasını istiyordum.
Çözümü internette buldum, belki de sizin de ilginizi çeker:
ISNULL(Alan1/NULLIF(Alan2,0),0)
Hex Renk Kodundan .Net Color oluşturmak
string hexRenkKod = “#B9FFA0″;
System.Drawing.Color renk = System.Drawing.ColorTranslator.FromHtml(hexRenkKod);
DayPilot Schedule Component
Open source, kullanımı kolay olan güzel bir schedule component’i.
Pro (paralı :)) versiyonu oldukça gelişmiş ama lite versiyon da oldukça iş görüyor.
İndirmek için:
Web Servisindeki Metodu URL’den Çağırmak
Bir web servisini referans alıp, metodu oradan çağırmak yerine direk http://www.webservisim.com/service1.asmx/MyMethod?Id=22&Ad=Yalco şeklinde url’den çağırmak için yapılması gereken şey web.config’te system.web düğümünün altına aşağıdaki satırları eklemek olacaktır. Bu yöntem özellikle excel’den veri çekerken çok işe yarıyor.
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
Internet’le ilgili işlerde Default WebProxy ile çalışmak
Sadece bir satır kod:
WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultCredentials;
Alacakaranlık Kuşağı : SessionID
Dün bir problemle uğraşırken çok ilginç bir şey keşfettim ve bunu paylaşmak istedim.
Konu SessionID ve global.asax hakkında.
Bunu bir örnek üzerinden anlatmak isterim:
Önce Default.aspx’e bir adet HyperLink kontrolü atalım. Maksat, bu linkten Open In New Browser diyerek test edeceğimiz sayfadan birden fazla açmak. Böylelikle aynı session’a sahip birden fazla sayfaya sahip olabileceğiz.
Şöyle bir kod yeterli olacaktır.
<%@ Page Language=”C#” AutoEventWireup=”true” CodeFile=”Default.aspx.cs” Inherits=”_Default” %>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head runat=”server”>
<title>Untitled Page</title>
</head>
<body>
<form id=”form1″ runat=”server”>
<div>
<asp:HyperLink ID=”HyperLink1″ runat=”server” NavigateUrl=”~/Default2.aspx”>Test Sayfam</asp:HyperLink>
</div>
</form></body>
</html>
Daha sonra ikinci sayfamıza (Default2.aspx) gelelim ve sonra form load’a session Id’yi gösteren bir kod yazalım.
<%@ Page Language=”C#” AutoEventWireup=”true” %>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<script runat=”server”>
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(Session.SessionID);
}
</script>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head runat=”server”>
<title>Untitled Page</title>
</head>
<body>
<form id=”form1″ runat=”server”>
<div>
</div>
</form>
</body>
</html>
Projemizi çalıştırdığımızda çok ilginç bir şeyle karşılaşıyoruz. Default.aspx’te Link üzerinden Open In New Tab dediğimizde her sayfanın farklı bir session Id’yle açıldığını görüyoruz.

Uğraştığım problemin çözümü için hayati önemli bir durumdu bu. Kafayı yiyerek İki tane çözüm buldum:
Birincisi bir sayfanın herhangi bir yerinde session’a bir değer atarsam problem kendiliğinden çözülüyordu. Şöyle ki (Default.aspx’te)
<%@ Page Language=”C#” AutoEventWireup=”true” %>
<script runat=”server”>
protected void Page_Load(object sender, EventArgs e)
{
//Ne yazdığınızın hiç bir önemi yok
Session["Hede"] = “hödö”;
}
</script>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head runat=”server”>
<title>Untitled Page</title>
</head>
<body>
<form id=”form1″ runat=”server”>
<div>
<asp:HyperLink ID=”HyperLink1″ runat=”server” NavigateUrl=”~/Default2.aspx”>Test Sayfam</asp:HyperLink>
</div>
</form>
</body>
</html>

Burası çalıştıktan sonra tüm sayfalarım aynı session ID’yi verdi. Ancak bu yine bir çözüm değildi. Kullanıcı bu sayfaya uğramadan direk sessionID’nin kullanıldığı sayfaya (yani Default2.aspx’e) erişebilirdi.
Hal böyle olunca ben de Global.asax kullanmaya karar verdim ve oldukça ilginç bir şey keşfettim:
Projeye Global.asax ekleyince hiç bir şey yapmasınız bile Session Id’ler doğru çalışıyor.
Acaba bu sadece Visual Studio’nun web server’ındaki bir sorun mu diye düşündüm ve projeyi IIS’te test ettim ve farkettim ki IIS de aynı şekilde davranıyor.
Buradan çıkardığım sonuç şu:
�
Eğer SessionID kullanacaksanız, projenizde mutlaka Global.asax kullanın, yoksa sürprizlere uğraşmak zorunda kalabilirsiniz.
İlginç !
Bir SQL Cursor Alternatifi : Temp Tablolar
–Dolaşılacak tabloyla ilgili bilgileri atmak için önce bir temp tablo oluşturulur.
CREATE
TABLE #OgrencilerTemp
(
KayitNo int
IDENTITY(1, 1),
OgrenciID int
)
–İlgili bilgiler temp tabloya insert select yardımıyla atılır.
INSERT
INTO #OgrencilerTemp
SELECT OgrenciID
FROM Ogrenciler
–Koyatıları dönmek için kullanılacak değişkenler
declare @KayitSayisi int
declare @KayitNo int
–Başlangıç verileri set edilir.
SET @KayitSayisi =
@@ROWCOUNT
SET @KayitNo = 1
–Kullanılacak bilgiler değişkenlere aktarılır.
–Örnekte sadece 1 tane kullandım.
declare @OgrenciID int
–Tek tek kayıtlar dönmeye başlanır
WHILE @KayitNo <= @KayitSayisi
BEGIN
–İlgili veriler değişlenlere aktarılır
select @OgrenciID=OgrenciID from #OgrencilerTemp where KayitNo=@KayitNo
–Bilgi nerede kullanılacaksa kullanılır.
exec spBirseylerYap @KayitNo
–Sayac’ı 1 arttırır.
Set @KayitNo=@KayitNo+1
END
–Temp tablo silinir.
DROP
TABLE #OgrencilerTemp
SQL Dependency
İki de bir unutup durduğum bir şey olduğu için buraya yazayım dedim. En azından her seferinde makale okumak zorunda kalmam.
Aktif hale getirmek için:
ALTER DATABASE Database SET ENABLE_BROKER
C# kodları: (Unutulmaması gereken şey sorguda mutlaka sütun adları kullanılmalı ve from kısmı FQN (dbo.Hede) olmalı)
Global değişkenler:
SqlConnection con = new
SqlConnection(“server=.;database=Northwind;trusted_connection=true”);
SqlCommand com;
SqlDependency dep;
SqlDataAdapter da;
DataTable dt;
private
void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
VeriCek();
}
void VeriCek()
{
com = new
SqlCommand(“select ogrenciId,ogrenciAd,OgrenciSoyad from dbo.ogrenciler”, con);
dep = new
SqlDependency(com);
dep.OnChange += new
OnChangeEventHandler(dep_OnChange);
SqlDependency.Start(con.ConnectionString);
da = new
SqlDataAdapter(com);
dt = new
DataTable();
da.Fill(dt);
dgVeriler.DataSource = dt;
}
void dep_OnChange(object sender, SqlNotificationEventArgs e)
{
VeriCek();
}