SQL etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
SQL etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

SqlDataSource: Getting @@Identity after Insert

14 Temmuz 2011

Yesterday I was developing a simple form using a SqlDataSource to INSERT or UPDATE when saving the form. The form consisted of a few controls and a button. In the case of a new item, on clicking the save button I am executing SqlDataSource1.Insert(). For an existing item, I’m using an “ID” parameter on the query string which in turn is used by the UPDATE command. So I need the ID of the row I’ve just inserted to allow the user to update the form. I should mention my table has a column called “ID” of type int which is specified as the auto-incrementing identity column.

I put together the form in less than 30 minutes and then spent twice that time trying to find the solution you are reading now. I was sorely tempted to ditch the DataSource as this is straightforward when you’re executing your SQL commands directly in the code-behind. But I was curious and persevered until I found the answer:

Firstly, let me describe how to set up the DataSource to do the insert. The InsertCommandType is “Text”. For the InsertQuery click the button to open the Command and Parameter dialog. Use the query builder, if you like, to create your insert statement. After the insert statement append “SET @Identity = @@Identity;” so our insert command looks something like this:

INSERT INTO TestTable (TestCol) VALUES (@TestValue); SET @Identity = @@Identity;

The statement above has 2 parameters. One is TestValue we’re setting in to TestCol. The other is Identity which will be the ID of the column we insert. Click Add Parameter and type “TestValue”, Parameter source is control, and ControlID is a textbox. Add another parameter called “Identity”. This time click Show Advanced Properties, set Direction to “Output” and Type to “int” (leaving Parameter source as “None”).

Now the trick is catching the DataSource at the right time so that our output parameter will have a value. Don’t mistake the DataSource.InputParameters as the place to look as this merely describes the parameters we’ve configured above. To actually see the parameters after execution you need to catch the OnInsertedevent. Here we have SqlDataSourceStatusEventArgs which contains the command and its parameters after the command has executed.

protected void SqlDataSource1_Inserted(object sender, SqlDataSourceStatusEventArgs e)

{

//Read the value of the @Identity OUTPUT parameter

string sID = e.Command.Parameters["@Identity"].Value.ToString();

//Display new ID

Label1.Text = sID;

}

So with the ID known I can now redirect the user to "page.aspx?ID=" + sID such that they may update the form.


Alıntıdır...

FETCH (Transact-SQL) SQL Server 2008

25 Mart 2011

Retrieves a specific row from a Transact-SQL server cursor.
Topic link iconTransact-SQL Syntax Conventions

FETCH 
          [ [ NEXT | PRIOR | FIRST | LAST 
                    | ABSOLUTE { n | @nvar } 
                    | RELATIVE { n | @nvar } 
               ] 
               FROM 
          ] 
{ { [ GLOBAL ] cursor_name } | @cursor_variable_name } 
[ INTO @variable_name [ ,...n ] ] 

NEXT

Returns the result row immediately following the current row and increments the current row to the row returned. If FETCH NEXT is the first fetch against a cursor, it returns the first row in the result set. NEXT is the default cursor fetch option.
PRIOR
Returns the result row immediately preceding the current row, and decrements the current row to the row returned. If FETCH PRIOR is the first fetch against a cursor, no row is returned and the cursor is left positioned before the first row.
FIRST
Returns the first row in the cursor and makes it the current row.
LAST
Returns the last row in the cursor and makes it the current row.
ABSOLUTE { n| @nvar}
If n or @nvar is positive, returns the row n rows from the front of the cursor and makes the returned row the new current row. If n or @nvar is negative, returns the row n rows before the end of the cursor and makes the returned row the new current row. If n or @nvar is 0, no rows are returned. n must be an integer constant and @nvar must be smallint, tinyint, orint.
RELATIVE { n| @nvar}
If n or @nvar is positive, returns the row n rows beyond the current row and makes the returned row the new current row. If n or @nvar is negative, returns the row n rows prior to the current row and makes the returned row the new current row. If n or @nvar is 0, returns the current row. If FETCH RELATIVE is specified with n or @nvar set to negative numbers or 0 on the first fetch done against a cursor, no rows are returned. n must be an integer constant and @nvar must be smallint, tinyint, orint.
GLOBAL
Specifies that cursor_name refers to a global cursor.
cursor_name
Is the name of the open cursor from which the fetch should be made. If both a global and a local cursor exist with cursor_name as their name, cursor_name to the global cursor if GLOBAL is specified and to the local cursor if GLOBAL is not specified.
@ cursor_variable_name
Is the name of a cursor variable referencing the open cursor from which the fetch should be made.
INTO @variable_name[ ,...n]
Allows data from the columns of a fetch to be placed into local variables. Each variable in the list, from left to right, is associated with the corresponding column in the cursor result set. The data type of each variable must either match or be a supported implicit conversion of the data type of the corresponding result set column. The number of variables must match the number of columns in the cursor select list.
If the SCROLL option is not specified in an ISO style DECLARE CURSOR statement, NEXT is the only FETCH option supported. If SCROLL is specified in an ISO style DECLARE CURSOR, all FETCH options are supported.
When the Transact-SQL DECLARE cursor extensions are used, these rules apply:
  • If either FORWARD_ONLY or FAST_FORWARD is specified, NEXT is the only FETCH option supported.
  • If DYNAMIC, FORWARD_ONLY or FAST_FORWARD are not specified, and one of KEYSET, STATIC, or SCROLL are specified, all FETCH options are supported.
  • DYNAMIC SCROLL cursors support all the FETCH options except ABSOLUTE.
The @@FETCH_STATUS function reports the status of the last FETCH statement. The same information is recorded in the fetch_status column in the cursor returned by sp_describe_cursor. This status information should be used to determine the validity of the data returned by a FETCH statement prior to attempting any operation against that data. For more information, see @@FETCH_STATUS (Transact-SQL).
FETCH permissions default to any valid user.

A.Using FETCH in a simple cursor

The following example declares a simple cursor for the rows in the Person.Contact table with a last name that starts with B, and uses FETCH NEXT to step through the rows. The FETCH statements return the value for the column specified in DECLARE CURSOR as a single-row result set.

USE AdventureWorks
GO
DECLARE contact_cursor CURSOR FOR
SELECT LastName FROM Person.Contact
WHERE LastName LIKE 'B%'
ORDER BY LastName

OPEN contact_cursor

-- Perform the first fetch.
FETCH NEXT FROM contact_cursor

-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN
   -- This is executed as long as the previous fetch succeeds.
   FETCH NEXT FROM contact_cursor
END

CLOSE contact_cursor
DEALLOCATE contact_cursor
GO

B.Using FETCH to store values in variables

The following example is similar to example A, except the output of the FETCH statements is stored in local variables instead of being returned directly to the client. The PRINT statement combines the variables into a single string and returns them to the client.

USE AdventureWorks
GO
-- Declare the variables to store the values returned by FETCH.
DECLARE @LastName varchar(50), @FirstName varchar(50)

DECLARE contact_cursor CURSOR FOR
SELECT LastName, FirstName FROM Person.Contact
WHERE LastName LIKE 'B%'
ORDER BY LastName, FirstName

OPEN contact_cursor

-- Perform the first fetch and store the values in variables.
-- Note: The variables are in the same order as the columns
-- in the SELECT statement. 

FETCH NEXT FROM contact_cursor
INTO @LastName, @FirstName

-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN

   -- Concatenate and display the current values in the variables.
   PRINT 'Contact Name: ' + @FirstName + ' ' +  @LastName

   -- This is executed as long as the previous fetch succeeds.
   FETCH NEXT FROM contact_cursor
   INTO @LastName, @FirstName
END

CLOSE contact_cursor
DEALLOCATE contact_cursor
GO

C.Declaring a SCROLL cursor and using the other FETCH options

The following example creates a SCROLL cursor to allow full scrolling capabilities through the LAST, PRIOR, RELATIVE, and ABSOLUTE options.

USE AdventureWorks
GO
-- Execute the SELECT statement alone to show the 
-- full result set that is used by the cursor.
SELECT LastName, FirstName FROM Person.Contact
ORDER BY LastName, FirstName

-- Declare the cursor.
DECLARE contact_cursor SCROLL CURSOR FOR
SELECT LastName, FirstName FROM Person.Contact
ORDER BY LastName, FirstName

OPEN contact_cursor

-- Fetch the last row in the cursor.
FETCH LAST FROM contact_cursor

-- Fetch the row immediately prior to the current row in the cursor.
FETCH PRIOR FROM contact_cursor

-- Fetch the second row in the cursor.
FETCH ABSOLUTE 2 FROM contact_cursor

-- Fetch the row that is three rows after the current row.
FETCH RELATIVE 3 FROM contact_cursor

-- Fetch the row that is two rows prior to the current row.
FETCH RELATIVE -2 FROM contact_cursor

CLOSE contact_cursor
DEALLOCATE contact_cursor
GO

SQL SERVER’DA VERİLERİ SAYFALAMAK

by Halil İbrahim ARAÇ 27. Eylül 2009 21:57
 
Veritabanından gelen verileri listelediğiniz bir örnekte eğer gelen veri sayısı çok fazla ise sayfalama yapmanız gerekir. Aksi halde 10000 kayıtlık bir veri yığınını veritabanından bir seferde çekerek  DataGrid ile göstermeye çalıştığınızda bu sayfanın yüklenme süresi çok uzun olacaktır.
Bazılarımızın aklına şöyle bir soru gelebilir. Ben GridView’in sayfalama özelliğini etkinleştiririm ve her sayfada 10 kayıt görüntülerim. Bu sayede sayfanın yoğunluğunu azaltırım. Bu çoğu kişinin düştüğü bir yanlışlıktır. Çünkü GridView’in sayfalamasını etkinleştirseniz bile tüm veri veritabanından çekilecektir. Peki o halde tüm veri Grid’ e bağlandığı halde GridView sayfalamayı nasıl gerçekleştiriyor da sizin istediğiniz sayfa numarası aralığındaki veriyi görüntüleyebiliyor?
Siz GridView’e veriyi bağlandığınızda bağlanan tüm veri sayfa içerisinde Viewstate içerisinde saklanıyor ve başka bir sayfa için Grid’in sayfa numarasına tıkladığınızda ViewState PostBack ile sayfaya taşınıyor ve bu veri içerisinde istediğiniz aralıkta yer alan kayıt yığını görüntülenebiliyor.
Ancak bu 10000 verilik bir kayıt seti için bu 10000 satırın sayfa her pospback edildiğinde Viewstate ile taşınması demektir. Çünkü sizin tüm kayıtları çekmek için veritabanından yaptığınız SQL sorgulaması muhtemelen “select * from Sozler” şeklinde bir sorgudur ve bu sorgunun sonucunda da pek tabii Sozler tablosunda yer alan tüm sözler getirilecektir. Eğer Sozler tablosunda yer alan tüm kayıtları değil de bizim belirlediğimiz aralıktaki (örneğin 20 ve 30. kayıt arasındaki tüm kayıtlar) kayıtları getirebilirsek çok daha kullanışlı bir sorgu yazabilmiş oluruz ve o zaman yukarıda bahsettiğimiz Grid sayfalama problemini de çözebiliriz.
Aslında yukarıdaki satırları yazarken aklıma MySql veritabanı üzerinde sorgu yazdığım günler geldi. MySql sorgularında tam bu ihtiyacımızı karşılayabilen bir sorgu ifadesi mevcuttu. O da LIMIT komutuydu. Kullandığımız veritabanı yönetim sistemi MySql olsaydı  Sozler tablosunda yer alan kayıtların 1 ve 5. kayıtlar arasındaki verileri çekmek için “select * from Sozler orderby SozID LIMIT 1,5” sorgusunu kullanmamız yeterli olurdu. 5 ve 10. kayıtlar arasındaki verileri getirmek için “select * from Sozler orderby SozID LIMIT 5,10” ifadesi yeterli olacaktı. Gördüğünüz gibi MySql’de bu sorun çok kolay bir şekilde aşılabiliyordu. Size düşen sayfanın her postback olduğunda hangi sayfanın talep edildiğini öğrenmek ve bu LIMIT ifadesine sayfa numarasına bağlı olarak değişen bir değişkeni bağlayarak Grid’e bu sql ifadesin sonucunda gelen veriyi bağlamaktır.
Böyle bir ifadenin Sql Server’da karşılığının olmaması çok garip olurdu. Evet garip olurdu diyorum çünkü SqlServer da birçok kullanıcının yoğun olarak kullandığı bir veritabanı yönetim sistemidir.Geçenlerde bu konu üzerine araştırma yaparken bu işin Sql Server’da nasıl yapılacağı üzerine makaleler okuyordum ve ilginç bir SqlServer ifadesi buldum. Bu makalemde sizinle onu paylaşmak istedim. Örneğimde kullanacağım veritabanım SozlerDB isimli veritabanı olacak. Bu veritabanı Asenkron Web Servisi Çağrılması üzerine yazmış olduğum makalemde yer alan veritabanıdır.  Bu veritabanımın içerisinde Sozler isimli bir tablom var ve içerisinde özlü sözler kaydedilmiş durumda. Tablomun görüntüsü aşağıdaki gibidir.

RowNumber

Bize sayfalama imkanı sunan fonksiyonumuz ROW_NUMBER() isimli fonksiyondur. Bu fonksiyon her bir kaydın kaçıncı satırda olduğunu veren bir fonksiyondur. Örneğin her bir kaydın satır numarasını veren bir sorgu yazalım.

select ROW_NUMBER() OVER(ORDER BY SozID) AS RowNumber,* from Sozler

Sorguyu çalıştırdığımızda aşağıdaki çıktıyı elde ederiz.

Sql Server Sayfalama

Bu ekran görüntüsünden aslında ROW_NUMBER() fonksiyonun ne iş yaptığını anlamışsınızdır. Bu fonksiyon OVER ifadesi ile beraber çalışır ve OVER ile sıralamanın esas alınacağı kolonu belirtmeniz gerekir. Yukarıdaki sorguyu eğer aşağıdaki gibi yazarsak sonuç çok daha farklı olacaktır.


select ROW_NUMBER() OVER(ORDER BY SozID desc) AS RowNumber,* from Sozler

Sorgu sonucu aşağıdaki gibi olacaktır.

ROW_NUMBER()

Bu sefer OVER ifadesinde ID’ler tersten sıralandığı için satır numaraları da bu sıraya göre verilmiştir. İşte biz belirli bir aralıkta yer alan verileri sıralamak için bu RowNumber isimli kullanmaya çalışağız. Yani 3 ve 8. kayıtlar arasını getirebilmek için RowNumber kolonunun değeri 3 ve 5 arasında olanlar şeklinde bir şart koyacağız.
Daha esnek olması için biz bu değerleri dışarıdan parametre olarak alan bir prosedür yazmaya çalışalım.

CREATE proc [dbo].[VERIGETIR]
(
@bas int,
@son int
)
as
begin

with kayitseti as
(
      select ROW_NUMBER() OVER(ORDER BY SozID) AS 'RowNumber',* from Sozler
)

select * from kayitseti where RowNumber between @bas and @son

end

Bu prosedürü aşağıdaki değerlerle çalıştırdığınızda

exec VERIGETIR 3,8

Aşağıdaki sonucu elde edeceğiz.

OVER

Bu prosedürde önce RowNumber kolonunu içeren bir kayıtseti oluşturulmuş ve daha sonra bu kayıt seti içerisinde istediğimiz aralığı sorgulayan bir select ifadesi kullanılmıştır. Burada kayitseti dediğimiz veri kümesini aslında temp bir tablo gibi düşünebilirsiniz.
Yukarıdaki prosedürü aşağıdaki gibi de yazabilirsiniz.

ALTER proc [dbo].[VERIGETIR]
(
@bas int,
@son int
)
as
begin

select * from(SELECT ROW_NUMBER() OVER(ORDER BY SozID) AS RowNumber,* FROM Sozler) as kayitseti
where RowNumber between @bas and @son

end

Gene 3 ve 8 değerleri ile prosedürü çalıştırdığınızda aynı sonucu elde edeceksiniz. Bu sefer RowNumber kolonunu da içeren tüm veri kümesi as ifadesi ile bir kayıt seti olarak elde edilmiştir.
Böylece MySql’de yer alan LIMIT ifadesini karşılayacak bir prosedür yazmış olduk. Böylece bu prosedürü kullanarak verileri çeken bir Grid uygulamasında tüm veriyi değilde görüntülenecek olan sayfaya ait verileri veritabanından çekersiniz ki bu da ciddi bir performans artışı sağlayacaktır.
Bu makalemizin sonuna geldik. Başka makalelerde buluşmak dileğiyle hepinize iyi çalışmalar.

Örnek veritabanını indirmek için tıklayınız.(SozlerDB.bak (2,91 mb))

SQL Server 2008 de Otomatik BackUp için Job Oluşturma (Schedule)

15 Nisan 2010

SQL Server üzerinde bulunan Job (Schedule) mantığıyla bir çok işi otomatik olarak SQL Server a yaptırmak mümkün. Bu işlemlerden biride otomatik yedek aldırma. Örneğin bir job tasarlayıp her akşam gece 12.00 da database veya databaselerin yedeğini aldırabiliriz.

Örneğin, SQL Server 2008 üzerinde AdventureWorks databasenin otomatik yedeğini almak için bir job tasarlayalım.

Management Studio >> SQL Server Agent >> Jobs kısmına gelip sağ tık ile New job a geçelim.

sc1

General kısmında Name ve istediğiniz bir category i seçtikten sonra Steps kısmına geçiniz.

sc2

Steps kısmında bu job için uygulanacak adımlar tanımlanmaktadır. Yani burda birden fazla database in yedeklenmesini farklı adımlar olarak tanımlayabiliriz. Biz bu örneğimiz için sadece tek adım yani AdventureWorks ün yedeklenmesini tanımlayacağız.

Bunun için New butonuna basalım.

sc3

Resimde görüldüğü gibi alanları dolduralım. Command kısmında yazan yazı BackUp alma işlemini gerçekleştirecek T-SQL komutudur.

1 BACKUP DATABASE [AdventureWorks]
2 TO DISK = N'c:\\AdventureWorks.bak'

Gerekli alanların tamamını resimdeki gibi doldurduktan sonra OK e basıp arka ekranda Schedules kısmına gelelim.

sc4

Schedules bölümü job un hangi otomatik süreyle işleneceğinin belirleneceği bölümdür. Resimde de görmüş olduğunuz üzere günlük,haftalık,aylık istediğimiz gibi ayarlama yapabilmekteyiz. Biz bu örneğimizde sonucu hızlıca alabilmek açısından dakikada 1 seçeneğini ayarlıyoruz.

Resimde görüldüğü gibi alanları doldurduktan sonra OK e basıp arka ekranda Notifications kısmına geçelim.

sc5

Notifications kısmı, job görevini tamamladıktan sonra ilgili kişilere bilgi vermelerin ayarlandığı bölümdür. Ben bu örnek için işlem tamamlandığımda kendimi mail attırıyorum. Bu arada SQL Server 2008 de Mail Gönderme işlemi ile alakalı yazdığım yazıyı okumadıysanız okumanızı tavsiye ederim. Buradan erişebilirsiniz.

Notification larıda ayarladıktan sonra OK e basıyoruz. Job görevini almış durumda.:)

Bu arada ek bir bilgi vermek istiyorum. Bu jobların çalışabilmesi için SQL Server Agent in çalışır durumda olması gerekiyor. Bu bilgide aklınızda bulunsun.

Şimdi 3-4 dk kadar bekleyelim. Bu bekleme sırasında 3-4 defa BackUp işlemi gerçekleşecek ve mailler de mail kutumuza düşecektir.

Evet yeteri kadar bekledik. Mailimizi kontrol ettiğimizde BackUp Complete maillerinin gelmiş olduğunu görüyoruz.

sc6

sc7

Birde management studio üzerinde ki job un history sine bakalım. Bunun için Management Studio >> SQL Server Agent >> Jobs >> JobumuzunAdi kısmından sağ tık ile View History kısmını açalım.

sc8

Bu ekranda, oluşturduğumuz job un bütün tamamlanmış step history sine bakabilirsiniz.

Aklınıza takılan bir şey olursa yorum kısmından sorabilirsiniz.

İyi çalışmalar

Turgay Sahtiyan


...alıntıdır...

CASE SENSITIVE VERİTABANINDA ARAMA

31 Aralık 2009

SELECT ad, soyad
FROM b_KisiBilgileri
WHERE (UPPER(soyad) LIKE N'KENAR')


ya da

SELECT ad, soyad
FROM b_KisiBilgileri
WHERE (lower(soyad) LIKE N'kenar')

ilk sorguda db den gelen değerleri büyük harflere çevirip büyük harfli arama yapıyoruz.
ikinci sorguda da gelen değerleri küçük harflerle alıp, küçük harfli sorgu yapıyoruz.

Database diagram support objects cannot be installed...

07 Aralık 2009

EXEC sp_dbcmptlevel 'benimDB', '90';
go
ALTER AUTHORIZATION ON DATABASE:: benimDB TO "sa"
go
use [benimDB]
go
EXECUTE AS USER = N'dbo' REVERT
go

Basit Trigger Örnekleri

31 Temmuz 2009

-- Kullanıcının tablo üzerinde güncelleme yaptığında
-- değişiklik tarihi kolonunun otomatik olarak
-- güncelleme yapıldığı tarihi alınmasının sağlanması
-- için yazılan update trigger örneği

Örnek Tablo kolonları:
KisiID, ZiyaretID,DegisiklikTarihi

CREATE TRIGGER trigger_Guncellendi
ON Kisiler
for UPDATE
as

declare @id int
select @id = ziyaretID  from deleted -- güncelleme için kayıt önce deleted (silinenler)
                                                          -- tablosuna gönderilir
ardından da kayıt insert edilir

UPDATE Kisiler
SET degisiklikTarihi = getdate() --güncelleme yapıldığı tarihi db ye eklemiş olduk
WHERE ziyaretID=@id



--Kullanıcının birden fazla kayıt silmesini engellemek için yazılan bir delete trigger örneği


CREATE TRIGGER trigger_Silindi --Trigger adı
ON Kisiler --İlgili Tablo
for DELETE --Oluşturulacak trigger türü
as
declare @sayi int
select @sayi = count(*) from deleted --Silme işlemi için deleted (Silinmişler)
--tablosuna
gönderilen kayıt sayısı
if @sayi>1
begin
rollback transaction
end

Sql Datetime Formatlama

