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

20 Ocak 2014 Pazartesi

Session Verileri Hosting Üzerindeki MSSQL Server Üzerinde Kullanmak

Merhaba Arkadaşlar.
Session verilerini MSSQL server üzerinde kullanmak sitemizde ciddi bir performans artışı ve login sürelerinin istediğiniz ölçüde uzatılmasını sağlar.
Daha önceki yazılarımızda asp.net session verileri mssql üzerinde kullanmayı anlatmıştık fakat sitemiz bir hosting kullanıyorsa kafamıza göre istediğimiz veritabanını ve iznini kullanamamaktayız.
Bu nedenle aşağıdaki adımları izleyerek hosting üzerindeki bir çok sys fonksiyonunu kullanmadan kendi başımıza session verilerini kurabiliriz.
1ADIM :Session databasini kurmak.
-önce hosting panelinden veritabanıadı , kullanıcı adı ve şifre bilgilerini oluşturmalız.
-daha sonra hangi framework kullanıyorsak  onun altındaki dosyayı çalıştırmalız
C:\Windows\Microsoft.NET\Framework\v4.0.30319>aspnet_regsql.exe -S veritabanı_adı_adresi
 -U kullanıcı_adı -P sifre -A all -d database_adı
-----------------------------------------------------------------------------------------------------
Microsoft (R) ASP.NET SQL Kayıt Aracı sürüm 4.0.30319.18408
SQL sunucusuna ASP.NET özelliklerini yüklemek veya bunları kaldırmak için kullan
ılan yönetim yardımcı programı.
Telif hakkı (C) Microsoft Corporation. Tüm hakları saklıdır.
Bu özellikleri ekleme işlemini başlat:
Membership
Profile
RoleManager
Personalization
SqlWebEventProvider
.............
Tamamlandı.
--------------------------------------------------------------------------------------------------------
Şeklinde veritabanını istediğimiz şekilde oluşturuyoruz.
Daha sonra web.config içine aşağıdaki satırları eklemelisiniz (system.web içine eklenmeli)
  <system.web>
<sessionState mode="SQLServer" sqlConnectionString="Data Source=Database_adı;Initial Catalog=veritabanı;User ID=kullanıcı;Password=şifre" cookieless="false" timeout="120" />
  </system.web>

eğer hosting firmanız oluşturduğunuz veritabanına db_owner yetkisini vermişse herhangi bir sorun yaşamadan siteniz hatasız açılacaktır fakat db_owner yetkisi sa kullanıcında ise ve hosting firmanız yetkiyi vermezse ozaman MSSQL server bazı fonksiyonlarını bizim elle eklememiz gerekli.Bu fonksiyonların başında TempGetVersiyon fonksiyonu bulunmakta.

Aşağıda vermiş olduğum bu stored procedure tüm ihtiyaç duyulan fonksiyonları kendisi eklemekte.
Bu stored procedure Microsoft SQL server Management studio ile çalıştırıp hata almamışsanız.Artık session verilerinizi veritabanı üzerinde tutuyorsunuz demektir.

Türkçe hiç bir yerde bu konuyla ilgili bilgi bulamadığım için ekliyorum.2 günlük hata ayıklamının sonucu yazılmıştır.Umarım işinize yarar.


/*********************************************************************
 InstallSqlState.SQL

 Installs the tables, and stored procedures necessary for
 supporting ASP.NET session state on SQL Azure.

 Copyright Microsoft, Inc.
 All Rights Reserved.

 *********************************************************************/

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[happylifesessionTempSessions]') AND type in (N'U'))
DROP TABLE [dbo].[happylifesessionTempSessions]
GO

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[happylifesessionTempApplications]') AND type in (N'U'))
DROP TABLE [dbo].[happylifesessionTempApplications]
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'GetMajorVersion') AND (type = 'P')))
DROP PROCEDURE [dbo].GetMajorVersion
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'CreateTempTables') AND (type = 'P')))
DROP PROCEDURE [dbo].CreateTempTables
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempGetVersion') AND (type = 'P')))
DROP PROCEDURE [dbo].TempGetVersion
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'GetHashCode') AND (type = 'P')))
DROP PROCEDURE [dbo].GetHashCode
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempGetAppID') AND (type = 'P')))
DROP PROCEDURE [dbo].TempGetAppID
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempGetStateItem') AND (type = 'P')))
DROP PROCEDURE [dbo].TempGetStateItem
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempGetStateItem2') AND (type = 'P')))
DROP PROCEDURE [dbo].TempGetStateItem2
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempGetStateItem3') AND (type = 'P')))
DROP PROCEDURE [dbo].TempGetStateItem3
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempGetStateItemExclusive') AND (type = 'P')))
DROP PROCEDURE [dbo].TempGetStateItemExclusive
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempGetStateItemExclusive2') AND (type = 'P')))
DROP PROCEDURE [dbo].TempGetStateItemExclusive2
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempGetStateItemExclusive3') AND (type = 'P')))
DROP PROCEDURE [dbo].TempGetStateItemExclusive3
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempReleaseStateItemExclusive') AND (type = 'P')))
DROP PROCEDURE [dbo].TempReleaseStateItemExclusive
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempInsertUninitializedItem') AND (type = 'P')))
DROP PROCEDURE [dbo].TempInsertUninitializedItem
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempInsertStateItemShort') AND (type = 'P')))
DROP PROCEDURE [dbo].TempInsertStateItemShort
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempInsertStateItemLong') AND (type = 'P')))
DROP PROCEDURE [dbo].TempInsertStateItemLong
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempUpdateStateItemShort') AND (type = 'P')))
DROP PROCEDURE [dbo].TempUpdateStateItemShort
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempUpdateStateItemShortNullLong') AND (type = 'P')))
DROP PROCEDURE [dbo].TempUpdateStateItemShortNullLong
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempUpdateStateItemLong') AND (type = 'P')))
DROP PROCEDURE [dbo].TempUpdateStateItemLong
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempUpdateStateItemLongNullShort') AND (type = 'P')))
DROP PROCEDURE [dbo].TempUpdateStateItemLongNullShort
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempRemoveStateItem') AND (type = 'P')))
DROP PROCEDURE [dbo].TempRemoveStateItem
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempResetTimeout') AND (type = 'P')))
DROP PROCEDURE [dbo].TempResetTimeout
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'DeleteExpiredSessions') AND (type = 'P')))
DROP PROCEDURE [dbo].DeleteExpiredSessions
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.GetMajorVersion
@@ver int OUTPUT
AS
BEGIN
DECLARE @version nchar(100)
DECLARE @dot int
DECLARE @hyphen int
DECLARE @SqlToExec nchar(4000)

