2009年5月30日 星期六

取得新插入資料ID及在ASP.NET使用呼叫Stored Procedure

在寫.net程式時, 常常會遇到在新增一筆資料時, 馬上要取得該筆資料的ID做運用.這時候就會用到 ExecuteScalar().

範例如下(from MSDN):


Int newID= 0;
string sql = "INSERT INTO Production (Name) VALUES (@Name); " + "SELECT CAST(scope_identity() AS int)";
using (SqlConnection conn = new SqlConnection(connString))
{
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.Add("@Name", SqlDbType.VarChar);
cmd.Parameters["@name"].Value = newName;
try
{
conn.Open();
newID = (Int)cmd.ExecuteScalar();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
return (int)newID;


備註:
scope_identity() 為MSSQL專用, MySQL使用 LAST_INSERT_ID()


在.NET的資料庫程式中, 為了一些效能最佳化和方便UI介面處理, 常會在程式中呼叫寫在SQL Server中的Stored Procedure, 大致步驟如下:
1.建立Command Object with Stored Procedure identify
SqlCommand cmd = new SqlCommand("sp_TestStoredProcedure", db);

2.CommandType設為StoredProcedure
cmd.CommandType = CommandType.StoredProcedure;

3.傳入參數
cmd.Parameters.Add("@Name",SqlDbType.NVarChar, 50);
cmd.Parameters["@Name"].Value = "test";

4.取得回傳值
可以使用DataReader取得資料.
若Stored Procedure裡有設RETURN, 必須把要取得的參數 Direction 屬性設為 ParameterDirection.ReturnValue , 並執行 ExecuteNonQuery() 方法
SqlParameter retParam = cmd.Parameters.Add("@RETURN_VALUE", SqlDbType.VarChar, 250);
retParam.Direction = ParameterDirection.ReturnValue;

若使用Output Parameter, 則把Direction 屬性為 ParameterDirection.Output 即可得到回傳的資料
SqlParameter retParam = cmd.Parameters.Add("@OUTPUT_DATA", SqlDbType.VarChar, 250);
retParam.Direction = ParameterDirection.Output;

參考:
ADO.NET 如何取得 Stored Procedure 的回傳值
MSDN:SqlCommand.ExecuteScalar 方法
The C# Station ADO.NET Tutorial Lesson 07: Using Stored Procedures

沒有留言: