一、情景引入 項目需求:對於一個數據表(表A)的增、刪、改全部要有日誌記錄,日誌表(表B)結構 中需要記錄表A的自增ID,這樣才能將日誌與操作的數據一一對應起來。 對於刪和改都好辦,獲取Model時都可以取到這個自增ID,然後就可以存入日誌表,但是如果新增一條數據,應該如何獲取到這個自增ID呢?不知 ...
一、情景引入
項目需求:對於一個數據表(表A)的增、刪、改全部要有日誌記錄,日誌表(表B)結構 中需要記錄表A的自增ID,這樣才能將日誌與操作的數據一一對應起來。
對於刪和改都好辦,獲取Model時都可以取到這個自增ID,然後就可以存入日誌表,但是如果新增一條數據,應該如何獲取到這個自增ID呢?不知道我有沒有表達清楚,下麵直接貼具體代碼吧:
二、項目代碼
1 string sql="";//這裡寫你的具體的新增語句INSERT....... 2 strSql.Append(sql); 3 strSql.Append("SELECT id FROM [userblack] WHERE @@ROWCOUNT>0 AND id=SCOPE_IDENTITY();");//返回對應的自增IDView Code
其實這裡還有一個簡便寫法:
1 strSql.Append("SELECT SCOPE_IDENTITY() AS id");//將上面代碼的最後的一行替換成這個View Code
第一種寫法應該是更嚴謹的,但是兩種寫法都是沒問題的。
SQL語句寫好之後,接下來就是ASP.NET運行SQL了:
1 public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) 2 { 3 SqlCommand cmd = new SqlCommand(); 4 5 using (SqlConnection connection = new SqlConnection(connectionString)) 6 { 7 PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters); 8 object val = cmd.ExecuteScalar(); 9 cmd.Parameters.Clear(); 10 return val; 11 } 12 }ExecuteScalar
這裡用ExecuteScalar命令,原因如下:
最後用Convert.ToInt32()將上述方法的返回值轉成Int型就行了。
三、原理分析
大致說一下具體的原理,SCOPE_IDENTITY()是SQL SERVER的一個內置方法,他會返回當前你的表結構中那個自增列的最後一個值。這樣當你新增一條數據之後附加上SCOPE_IDENTITY()這個方法並SELECT一下就獲取到最後一個自增列的數字了。當然,如果沒有新增數據,但是用SELECT SCOPE_IDENTITY()就會返回NULL。
四、總結
好記性不如爛筆頭!如有疑問,可以留言交流。
註意:SQL語句都要以英文的分號結尾,切記!