SELECT @@ver = 7
SELECT @version = @@Version
SELECT @hyphen = CHARINDEX(N' - ', @version)
IF (NOT(@hyphen IS NULL) AND @hyphen > 0)
BEGIN
SELECT @hyphen = @hyphen + 3
SELECT @dot = CHARINDEX(N'.', @version, @hyphen)
IF (NOT(@dot IS NULL) AND @dot > @hyphen)
BEGIN
SELECT @version = SUBSTRING(@version, @hyphen, @dot - @hyphen)
SELECT @@ver = CONVERT(int, @version)
END
END
END
GO

/*****************************************************************************/


CREATE PROCEDURE dbo.CreateTempTables
AS
CREATE TABLE [happylifesession].dbo.happylifesessionTempSessions (
SessionId  nvarchar(88) NOT NULL PRIMARY KEY,
Created datetime NOT NULL DEFAULT GETUTCDATE(),
Expires datetime NOT NULL,
LockDate datetime NOT NULL,
LockDateLocal  datetime NOT NULL,
LockCookie int NOT NULL,
Timeout int NOT NULL,
Locked bit NOT NULL,
SessionItemShort VARBINARY(7000) NULL,
SessionItemLong image  NULL,
Flags  int NOT NULL DEFAULT 0,
)

CREATE NONCLUSTERED INDEX Index_Expires ON [happylifesession].dbo.happylifesessionTempSessions(Expires)

CREATE TABLE [happylifesession].dbo.happylifesessionTempApplications (
AppId  int NOT NULL PRIMARY KEY,
AppName char(280)  NOT NULL,
)

CREATE NONCLUSTERED INDEX Index_AppName ON [happylifesession].dbo.happylifesessionTempApplications(AppName)

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempGetVersion
@ver char(10) OUTPUT
AS
SELECT @ver = "2"
RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.GetHashCode
@input varchar(280),
@hash int OUTPUT
AS
/*
 This sproc is based on this C# hash function:

int GetHashCode(string s)
{
int hash = 5381;
int len = s.Length;

for (int i = 0; i < len; i++) {
int c = Convert.ToInt32(s[i]);
hash = ((hash << 5) + hash) ^ c;
}

return hash;
}

However, SQL 7 doesn't provide a 32-bit integer
type that allows rollover of bits, we have to
divide our 32bit integer into the upper and lower
16 bits to do our calculation.
*/

DECLARE @hi_16bit  int
DECLARE @lo_16bit  int
DECLARE @hi_t  int
DECLARE @lo_t  int
DECLARE @len int
DECLARE @i int
DECLARE @c int
DECLARE @carry int

SET @hi_16bit = 0
SET @lo_16bit = 5381

SET @len = DATALENGTH(@input)
SET @i = 1

WHILE (@i <= @len)
BEGIN
SET @c = ASCII(SUBSTRING(@input, @i, 1))

/* Formula:
 hash = ((hash << 5) + hash) ^ c */

/* hash << 5 */
SET @hi_t = @hi_16bit * 32 /* high 16bits << 5 */
SET @hi_t = @hi_t & 0xFFFF /* zero out overflow */

SET @lo_t = @lo_16bit * 32 /* low 16bits << 5 */

