2012-08-01 73 views
1

可能重複:
How to get last inserted id?插入,然後選擇在一個聲明中

我有一個表Absences

| Id | Name | Job | 
------------------------- 
| 1 |  James | 1 | 
------------------------- 
| 2 | Simon |  1 | 
------------------------- 

其中,ID是1
遞增的身份Primary Key 我正在訪問此ta從C#程序竹葉提取,我需要做到以下幾點:

Insert Into Absences (Name, Job) Values ('aName', 'aJob')

的問題是我需要得到Id欄在那裏我同時插入,因爲NameJob不是唯一的,這樣之後,我將無法恢復此確切列。

是否可以在該查詢的Id列中添加一個選擇?


更新

SqlConnection myConnection = new SqlConnection(@"SomeConnection"); 
    myConnection.Open(); 
    SqlCommand myCommand = myConnection.CreateCommand(); 
    myCommand.CommandText = "Insert Into Absences (Name, Job) Values ('aName', 'aJob')"; 
    int currentAbs = (int)myCommand.ExecuteScalar(); 

我上的ExecuteScalar線的錯誤。對象引用未設置爲對象的實例。

+0

[適用範圍身份有時會返回不正確的值(https://connect.microsoft.com/SQLServer/feedback/details/328811 /範圍-身份有時-返回-不正確值)。使用變通方法中建議的'OUTPUT'子句。 – HABO 2012-08-01 12:53:50

+0

@HABO - 這個錯誤在SQL 2008中也得到了證實嗎? – 2012-08-01 13:02:46

+0

@PhilMurray - AFAIK,它在2008年的一生中得到了修復,但我還沒有找到一個關於何時的聲明。它被標記爲「關閉爲固定」。 – HABO 2012-08-01 13:07:25

回答

2

SQL語句SCOPE_IDENTITY()將爲您提供同一範圍內新插入行的標識列的值。

SqlConnection myConnection = new SqlConnection(@"SomeConnection"); 
myConnection.Open(); 
SqlCommand myCommand = myConnection.CreateCommand(); 
myCommand.CommandText = "Insert Into Absences (Name, Job) Values ('aName', 'aJob'); SELECT SCOPE_IDENTITY();"; 
int currentAbs = (int)myCommand.ExecuteScalar(); 

Scope Identity Definition

+0

因此,這給了我最高的當前身份? – phadaphunk 2012-08-01 12:37:30

+1

不,因爲最高的身份不一定是插入的行。 – davenewza 2012-08-01 12:39:58

+0

在同一行上給我另一個例外。指定的轉換無效.. – phadaphunk 2012-08-01 12:56:00

1

如果使用SqlCommand,那麼你可以使用

int lastId = (int)command.ExecuteScalar(); 

檢索插入的記錄的唯一ID。看看Microsoft page

+0

Niice這個聲音非常像我需要的,但我怎樣才能從我的C#程序訪問這個? – phadaphunk 2012-08-01 12:38:00

+0

Ooooh正是我需要的! – phadaphunk 2012-08-01 12:38:25

+0

@PhaDaPhunk:很高興幫助你:) – Marco 2012-08-01 12:40:59

0

這個查詢後,你可以選擇@@身份獲得在MSSQL服務器最後插入的ID。

+2

小心標識和範圍界定。 SCOPE_IDENTITY()更安全 – 2012-08-01 12:41:00

0

一種方法是立即使用SELECT @@IDENTITY您插入記錄後:

int id; 
string query = "Insert Into Absences (Name, Job) Values ('aName', 'aJob')"; 
using (SqlCommand cmd = new SqlCommand(query, connection)) { 
    connection.Open(); 
    // execute your INSERT query 
    cmd.ExecuteNonQuery(); 
    // get the last-inserted ID 
    cmd.CommandText = "SELECT @@IDENTITY"; 
    id = (int)cmd.ExecuteScalar(); 
}