SQL自動增長列

在SQL   SERVER2K有1個變量和2個函數可以得到:  
  IDENT_CURRENT()   返回爲任何會話和任何作用域中的特定表最後生成的標識值。   
  SELECT   @@IDENTITY   返回爲當前會話的所有作用域中的任何表最後生成的標識值。  
  SCOPE_IDENTITY()   返回爲當前會話和當前作用域中的任何表最後生成的標識值。

 

========================================================================================

 

如何插入一條記錄獲取插入後的自動增長ID列的方法.

主要介紹瞭如何在設定了自動增長ID列後添加一條數據後獲取添加的自動增長的ID值方法.

這篇文章我寫了一個使用企業庫3.0的方法來獲取自動增長ID列的方法,代碼如下:

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Data.SqlClient;

using Microsoft.Practices.EnterpriseLibrary.Data;

using System.Data.Common;

 

public partial class _Default : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        Database db = DatabaseFactory.CreateDatabase("SQLConnectionString");

        string strSql = @"INSERT INTO [BSA].[dbo].[BSA_MissionLog]

           ([a]

           ,[b])

     VALUES

           ('1'

           ,'1'

           )

 

select id = scope_identity()";//這裏是最重要的一段話.

        DbCommand dbcomm = db.GetSqlStringCommand(strSql);

        DataSet ds = db.ExecuteDataSet(dbcomm);

        for (int i = 0; i < ds.Tables[0].Rows.Count; i++)

        {

            for (int j = 0; j < ds.Tables[0].Columns.Count; j++)

{

                Response.Write("第"+i+"行"+j+"列:"+ds.Tables[0].Rows[i][j].ToString());

}

        }

    }

}

 

下面的代碼是使用ado.net 2.0的代碼:

SqlConnection con = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=table1;Persist Security Info=True;User ID=sa;Password=sa");

        try

        {

            string strSql = @"INSERT INTO Log

           ([a]

           ,[b])

     VALUES

           ('1'

           ,'1')

 

select id = scope_identity()";

            con.Open();

            SqlCommand com = new SqlCommand(strSql, con);

            DataSet ds = new DataSet();

 

            SqlDataAdapter da = new SqlDataAdapter(com);

            da.Fill(ds);

            con.Close();

            for (int i = 0; i < ds.Tables[0].Rows.Count; i++)

            {

                for (int j = 0; j < ds.Tables[0].Columns.Count; j++)

                {

                    Response.Write("第" + i + "行" + j + "列:" + ds.Tables[0].Rows[i][j].ToString());

                }

            }

        }

        finally

        {

            con.Close();

        }

 

微軟對這樣的方法解釋是:

 

此代碼告訴 SQL Server 不要返回查詢的行計數,然後執行 INSERT 語句,並返回剛剛爲這個新行創建的 IDENTITY 值。da.Fill(ds)語句返回的記錄集有一行和一列,其中包含了這個新的 IDENTITY 值。如果沒有此語句,則會首先返回一個空的記錄集(因爲 INSERT 語句不返回任何數據),然後會返回第二個記錄集,第二個記錄集中包含 IDENTITY 值。這可能有些令人困惑,尤其是因爲您從來就沒有希望過 INSERT 會返回記錄集。之所以會發生此情況,是因爲 SQL Server 看到了這個行計數(即一行受到影響)並將其解釋爲表示一個記錄集。因此,真正的數據被推回到了第二個記錄集。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章