SET @carry = @lo_16bit & 0x1F0000 /* move low 16bits carryover to hi 16bits */
SET @carry = @carry / 0x10000 /* >> 16 */
SET @hi_t = @hi_t + @carry
SET @hi_t = @hi_t & 0xFFFF /* zero out overflow */

/* + hash */
SET @lo_16bit = @lo_16bit + @lo_t
SET @hi_16bit = @hi_16bit + @hi_t + (@lo_16bit / 0x10000)
/* delay clearing the overflow */

/* ^c */
SET @lo_16bit = @lo_16bit ^ @c

/* Now clear the overflow bits */
SET @hi_16bit = @hi_16bit & 0xFFFF
SET @lo_16bit = @lo_16bit & 0xFFFF

SET @i = @i + 1
END

/* Do a sign extension of the hi-16bit if needed */
IF (@hi_16bit & 0x8000 <> 0)
SET @hi_16bit = 0xFFFF0000 | @hi_16bit

/* Merge hi and lo 16bit back together */
SET @hi_16bit = @hi_16bit * 0x10000 /* << 16 */
SET @hash = @hi_16bit | @lo_16bit

RETURN 0
GO

/*****************************************************************************/

DECLARE @cmd nchar(4000)

SET @cmd = N'
CREATE PROCEDURE dbo.TempGetAppID
@appName varchar(280),
@appId int OUTPUT
AS
SET @appName = LOWER(@appName)
SET @appId = NULL

SELECT @appId = AppId
FROM [happylifesession].dbo.happylifesessionTempApplications
WHERE AppName = @appName

IF @appId IS NULL BEGIN
BEGIN TRAN

SELECT @appId = AppId
FROM [happylifesession].dbo.happylifesessionTempApplications WITH (TABLOCKX)
WHERE AppName = @appName

IF @appId IS NULL
BEGIN
EXEC GetHashCode @appName, @appId OUTPUT

INSERT [happylifesession].dbo.happylifesessionTempApplications
VALUES
(@appId, @appName)

IF @@ERROR = 2627
BEGIN
DECLARE @dupApp varchar(280)

SELECT @dupApp = RTRIM(AppName)
FROM [happylifesession].dbo.happylifesessionTempApplications
WHERE AppId = @appId

RAISERROR(''SQL session state fatal error: hash-code collision between applications ''''%s'''' and ''''%s''''. Please rename the 1st application to resolve the problem.'',
18, 1, @appName, @dupApp)
END
END

COMMIT
END

RETURN 0'
EXEC(@cmd)
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempGetStateItem
@id nvarchar(88),
@itemShort varbinary(7000) OUTPUT,
@locked bit OUTPUT,
@lockDate  datetime OUTPUT,
@lockCookie int OUTPUT
AS
DECLARE @length AS int
DECLARE @now AS datetime
SET @now = GETUTCDATE()

UPDATE [happylifesession].dbo.happylifesessionTempSessions
SET Expires = DATEADD(n, Timeout, @now),
@locked = Locked,
@lockDate = LockDateLocal,
@lockCookie = LockCookie,
@itemShort = CASE @locked
WHEN 0 THEN SessionItemShort
ELSE NULL
END,
@length = CASE @locked
WHEN 0 THEN DATALENGTH(SessionItemLong)
ELSE NULL
END
WHERE SessionId = @id

IF @length IS NOT NULL BEGIN
SELECT [SessionItemLong] FROM [happylifesession].dbo.happylifesessionTempSessions WHERE SessionId = @id
END

RETURN 0

GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempGetStateItem2
@id nvarchar(88),
@itemShort varbinary(7000) OUTPUT,
@locked bit OUTPUT,
@lockAge int OUTPUT,
@lockCookie int OUTPUT
AS
DECLARE @length AS int
DECLARE @now AS datetime
SET @now = GETUTCDATE()

UPDATE [happylifesession].dbo.happylifesessionTempSessions
SET Expires = DATEADD(n, Timeout, @now),
@locked = Locked,
@lockAge = DATEDIFF(second, LockDate, @now),
@lockCookie = LockCookie,
@itemShort = CASE @locked
WHEN 0 THEN SessionItemShort
ELSE NULL
END,
@length = CASE @locked
WHEN 0 THEN DATALENGTH(SessionItemLong)
ELSE NULL
END
WHERE SessionId = @id

IF @length IS NOT NULL BEGIN
SELECT [SessionItemLong] FROM [happylifesession].dbo.happylifesessionTempSessions WHERE SessionId = @id
END

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempGetStateItem3
@id nvarchar(88),
@itemShort varbinary(7000) OUTPUT,
@locked bit OUTPUT,
@lockAge int OUTPUT,
@lockCookie int OUTPUT,
@actionFlags int OUTPUT
AS
DECLARE @length AS int
DECLARE @now AS datetime
SET @now = GETUTCDATE()