09 Haziran 2009



Basit Store Prosedure Örnekleri

16 Şubat 2008

Arkadaşlar bu yazıda size Basit Store Prosedure Örnekleri göstereceğim. Örnek tablomuz aşağıdaki resimdeki gibidir.



Tüm masaları Listeleyelim

create proc [dbo].[sp_masalar_listele]
as
select
*
from tbl_Masalar


ID ye göre masa Listeleyelim

create proc [dbo].[sp_masa_byid]
(
@id int
)
as
select
MasaID,MasaNo,MasaDurum,MasaNotu
from A.tbl_Masalar(NOLOCK)
WHERE A.MasaID=@id


Masa Silelim

create proc [dbo].[sp_masa_sil]
(
@masaID int
)
as
delete
from tbl_Masalar
where MasaID=@masaID


Masa Ekleyelim

create proc [dbo].[sp_masa_ekle]
(
@masaID int output,
@masaNo int,
@masaDurum int,
@masaNotu nvarchar(50)
)
as
insert into
tbl_Masalar
values(@masaNo,@masaDurum,@masaNotu)
set @masaID=@@identity


Masa Güncelleyelim

create proc [dbo].[sp_masa_guncelle]
(
@masaID int output,
@masaNo int,
@masaDurum int,
@masaNotu nvarchar(50)
)
as
update
tbl_Masalar
set
MasaNo=@masaId,
MasaDurum=@masaDurum,
MasaNotu=@masaNotu
where MasaID=@masaID


İyi Çalışmalar...

DataList de QueryString ile Alfabetik Sayfalama

18 Aralık 2007


Bu makalemizde DataList kontrolünde alfabetik sayfalama yapacağız. Gridview da wizardlarla verileri çektiğimiz zaman bize sayfalama özelliğinide sağlıyor fakat datalistte verileri wizardlarla bile çeksek bize sayfalama özelliğini kendisi vermiyor. Bazen verileri göstermek için datalist kontrolünü kullanmamız gerekebilir, ve bu durumda bir sayfada ya 1000 tane kaydı bir anda göstereceğiz ki bu hiç tavsiye edilmez yada alfabetik veya numeric olarak sayfalamak için kodlarımızı kendimiz yazacağız.

Biz bu makalemizde alfabetik sayfalama yapacağız. Bunun için alfabetik linklerimizi oluşturacağız ve linke tıklandığında seçilen harfle başlayan kayıtları getirebilecek metodumuzu yazacağız.
İlk olarak DataListin içini doldurmak için metodumuzu yazıyoruz.




Kayıtlarımızın datalist kontrolünde görünmesi için html kodlarımızı da yazıyoruz.



Seçilen harfle başlayan kayıtların getirilmesi için çağrılacak metod.




Datalist in footer template kısmına harfleri seçebilmek için alfabetik linklerimizi oluşturuyoruz.



Link olarak hyperlink kontrolünü kullanacağız, ve hangi harfi seçerse o harfi yine aynı sayfaya querystring le gönderiyoruz.



Sayfamız ilk çalıştırıldığında bütün kayıtları listeliyoruz.
Eğer linke tıklanılıp çağrılmışsa zaten seçilen harfi querystringle gönderip metotta parametre olarak alıyoruz.



Şimdi herhangi bir harfi seçelim.



Böylelikle bir makalemizin daha sonuna geldik. Bir başka makalemizde görüşmek dileğiyle.

Alıntıdır - Yazar: Veysi Sala

SQL Injection - Injection Flaws

Injection Flaws

Dinamik SQL sorgularının kullanıldığı sistemlerde oluşabilecek bir açıktır.

Bir kullanıcı adı parola sınaması yapılan SQL cümleciğinde kullanılabilir.

Select MemberID
From Member
Where Username = '"
+ txtUsername.Text + "' and Password = '" + txtPassword.Text + "'"

Şeklinde bir SQL cümlesinin kullanıldığı bir sistemde aşağıdaki ifadeleri girelim

txtUsername.Text : ' or 1=1 --
txtPassword.Text : 123

ifadesi aşağıdaki SQL cümlesinin çalıştırılmasını sağlar

Select MemberID
From Member
Where Username = ' ' or 1=1
-- ' and Password = '" + txtPassword.Text + "'"
-- ifadesi SQL Server için yorum satırı anlamına geldi için çalıştırılmaz.

Where ifadesini inceleyelim :

Username = ' ' false döner, 1 = 1 ise true. Or karşılaştırmasında ise False or True’nun sonucu true’dur. Dolayısıyla doğru kullanıcı adı parola girilmese dahi geriye tüm kayıtlar döner ve saldırgan ilk kaydın yetkisi ile içeriye giriş yapmış olur.

Saldırgan “SQL Injection” yöntemi ile veritabanı hakkında daha detaylı bilgi edinebilir. SQL Server üzerinde System Administrator hesabı açabilir, Tüm Tabloların listesini ve bu tabolardaki bilgilere ulaşabilir. Hatta web uygulaması sa yetkisine sahip bir kullanıcı ile çalıştırılıyorsa xp_cmdshell ‘format C:’ ile sisteme format bile atabilir.


Dinamik SQL sorgularındaki bu içeri sızmaları engellemenin yolu parametre kullanmaktır.

Bunu SqlCommand nesnesine SqlParameter tipinde parametre ekleyerek yapabiliriz.

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "[ ConnectionString ]";
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = " Select MemberID"
+ " From Member"
+ " Where Username = @username and Password = @password";
cmd.Parameters.AddWithValue("@username",txtUsername.Text);
cmd.Parameters.AddWithValue ("@password",txtPassword.Text);
conn.Open();
int MembetID = Convert.ToInst32(cmd.ExecuteScalar());
conn.Close();

