现在的位置: 首页 > 综合 > 正文

通过程序获得SQL Server自增型字段的函数:GetKey

2011年04月02日 ⁄ 综合 ⁄ 共 2723字 ⁄ 字号 评论关闭

通过程序获得SQL Server自增型字段的函数:GetKey

 

概述:

通过程序来产生自增型字段,可以避免多用户操作的读取脏数据,操作也很简便.可以更好的在程序中控制这些关键字段的数值.

 

关键步骤:

1.     创建用于存放需要自增的数据表.(systemkey)

SQL Script 如下:

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SystemKey]'and OBJECTPROPERTY(id, N'IsUserTable'= 1)

drop table [dbo].[SystemKey]

GO


CREATE TABLE [dbo].[SystemKey] (

    
[ID] [int] NOT NULL ,

    
[KeyName] [nvarchar] (50)  NOT NULL ,

    
[KeyValue] [int] NOT NULL ,

    
[SourceID] [nvarchar] (50)  NOT NULL ,

    
[LockTime] [datetime] NULL 

ON [PRIMARY]

GO

KeyName:关键字的字段名(我们需要的字段名称,手工添加到这个表中)

KeyValue:对应字段名的值.

SourceID:字段的来源,如果没有可以填””

LockTime:锁定的时间,在程序内部使用.

 

2.    GetKeys方程,通过调用GetKeys得到关键字的值.

函数描述如下:

Imports Microsoft.ApplicationBlocks.Data

Imports Microsoft.VisualBasic.CompilerServices

Imports System.Threading

Imports System.Data.SqlClient

Public Class ClassTest

    
Public Function GetKeys(ByVal KeyName As StringByVal Source As StringByVal CNString As StringAs Integer

        
Dim connection As New SqlConnection(CNString)


        
Dim NewNum As Integer

        
Dim obj2 As Object

        
Dim sFlage As String = "Flag"

        Try

            
Dim sql As String

            
Dim time As DateTime = DateAndTime.Now.AddSeconds(1)

            connection.Open()

            
Do While (StringType.StrCmp(sFlage, ""False<> 0)

                sql 
= (("Update [SystemKey] Set [SourceID]='" & Source & "', [LockTime]=GetDate()  Where [KeyName]='" & KeyName) & "' AND   ((DATEADD(millisecond, 1000, LockTime) <GetDate() ) OR ( SourceID=''))")

                
Dim j As Integer = SqlHelper.ExecuteNonQuery(connection, CommandType.Text, sql)

                
If (j > 0Then

                    sFlage 
= ""

                    Exit Do

                
End If

                sFlage 
= "Err"

                connection.Close()

                
If (DateTime.Compare(time, DateAndTime.Now) < 0Then

                    
Return -1

                
End If

                Thread.Sleep(
10)

            
Loop


            sql 
= "Select KeyValue  From [SystemKey] Where [KeyName]='" & KeyName & "' AND SourceID='" & Source & "'"

            Dim OldNum As Object = SqlHelper.ExecuteScalar(connection, CommandType.Text, sql)

            
Dim num As Integer = (IntegerType.FromObject(OldNum) + 1)

            sql 
= "Update [SystemKey] Set [KeyValue]=" & StringType.FromInteger(num) & ", [SourceID]='' Where [KeyName]='" & KeyName & "'"

            SqlHelper.ExecuteNonQuery(connection, CommandType.Text, sql)

            NewNum 
= num

        
Catch exception As Exception

            NewNum 
= -1

        
Finally

            
If Not connection Is Nothing Then

                
CType(connection, IDisposable).Dispose()

            
End If

        
End Try

        
Return NewNum

    
End Function


End Class


【上篇】
【下篇】

抱歉!评论已关闭.