探討如何在 ASP.NET 2.0 中呼叫 SQL Server CLR 整合預存程序,並將 SqlContext.Pipe.ExecuteAndSend 直接回傳的結果繫結至 DataList 控制項。
[Microsoft.SqlServer.Server.SqlProcedure()]
public static void StoredProcExecuteCommand(int rating)
{
using (SqlConnection connection = new SqlConnection("context connection=true"))
{
connection.Open();
SqlCommand command = new SqlCommand(
"SELECT VendorID, AccountNumber, Name FROM Purchasing.Vendor " +
"WHERE CreditRating <= @rating", connection);
command.Parameters.AddWithValue("@rating", rating);
// 直接將結果串流傳送給用戶端
SqlContext.Pipe.ExecuteAndSend(command);
}
}
ExecuteAndSend 直接將結果輸出至訊息管道(類似 SSMS 的「結果」視窗),不會回傳 DataReader 或 DataTable。因此無法直接繫結至 DataList。
// ASP.NET 端呼叫程式碼
using (SqlConnection conn = new SqlConnection(connString))
{
using (SqlCommand cmd = new SqlCommand("StoredProcExecuteCommand", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@rating", rating);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
adapter.Fill(dt);
DataList1.DataSource = dt;
DataList1.DataBind();
}
}
若預存程序必須保留 ExecuteAndSend 行為(如回傳多結果集、動態查詢),建議在 CLR 程序中改用 SqlDataReader 回傳,或於 ASP.NET 端使用 SqlCommand.ExecuteReader 讀取。