Bu şekilde kullandığımız dinamik SQL sorgularında Injection yönetimini bertaraf etmiş oluruz.



Kaynaklar

http://www.owasp.org/index.php/Top_10_2007-A2
http://www.spidynamics.com/papers/SQLInjectionWhitePaper.pdf
http://www.mutasyon.net/makaleoku.asp?id=728

Veritabanı Yönetim Sistemi ve SQL Komutları

30 Kasım 2007

Veritabanı Yönetim Sistemi ve SQL Komutları

Veritabanı Yönetim Sistemi ,aşağıdaki işlemlerden sorumludur;

• Bir veritabamndaki veriler arasında ilişkiler kurmak
• Verileri hatasız bir şekilde saklamak ve veriler arasında tanımlanan ilişkileri bozmamak
• Bir sistem hatası durumunda tüm verileri kurtarabilmek

Bu DERSTE temel Sql komutları ile veritabanını sorgulayarak veri alma, sıralama, çift kayıtları eleme, sonuçların formatlarıni değiştirme işlemlerinin nasıl yapıldığını yazmak istedim. sql hakkında fikir sahibi olanlar bu başlığı geçebilirler.

Sql ifadelerinin kullanımı :

Select ifadesini kullanmadan önce hangi veritabanı ve tablolar ile işlem yapacağımızı bilmeliyiz. Verilerle işlem yapmadan önce bazı komutlarla bu verilerin çekilmesi gerekmektedir. Bu komutlara sql ifadesi diyoruz. Select ifadesi ile seçmek istediğiniz kolon ve satırları belirtebilirsiniz.Select ifadesi veritabanından bilgi çekmek için kullanılır. Select ifadesi ile istediğiniz kolan ve satırları belirtebilirsiniz.

• Select ifadesi istenen satırları bir liste şeklinde verir.
• WHERE ifadesini kullanarak sorgunuzu fîltreleyebilir ve sadece sizin kriterlerinize uygun satırların sorgu sonucu olarak gelmesini sağlayabilirsiniz. Bu kriterler lojik ifadeler, karşılaştırmalar olabilir.
FROM ifadesi bu verilerin alınacağı tablo isimlerini belirtmemizi sağlar.

select *from ogrenciler
deyimi ile öğrenciler tablosundaki veriler getirilir.

Insert : Veritabanına Yeni bir Kayıt eklemek için kullanılır.

insert into ogrenciler(adi,Nosu) values (‘emrah’ ,’030202007’)
Şeklindeki bir ifade, isimler tablomuzun “adi” ve “Nosu” alanlarına yeni değerleri ekler.

Update : Veritabanındaki kayıtları güncellemek için kullanılır.Hangi kayıtların güncelleneceği,yine,bir koşul veya koşullarla belirtilebilir.

update ogrenciler set adi=’Emrah’ where Soyadi=’Aslan’
Şeklindeki bir ifade,soyadi “Aslan”olan kayıtların ad verisinin “Emrah” olarak değiştirir.

Delete : Adından da anlaşılacağı gibi tablodan kayıt silmek için kullanılan bir ifadedir.

delete from ogrenciler Where Soyadi=’Aslan’
İfadesi “soyadi” değerleri “Aslan” olan tüm kayıtlari siler.

Her Ne Kadar “WHERE” koşulu opsiyonel gözüküyorsa da, pratikte mutlaka kullanılması gerekir.

VERİ SÜZME

Zaman zaman ihtiyacınız olan verileri fıltrelemek isteyebilirsiniz. Verilerinizi Where ifadesinden sonra kullanacağınız bazı koşullar ile fütreleyebilirrsiniz. Bu koşullar şunlardır;

* Karşılaştırma operatörleri =, >, <, >=, <=, <>
* String karşılaştırmalar LIKE ve NOT LIKE
* Lojık operatörler AND, OR
* Lojik operatörler (Negatif) NOT
* Değer aralıkları BETWEEN ve NOT BETWEEN
* Değer listeleri IN ve NOT DM
* Bilinmeyen değerler IS NULL ve IS NOT NULL


Karşılaştırma operatörlerinin kullanımı:

Karşılaştırma operatörleri ile tablodaki bir veri ile belirlenmiş bir veri veya hesaplanmış veri karşılaştınlabilir. Fakat karşılaştırmak istediğiniz alan ve verinin tipleri aynı olmalıdır. Sayısal bir ifadeyi tarih ifadesi ile karşılaştıramazsınız. Burada kullanılan operatörler;

= Eşittir
> Büyüktür
< Küçüktür
>= Büyük veya eşittir
<= Küçük veya eşittir

Lojik operatörler :

Birden fazla kriterleri bir arada kullanmamıza yardımcı olurlar. AND operatörü kullandığımız takdirde verdiğimiz tüm koşullara uyan kayıtlar gelir. OR operatörü kullandığımız takdirde verdiğimiz koşullardan birine uyanlar gelir. NOT kullandığımızda ise NOT dan sonraki koşulu sağlamayan kayıtlar gelir. Birden fazla koşul kullandığımız durumlarda parantezi koşullan gruplamak için kullanabiliriz. Böylece daha okunaklı olur ve gruplama işlemini yapabiliriz.

Değer aralıkları:

BETWEEN ifadesini Where ile beraber kullanarak belli bir değer aralığmdaki kayıtlan getirebiliriz. Between ifadesi ile belirlenen aralık dışında kalan verileri almak için NOT BETWEEN kullanabiliriz. Between ifadesinde verilen aralığın bir bitiş noktası olmadır. Between ile verilen aralık (10 and 20) aslında AND ifadesi kullanılmı ve büyük eşittir, küçük eşittirden oluşan bir koşuldur. Bunu kısaca between ifadesi ile yapmaktayız.

Örneğin (KOD BETWEEN 10 AND 20) aslında ((KOD>=10) AND (KOD<=20)) demektir.

Bilinmeyen Değerler :

Veri girişi sırasında tablodaki kolona veri girilmemiş olabilir ve default veri de atanmamış olabilir. Bu durumda bu kolondaki değer NULL'dur. Null değer 0 (nümerik) veya boşluk (string) ile aynı şey değildir. Bir alana değer girilmemiş kayıtları listelemek isin IS NULL ifadesini kullanabiliriz. Null ifadesini diğer koşullar ile kullanamayız. Yani >Null diye bir şey diyemeyiz. Kolonlar Null değer içerebilir tanımını tablo yaratırken yapabiliriz.

SQL Server 2005 - A Developer's Guide

14 Ekim 2007


Developers will discover how to unleash the full power of Microsoft SQL Server 2005 with this developers guide by best-selling author, Michael Otey. Completely rewritten and reengineered, this book will focus on the new programming models and will provide readers with all the information they need to produce top-quality commercial applications.


Full Backup Alma (Resimli Anlatım)

30 Temmuz 2007

Yedeğini almak istediğiniz veri tabaının üzerine sağ tıklayarak açılan menüden Tasksı ordan da Backup seçeneğine tıklıyorsunuz. (Resim-01)


Resim-01

Daha sonra açılan pencereden yedekleme ayarlarını yapıyorsunuz. Biz bu örneğimizde Full backup alacağız, o yüzden backup type kısmından full ü seçeçeğiz. Destination kısmında veritabanımızı yedekleyeceğimiz yeri seçiyoruz. Listeye default olarak bir adres gelecek, eğer kayıt yapacağınız yer orası değil ise o uzantıyı seçtikten sonra remove ile kaldırıyorsunuz. Add butonuna basarak da yeni bir adres seçiyorsunuz.(Resim-02)


Resim-02

İşaterli butona tıklayarak yedeğinizi saklamak istediğiniz klasör adresini seçiyoruz.(Resim-03)

Resim-03
Yedeklemek istedşğniz klasörün adresini seçtikten sonra dikkat etmeniz gerek bir husus var. File Name kısmına yedeğinizin adını .bak uzuntılı olarak kaydetmelisiniz. Aksi takdirde backup (yedek) alınmamış olur. Resim-04 teki örnekte File Name i OrnekDB.bak olarak kaydettim.

Resim-04

OK butonuna tıkladıktan sonra Select Backup Destination penceresinde yeni klasör adresinin göründüğünü göreceksiniz.(Resim-05)

Resim-05

OK butonun tıkladığınızda karşınıza çıkan pencerede artık eklediğiniz kalör adresinin görünmesi gerekir. Yapacağınız başka ayar yoksa penceredeki ok butonuna tıklayın. (Resim-06)

Resim-06

Eğer backup başarılı ise onay esajı ile karşılaşacaksınız. (Resin-07)

Resim-07

Yedeklediğimiz veritabanının, belirlediğimiz klasör adresinde olup olmadığını kontrol edelim. (Resim-08). O adreste verdiğiniz isimde bir bak dosyası var ise yedek başarı ile alınmıştır demek.

Resim-08

Kolay gelsin.. Bir sonraki yazıda görüşmek üzere..

Yedekleme Methodları ve Dikkat Edilmesi gerekenler

29 Temmuz 2007

SQL Server, farklı bir çok yedekleme methodu sunmuştur.

A- Full Database Backup Yapma

Eğer veritabanı read-only ise, full database backups veri kaybını önlemek için yeterli olabilir. Full database backups alındığı zaman SQL Server:

1- Aktiviteleri yedekler.
2- Transaction log’daki onaylanmamış
transactionları yedekler.


Örnek: Aşağıdaki örnek; mantıksal ismi nwndbac olan permanent backup files’ı yaratır ve full database backups’ı icra eder.

USE master
EXEC sp_addumpdevice ‘disk’, ‘nwndbac’, ‘C:\MyBackupdir\Nwndbac.bak’
BACKUP DATABASE northwind TO nwndbac

Örnek: Aşağıdaki örnek; nwndbac dosyasına full database backups’ı yapar ve dosya üzerinde bulunan önceki yedeklerin üzerine yazar.

BACKUP DATABASE northwind TO nwndbac WITH INIT

Örnek: Aşağıdaki örnek; temporary backup disk file yaratır ve bu dosyaya full database backup işler.

BACKUP DATABASE northwind TO
DISK = ‘D:\Temp\Mytempbackup.bak’


B- Differantial Backup Yapma


Değişmiş veritabanının yedeğini açmak için gerekli olan zamanı, minimize etmek için differantial backup yapılmalı. Bu full database backup yapılmışsa kullanılabilir. Differantial backup’ta SQL Server:

1- Son full database backup’tan beri değiştirilen veritabanı veritabanı
bölümlerini yedekler.
2- Differantial backup sırasında yer tutan aktiviteyi yedekler.



Differantial backup yapılırken aşağıdaki adımlar göz önüne alınmalı:

1- Son full database backup’tan beri belirli bir row farklı zamanlarda değiştirilmişse, Differantial backup row’un sadece son değerini içerir. Bu, row hakkındaki tüm değişiklikleri içeren transaction log’dan farklıdır.
2- Yedekleme zamanı minimize edilebilir; çünkü yedek setleri, full backups’dakilerden daha küçüktür ve transaction log’ların işlenme zorunluluğu yoktur.



Syntax BACKUP DATABASE {database_name @database_name_var}
TO [,…n]
[WITH
[[,]DIFFERENTIAL]
]

Örnek: Aşağıdaki örnek; temporary backup file üzerinde differantial backup yaratır.

BACKUP DATABASE northwind TO
DISK='D:\Mydata\Mydiffbackup.bak'
WITH DIFFERENTIAL