UPDATE [happylifesession].dbo.happylifesessionTempSessions
SET Expires = DATEADD(n, Timeout, @now),
@locked = Locked,
@lockAge = DATEDIFF(second, LockDate, @now),
@lockCookie = LockCookie,
@itemShort = CASE @locked
WHEN 0 THEN SessionItemShort
ELSE NULL
END,
@length = CASE @locked
WHEN 0 THEN DATALENGTH(SessionItemLong)
ELSE NULL
END,
/* If the Uninitialized flag (0x1) if it is set,
 remove it and return InitializeItem (0x1) in actionFlags */
Flags = CASE
WHEN (Flags & 1) <> 0 THEN (Flags & ~1)
ELSE Flags
END,
@actionFlags = CASE
WHEN (Flags & 1) <> 0 THEN 1
ELSE 0
END
WHERE SessionId = @id

IF @length IS NOT NULL BEGIN
SELECT [SessionItemLong] FROM [happylifesession].dbo.happylifesessionTempSessions WHERE SessionId = @id
END

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempGetStateItemExclusive
@id nvarchar(88),
@itemShort varbinary(7000) OUTPUT,
@locked bit OUTPUT,
@lockDate  datetime OUTPUT,
@lockCookie int OUTPUT
AS
DECLARE @length AS int
DECLARE @now AS datetime
DECLARE @nowLocal AS datetime

SET @now = GETUTCDATE()
SET @nowLocal = GETDATE()

UPDATE [happylifesession].dbo.happylifesessionTempSessions
SET Expires = DATEADD(n, Timeout, @now),
LockDate = CASE Locked
WHEN 0 THEN @now
ELSE LockDate
END,
@lockDate = LockDateLocal = CASE Locked
WHEN 0 THEN @nowLocal
ELSE LockDateLocal
END,
@lockCookie = LockCookie = CASE Locked
WHEN 0 THEN LockCookie + 1
ELSE LockCookie
END,
@itemShort = CASE Locked
WHEN 0 THEN SessionItemShort
ELSE NULL
END,
@length = CASE Locked
WHEN 0 THEN DATALENGTH(SessionItemLong)
ELSE NULL
END,
@locked = Locked,
Locked = 1
WHERE SessionId = @id

IF @length IS NOT NULL BEGIN
SELECT [SessionItemLong] FROM [happylifesession].dbo.happylifesessionTempSessions WHERE SessionId = @id
END

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempGetStateItemExclusive2
@id nvarchar(88),
@itemShort varbinary(7000) OUTPUT,
@locked bit OUTPUT,
@lockAge int OUTPUT,
@lockCookie int OUTPUT
AS
DECLARE @length AS int
DECLARE @now AS datetime
DECLARE @nowLocal AS datetime

SET @now = GETUTCDATE()
SET @nowLocal = GETDATE()

UPDATE [happylifesession].dbo.happylifesessionTempSessions
SET Expires = DATEADD(n, Timeout, @now),
LockDate = CASE Locked
WHEN 0 THEN @now
ELSE LockDate
END,
LockDateLocal = CASE Locked
WHEN 0 THEN @nowLocal
ELSE LockDateLocal
END,
@lockAge = CASE Locked
WHEN 0 THEN 0
ELSE DATEDIFF(second, LockDate, @now)
END,
@lockCookie = LockCookie = CASE Locked
WHEN 0 THEN LockCookie + 1
ELSE LockCookie
END,
@itemShort = CASE Locked
WHEN 0 THEN SessionItemShort
ELSE NULL
END,
@length = CASE Locked
WHEN 0 THEN DATALENGTH(SessionItemLong)
ELSE NULL
END,
@locked = Locked,
Locked = 1
WHERE SessionId = @id

IF @length IS NOT NULL BEGIN
SELECT [SessionItemLong] FROM [happylifesession].dbo.happylifesessionTempSessions WHERE SessionId = @id
END

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempGetStateItemExclusive3
@id nvarchar(88),
@itemShort varbinary(7000) OUTPUT,
@locked bit OUTPUT,
@lockAge int OUTPUT,
@lockCookie int OUTPUT,
@actionFlags int OUTPUT
AS
DECLARE @length AS int
DECLARE @now AS datetime
DECLARE @nowLocal AS datetime

SET @now = GETUTCDATE()
SET @nowLocal = GETDATE()

UPDATE [happylifesession].dbo.happylifesessionTempSessions
SET Expires = DATEADD(n, Timeout, @now),
LockDate = CASE Locked
WHEN 0 THEN @now
ELSE LockDate
END,
LockDateLocal = CASE Locked
WHEN 0 THEN @nowLocal
ELSE LockDateLocal
END,
@lockAge = CASE Locked
WHEN 0 THEN 0
ELSE DATEDIFF(second, LockDate, @now)
END,
@lockCookie = LockCookie = CASE Locked
WHEN 0 THEN LockCookie + 1
ELSE LockCookie
END,
@itemShort = CASE Locked
WHEN 0 THEN SessionItemShort
ELSE NULL
END,
@length = CASE Locked
WHEN 0 THEN DATALENGTH(SessionItemLong)
ELSE NULL
END,
@locked = Locked,
Locked = 1,

/* If the Uninitialized flag (0x1) if it is set,
 remove it and return InitializeItem (0x1) in actionFlags */
Flags = CASE
WHEN (Flags & 1) <> 0 THEN (Flags & ~1)
ELSE Flags
END,
@actionFlags = CASE
WHEN (Flags & 1) <> 0 THEN 1
ELSE 0
END
WHERE SessionId = @id

IF @length IS NOT NULL BEGIN
SELECT SessionItemLong FROM [happylifesession].dbo.happylifesessionTempSessions WHERE SessionId = @id
END

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempReleaseStateItemExclusive
@id nvarchar(88),
@lockCookie int
AS
UPDATE [happylifesession].dbo.happylifesessionTempSessions
SET Expires = DATEADD(n, Timeout, GETUTCDATE()),
Locked = 0
WHERE SessionId = @id AND LockCookie = @lockCookie

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempInsertUninitializedItem
@id nvarchar(88),
@itemShort varbinary(7000),
@timeout int
AS

DECLARE @now AS datetime
DECLARE @nowLocal AS datetime

SET @now = GETUTCDATE()
SET @nowLocal = GETDATE()

INSERT [happylifesession].dbo.happylifesessionTempSessions
(SessionId,
SessionItemShort,
Timeout,
Expires,
Locked,
LockDate,
LockDateLocal,
LockCookie,
Flags)
VALUES
(@id,
@itemShort,
@timeout,
DATEADD(n, @timeout, @now),
0,
@now,
@nowLocal,
1,
1)

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempInsertStateItemShort
@id nvarchar(88),
@itemShort varbinary(7000),
@timeout int
AS

DECLARE @now AS datetime
DECLARE @nowLocal AS datetime

SET @now = GETUTCDATE()
SET @nowLocal = GETDATE()

INSERT [happylifesession].dbo.happylifesessionTempSessions
(SessionId,
SessionItemShort,
Timeout,
Expires,
Locked,
LockDate,
LockDateLocal,
LockCookie)
VALUES
(@id,
@itemShort,
@timeout,
DATEADD(n, @timeout, @now),
0,
@now,
@nowLocal,
1)

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempInsertStateItemLong
@id nvarchar(88),
@itemLong  image,
@timeout int
AS
DECLARE @now AS datetime
DECLARE @nowLocal AS datetime

SET @now = GETUTCDATE()
SET @nowLocal = GETDATE()

INSERT [happylifesession].dbo.happylifesessionTempSessions
(SessionId,
SessionItemLong,
Timeout,
Expires,
Locked,
LockDate,
LockDateLocal,
LockCookie)
VALUES
(@id,
@itemLong,
@timeout,
DATEADD(n, @timeout, @now),
0,
@now,
@nowLocal,
1)

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempUpdateStateItemShort
@id nvarchar(88),
@itemShort varbinary(7000),
@timeout int,
@lockCookie int
AS
UPDATE [happylifesession].dbo.happylifesessionTempSessions
SET Expires = DATEADD(n, @timeout, GETUTCDATE()),
SessionItemShort = @itemShort,
Timeout = @timeout,
Locked = 0
WHERE SessionId = @id AND LockCookie = @lockCookie

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempUpdateStateItemShortNullLong
@id nvarchar(88),
@itemShort varbinary(7000),
@timeout int,
@lockCookie int
AS
UPDATE [happylifesession].dbo.happylifesessionTempSessions
SET Expires = DATEADD(n, @timeout, GETUTCDATE()),
SessionItemShort = @itemShort,
SessionItemLong = NULL,
Timeout = @timeout,
Locked = 0
WHERE SessionId = @id AND LockCookie = @lockCookie

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempUpdateStateItemLong
@id nvarchar(88),
@itemLong  image,
@timeout int,
@lockCookie int
AS
UPDATE [happylifesession].dbo.happylifesessionTempSessions
SET Expires = DATEADD(n, @timeout, GETUTCDATE()),
SessionItemLong = @itemLong,
Timeout = @timeout,
Locked = 0
WHERE SessionId = @id AND LockCookie = @lockCookie

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempUpdateStateItemLongNullShort
@id nvarchar(88),
@itemLong  image,
@timeout int,
@lockCookie int
AS
UPDATE [happylifesession].dbo.happylifesessionTempSessions
SET Expires = DATEADD(n, @timeout, GETUTCDATE()),
SessionItemLong = @itemLong,
SessionItemShort = NULL,
Timeout = @timeout,
Locked = 0
WHERE SessionId = @id AND LockCookie = @lockCookie

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempRemoveStateItem
@id nvarchar(88),
@lockCookie int
AS
DELETE [happylifesession].dbo.happylifesessionTempSessions
WHERE SessionId = @id AND LockCookie = @lockCookie
RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempResetTimeout
@id nvarchar(88)
AS
UPDATE [happylifesession].dbo.happylifesessionTempSessions
SET Expires = DATEADD(n, Timeout, GETUTCDATE())
WHERE SessionId = @id
RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.DeleteExpiredSessions
AS
DECLARE @now datetime
SET @now = GETUTCDATE()

DELETE [happylifesession].dbo.happylifesessionTempSessions
WHERE Expires < @now

RETURN 0
GO

/*****************************************************************************/

EXECUTE dbo.CreateTempTables
GO

/*************************************************************/
/*************************************************************/
/*************************************************************/
/*************************************************************/

PRINT ''
PRINT '------------------------------------------'
PRINT 'Completed execution of InstallSqlState.SQL'
PRINT '------------------------------------------'

IF NOT EXISTS(SELECT NAME FROM sys.sysusers where name='happylifesession')
BEGIN
CREATE USER [happylifesession] FOR LOGIN [happylifesession]
END
GO
EXEC sp_addrolemember N'db_datawriter', N'happylifesession'
GO
EXEC sp_addrolemember N'db_datareader', N'happylifesession'
GO
EXEC sp_addrolemember N'db_owner', N'happylifesession'
GO

10 Kasım 2011 Perşembe

Ckeditor araçlarını kodla oluşturmak

ckeditör kurulduktan sonra üzerinde görülecek olan düğmeleri kodla değiştirmek kolayca mümkün
örneğin bu kodlar page_load olayının içine yazılabilir
ckeditor.config.toolbar = new object[]
{
                    new object[] { "Source", "-", "Save", "NewPage", "Preview", "-", "Templates" },
                    new object[] { "Cut", "Copy", "Paste", "PasteText", "PasteFromWord", "-", "Print", "SpellChecker", "Scayt" },
                    new object[] { "Undo", "Redo", "-", "Find", "Replace", "-", "SelectAll", "RemoveFormat" },
                    new object[] { "Form", "Checkbox", "Radio", "TextField", "Textarea", "Select", "Button", "ImageButton", "HiddenField" },
                    "/",
                    new object[] { "Bold", "Italic", "Underline", "Strike", "-", "Subscript", "Superscript" },
                    new object[] { "NumberedList", "BulletedList", "-", "Outdent", "Indent", "Blockquote", "CreateDiv" },
                    new object[] { "JustifyLeft", "JustifyCenter", "JustifyRight", "JustifyBlock" },
                    new object[] { "BidiLtr", "BidiRtl" },
                    new object[] { "Link", "Unlink", "Anchor" },
                    new object[] { "Image", "Flash", "Table", "HorizontalRule", "Smiley", "SpecialChar", "PageBreak", "Iframe" },
                    "/",
                    new object[] { "Styles", "Format", "Font", "FontSize" },
                    new object[] { "TextColor", "BGColor" },
                    new object[] { "Maximize", "ShowBlocks", "-", "About" }
};

Bu sayede gelismis bir editore sahip olabilirsiniz.
Biraz daha basit bir şeyler isterseniz.
ckeditor_ozet.config.toolbar = new object[]
{
                    new object[] { "Bold", "Italic", "Underline", "Strike", "-", "Subscript", "Superscript" },
                    new object[] { "Styles", "Format", "Font", "FontSize" },
                    new object[] { "TextColor", "BGColor" },
};

CKEditor için Ckfinger Kurulumu .Net ile nasıl yapılır.

Ckeditör kurulumu yaptığınızı varsayarak Ckfinder kurulumunu yapmayı ve böylece sunucunuza CKeditor kullanarak dosya göndermeyi inceleyebiliriz.
1- http://ckfinder.com/download adresine girerek aspnet sekmesinden download zip diyerek zip dosyasını indirin.
2-zip dosyasından ckfinder klasorunu projenizin ana dizinine kopyalayın.daha sonra
\ckfinder\bin\Release\CKFinder.dll dosyasını kendi asp.net projenizin bin dizini altına kopyalayın
3.Visual studioda References kısmından bin dizini altına kopyaladığınız CKFinder.dll dosyasını referanslarınıza ekleyin.(Add references>browse>../bin/CKFinder.dll)
4.Sonra Asp.net projemize eklediğimiz ckfinder klasörü altındaki config.ascx dosyasını açın.
CheckAuthentication() fonksiyonundaki return false; değerini return true; olarak değiştirelim.
*Bu değişiklikler bazı sorunlara neden olabilir.CheckAuthentication() fonksiyonundaki uyarıya dikkat edin.
 5.SetConfig()  fonksiyonuna gelelim ve aşağıdaki değişkenleri kendi isteğimize göre geliştirelim.
BaseUrl = "/resim/";
BaseDir = "C:/inetpub/vhosts/sitem.com/httpdocs/resim/";
BaseUrl bizim ana dizindeki resimleri koyacağımız dosyanın adı
BaseDir o klasörün fiziksel yolu olduğunu görebilirsiniz.
Resimleri ekleyeceğiniz dosyalara plesk panelden yada kullandığınız panelde yazma izni vermeyi unutmayın!!!
BaseDir yolunu plesk panelde yetki verilen alandan görebiliriniz.Yada hosting firmanızdan rica edebilirsiniz.
6.Ckeditoru kullandığımız asp.net dosyasındaki kod kısmını açıp. Page_Load kısmına aşağıdaki kodları ekleyelim.
 CKFinder.FileBrowser _FileBrowser = new CKFinder.FileBrowser();