C- Transaction Log Yedeği Yapma

Veritabanı değişikliklerini kaydetmek için transaction loglar yedeklenir. Transaction loglar, full database backup yapılırken yedeklenirler:

1- En azından bir kere full database backup yapmadıkça, transaction log’un yedeği alınmaz.
2- Uygun veritabanı yedeği olmadan transaction loglar’ın yedekleri açılamaz.

SQL Örnekleri

25 Temmuz 2007

Daha önce açıklamış olduğum sql ifadelerinin her biri ile ilgili örnek yazmayı düşünüyordum. Yazmadan evvel şöyle bir gezindim internette ve çok güzel bir web sayfasına rastladım. Her bir ifade ile ilgili örnekler yapmış arkadaşlar. istifadenize sunuyorum.



http://www.metu.edu.tr/~e137346/sql.htm


Arkadaşlar Yukarıdaki link ömrünü tamamlamış :) Aşağıya yeni bir link ekliyorum;


İyi Çalışmalar.



Trigger (Tetikleyici)

23 Temmuz 2007

  • Trigger nedir?

    Bir tablo üzerinde belirli bir olaya bağlı olarak tetiklenip çalışan SQL kodlarıdır. Diğer bir değişle trigger tetikleyicidir,veritabanında kayıt eklerken,silerken ve değiştirirken arkda tarafata kendi kendine calışan sql cümleleridir.

  • Triggerlar neden kullanılır?

    Genel amacı veri bütünlüğünü korumaktır. Bunun için yapılacak herhangi bir değişiklikte izin verilmemiş işlemler veya gerçekleşmesi durumunda veri bütünlüğünde bozulmalara yol açacak işlemlerde veri bütünlüğünün korunmasına yardımcı olurlar.

  • Hangi olaylar trigerları tetikler?

    Tablo üzerindeki triggerları tetikleyen olaylar insert, update, delete olaylarıdır.
  • Triggerlar nerde kullanılır?

    Bir tablo üzerinde bu olayların öncesinde ve sonrasında tetiklenecek istenildiği kadar trigger yazılabilir. Fakat genel eğilim ve kullanım her bir olay için tek bir trigger kullanmak şeklindedir. Örneğin stok hareketleri sonucunda stok miktarlarının azalması veya artması işlemlerinin, veya tahakkuk ve tahsilatlar sonucu cari hesapların etkilenmesi işlemlerinin triggerlar aracılığı ile yapılmaları tipik bir trigger kullanım yeridir.

  • Triggerların çeşitleri nelerdir?

    Tablo üzerindeki triggerları tetikleyen olaylar insert, update, delete olaylarıdır. Bu olaylara istinaden 3 ana tip triggerdan bahsedilir. Bunlar insert triggerı, update triggerı, delete triggerı şeklindedir.

Stored Procedure (Saklı Yordam) Örneği

22 Temmuz 2007


Stored procedure aracılığıyla şu işlemler yapılablir:


  • Input parametrelerini kabul ederek ve birçok değerin geri dönmesini sağlar.

  • Database içindeki işlemleri yapmak için programlama deyimleri içerir.


Stored procedure'lar genellikle rutin hale gelmiş işleri kolayca yapmak için geliştirilirler. SQL deyimleriyle yazılan stored procedure'lar sadece ilk kez çalıştırıldıklarında derlenirler. Daha sonraki çalıştırma işlemlerinde derlenmezler ve böylece hızlı bir biçimde çalışma sağlanmış olur.


Bir sql ifadesi stored procedure olarak saklanabilir. Örneğin "select * from Kisiler" bir stored procedure olarak saklanabilir. Ancak daha çok parametre alan Stored Procedure'ler kullanılır.


Stored Procedure Tanımlama:



Stored Procedure tanımlama




Çalıştırılması:





veya

Stored Procedure (Saklı Yordam)

  • Stored Procedure nedir?



    Bir tabloya bağlı olmaksızın veritabanı içinde tanımlanan belirli bir işi yapmaya yönelik kodlardır. Başka bir değişle "Derlenmiş sql cümlecikleridir".
    Bunlar birer veritabanı nesnesi oldukları için, doğrudan veritabanı yöneticisi olan programda (örneğin Sql Server) yer alırlar. Veritabanınızı nereye taşırsanız orda yer alırlar.



  • Stored Procedure ne işe yarar?


    Çalıştırmak istediğimiz sql cümleciklerini bir Saklı Yordam içine yerleştirerek, bunun bir veritabanı nesnesi haline gelmesini ve çalışıtırıldığında doğrudan, veritabanı yöneticisini üzerinde barındıran sunucu makinede işlemesini sağlarız.

  • Stored Procedure faydaları nelerdir?
  1. İstemci makinelerdeki iş yükünü azaltır ve performansı
    arttırır (yazıldığı zaman aynı zamanda compile edildikleri için query optimizer tarafından optimize edilmiş en hızlı şekilde çalışır).
  2. Sql cümleleri, Saklı Yordam’ lardan çok daha yavaş sonuç
    döndürür
  3. Çok katlı mimariyi uygulamak isteğimiz projelerde faydalıdır.
  4. Networkü (Ağ Trafiğini) azaltır.
  5. Açık Sql cümleciklerine nazaran daha güvenlidir
  6. Programlama deyimlerini içerebilirler. if, next, set vs.. programlama dillerindekine benzer özellikler sunar. Gelen parametrelere göre sorgu yapılıp sonucun dönmesi sağlanabilir.




Bu linkte 'Stored Procedure'ler ile ilgi Burak Selim Şenyurt'a ait çok güzel bir makale, örneği incemelinizi tavsiye ederim



http://www.csharpnedir.com/makalegoster.asp?MId=208