_FileBrowser.BasePath = "ckfinder/";
_FileBrowser.SetupCKEditor(ckeditor);
bu kodları eklediğimizde ckeditor olarak tanımladığımız CkEditor nesnemizdeki resim ekleme ikonuna tıkladığımızda Sunucuyu Gez Düğmesini göreceksiniz. Ve Artık Resimleri sunucuya gönderebilirsiniz.

Javascript ile sayfa adını almak

web sitesi adresinizin www.tersduz.com/icerik.aspx olduğunu farz edin bu
elimizdeki javascript kodu bize icerik.aspx sayfa adının dönmesini sağlamakta.
        var sPath = window.location.pathname;

        //var sPage = sPath.substring(sPath.lastIndexOf('\\') + 1);

        var sPage = sPath.substring(sPath.lastIndexOf('/') + 1);

Aşağıdaki kodlarda örneğin bir master page sahibim ve bu master page içerisinde
<ul>

            <li><a id="anasayfa"
href="default.aspx" class="current">Ana
Sayfa</a></li>
            <li><a id="matematikdersleri"
href="dersler.aspx">Matematik Dersleri</a></li>
            <li><a id="siteharitasi"
href="siteharitasi.aspx">Site Haritası</a></li>
            <li><a id="katkidabulunanlar"
href="katkida_bulunanlar.aspx">Katkıda Bulunanlar</a></li>
            <li><a id="okulumuz"
href="http://www.cumhuriyetioo.edu.tr">Okulumuz</a></li>

</ul>  

eğer kullanıcı sayfalar birisine tıkladığında örneğin dersler.aspx sayfasına
tıkladığında current classının anasayfadan gidip matematikderslere geçmesi
gerekli bunun için geliştirmiş olduğum
javascrip kodu şöyle oldu.
<script type="text/javascript">
    $(document).ready(function () {
         var sPath = window.location.pathname;
        //var sPage = sPath.substring(sPath.lastIndexOf('\\')
+ 1);
        var sPage = sPath.substring(sPath.lastIndexOf('/') +
1);
        if (sPage == "") {  
$("#anasayfa").addClass("current");        
$("#matematikdersleri").removeClass("current");
$("#siteharitasi").removeClass("current");
$("#katkidabulunanlar").removeClass("current");           
$("#okulumuz").removeClass("current");
        }
        else if (sPage == "dersler.aspx") {
$("#anasayfa").removeClass("current");
$("#matematikdersleri").addClass("current");
$("#siteharitasi").removeClass("current");           
$("#katkidabulunanlar").removeClass("current");
$("#okulumuz").removeClass("current");
        }
        else if (sPage == "siteharitasi.aspx") {
$("#anasayfa").removeClass("current");
$("#matematikdersleri").removeClass("current");           
$("#siteharitasi").addClass("current");
$("#katkidabulunanlar").removeClass("current");

$("#okulumuz").removeClass("current");
        }
        else if (sPage == "katkida_bulunanlar.aspx") {
$("#anasayfa").removeClass("current");
$("#matematikdersleri").removeClass("current");
$("#siteharitasi").removeClass("current");
$("#katkidabulunanlar").addClass("current");
$("#okulumuz").removeClass("current");
        }
    });
</script>


Eğer menunuz programatik olarak üretiliyorsa örenğin bir repater içerisinde
üretilen ul-li yapısı gibi
<asp:Repeater ID="menu_rpt" runat="server"
DataSourceID="sqlkaynak3">
<HeaderTemplate>
<li><a href="default.aspx" id="menu00"
class="current"><span></span>Anasayfa</a></li>          
</HeaderTemplate>             
<ItemTemplate>           
<li><a href='<%# "konsol.aspx?kategori=" + Eval("id") + "&konsol=" + Eval("adi")
%>' id='<%# "menu" + Eval("id") %>'><span></span><%# Eval("adi") %></a></li>     
</ItemTemplate>

 </asp:Repeater>
ozaman jquery kodlarımız asp.neet için şöyle olmalı
<script type="text/javascript">
    $(document).ready(function () {
        var secili = "menu" + '<%= lblsecilioge.Text %>';
  if (secili != "menuanasayfa") {
            $("#" + secili + "").addClass("current");
$("#menu00").removeClass("current");
        }
        else {
$("#menu00").addClass("current");

        }
    });

</script>

buradaki lblsecilioge.Text içeriği ise görünmeyen bir textbox olup içi söylece
dolduruluyor.
string secili = Request.QueryString["kategori"].ToString();
lblsecilioge.Text = secili;

27 Ağustos 2011 Cumartesi

C# ile ExecuteNonQuery(), ExecuteScalar(), ExecuteReader() kullanımı

ExecuteNonQuery() ;
Bu metod geriye int olarak update, insert, delete olaylarından etkilenen satır sayısı döndürüyor.
DDL ve DML komutları için geliştirilmiştir diyebiliriz. Tamamiyle veri kaynağı üzerinde bir takım sonuçların doğmasına yardımcı olurlar. Bu tip komut cümlecikleri için, ExecuteNonQuery metodu kullanılır.



















ExecuteScalar();
Bu metod sadece tek alanlık veri döndüren sql sorguları için kullanılır. Geriye Object tipinde bir değer döndürür.




















Bu örnekte, Kisiler isimli tablomuza KisiID değeri 3 olan satırın sadece Adisimli alanının değerini veren bir komut nesnesi ve Kisilertablsundaki satır sayısını veren başka bir komut nesnesi kullanılmıştır. Her iki sql ifadeside sonuç olarak tek bir hücreyi döndürmektedir. Eğer sql ifadenizden birden fazla sütun alıyorsanız ve bu ifadeyi ExecuteScalar ile çalıştırıyorsanız, ilk satırın ilk sütunu haricindeki tüm veriler göz ardı edilecektir.

ExecuteReader();
Uygulamalarımızda genelde veri kaynaklarından veri kümeleri çekme ihtiyacını hissederiz. Böyle bir durumda, ExecuteReader metodunu kullanabiliriz. ExecuteReader metodu, çalıştırılan komut sonucu elde edilen sonuç kümesinden bir SqlDataReader nesnesi için veri akışını sağlar.

1 Şubat 2011 Salı

asp.net session SQL server kaydetmek

asp.net sessionları veri tabanına kaydetmek istersek C:\Windows\Microsoft.NET\Framework\version altından  aşağıdaki komutu çalıştırarak sql server session tutar hale getirebiliri.z

For Adding SQL mode session state
C:\ >aspnet_regsql -S localhost -U sa -P wrox -ssadd -sstype p
Start adding session state.
...........
Finished.
For Remove SQL mode session state
C:\ >aspnet_regsql -S localhost -U sa -P wrox -ssremove -sstype p
Start adding session state.
...........
Finished.
kullanılacak web.config satırı ise
<sessionState mode="SQLServer"sqlConnectionString="Data Source=localhost;User ID=***;Password=***"cookieless="false"timeout="1000" />

15 Şubat 2010 Pazartesi

asp.net SQL session

Üzerinde çalıştığım uygulama bir master page üzerinde geliştirilmiş,bir sürü resimleri bulunan interaktif bir web sitesiydi.Web sitesini localhost çalıştığında herhangi bir session problemim olmazken.Sunucuya attığımda yaklaşık her dakikada session değiştiğini dolayısıyla tüm kullanıcı bilgileri,sepet gibi önemli işlerin sıfırlandığını gördüm.
asp.net web config üzerinde session timeout değeri 20dk olarak tanımlı olmasına rağmen neden benim session zırt pırt değişiyor kardeşim :( !!!!
Olay 2 gün uykusuz+ si-stres sonucunda çözüldü

bizim sunucunun(hosting) IIS pool değeri yaklaşık 40 mb olduğu için IIS pool kolaylıkla dolduğunda yeniden başlıyor ve bizim sitenin tüm sessionları sıfırlıyormuş.Bizde bu session olayını sql server kaydetmek için girişimlerde bulunduk.
Önce veritabanınımız ayarlıyalım

C:\Windows\Microsoft.NET\Framework\v2.0.50727>aspnet_regsql.exe -ssadd -sstype c
 -d ASPState -U sa -P SIFREM


diyerek locahhost daki veritabanına ASPState veritabanını oluşturdum.

ve web.config üzerinde

 

bu satırı bulup alttaki ile değiştirdim



artık sessionlarım kaybolmuyor.
 :)

14 Nisan 2009 Salı

asp.net sayfa postback olduğunda konumunun değişmesi

Başlığı okuduysanız ne bu ya ! demiş olmanız muhtemel olay şöyle özetlidir;
Olay:
Uzunca bir web sitesi yaptınız ve alttarafa bir yerelere bir buton koydunuz (ve butonda ajax kullanmadınız.)Ajax kullanmayınca ne oluyor butona tıklandığında sayfa postback oluyor.(sunucuya girip çıkıyor. )sunucu ya girip çıkan sayfa yeniden oluşturulduğu için, butona tıkladığınız sayfanın altında değil taaaa sayfanın en tepesinde oluyorsunuz.

Çözüm1:
Javascript ile uydur uyduruk kodları bulup denemek;

Çözüm2:
Asp.net sayfanızın en üste MaintainScrollPositionOnPostback=true eklemek sorunu çözer.

böylece asp.net sayfanın konumunu bir yerlerde tutar ve post back olduğunda sizi en tepeye bırakıp kaçmaz elinizden tutup sayfayı en son butona tıkladığınız yere götürür.