在学习SQL Server 2008的过程中,突然发现SQL Server支持自定义表类型,我们可以轻松的将一个SQL Server 2008表类型作为参数传递给存储过程。
我们通过ADO.Net在C#下演示这项SQL Server 2008的新功能。
首先,我们在SQL Server 2008下创建一个示例数据库名为Test,再在该数据库下创建一个名为User的表,结构如下:
再在Test数据库下创建一个自定义表类型,取名UserDetailType,如下:
CREATE TYPE [dbo].[UserDetailsType] AS TABLE(
[ID] [varchar](50) NULL,
[Name] [varchar](50) NULL,
[Sex] [varchar](50) NULL,
[Age] [decimal](18, 0) NULL
)
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
然后,创建一个存储过程,取名InsertUserInfo,如下:
CREATE PROCEDURE [dbo].[InsertUserInfo] @UserInfo [UserDetailsType] readonly
AS
BEGIN
insert into [User] ([ID], [Name], [Sex], [Age])
select [ID], [Name], [Sex], [Age]
from @UserInfo;
END
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
启动Visual Studio 2008,创建一个默认的窗体应用程序后,我们需要先在内存中创建一个数据库表DataTable的实例,如下:
private static DataTable PrepareDatatable()
{
DataTable dt = new DataTable("dt");
DataColumn[] dtc = new DataColumn[4];
dtc[0] = new DataColumn("ID", System.Type.GetType("System.String"));
dtc[1] = new DataColumn("Name", System.Type.GetType("System.String"));
dtc[2] = new DataColumn("Sex", System.Type.GetType("System.String"));
dtc[3] = new DataColumn("Age", System.Type.GetType("System.Decimal"));
dt.Columns.AddRange(dtc);
return dt;
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
然后,通过SqlCommand执行刚才我们创建的Test数据库存储过程InsertUserInfo,并传递我们在内存中创建的DataTable的实例,如下:
private static void SaveUserInfoDetails()
{
DataTable dt = PrepareDatatable();
for (int i=0;i< =5;i++)
{
DataRow dr = dt.NewRow();
dr[0] = i.ToString();
dr[1] = "Name" + i.ToString();
dr[2] = "男";
dr[3] = (i*10).ToString();
dt.Rows.Add(dr);
}
using (SqlConnection conn = new SqlConnection("server=Rithia;database=Test;integrated security=SSPI"))
{
SqlCommand cmd = conn.CreateCommand();
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.CommandText = "dbo.InsertUserInfo";
SqlParameter param = cmd.Parameters.AddWithValue("@UserInfo", dt);
conn.Open();
cmd.ExecuteNonQuery();
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
通过上面的示例,我们可以在程序客户端先创建好要传递的表类型数据,然后传递给存储过程,而存储过程则将SQL Server 2008表类型参数中的记录一次性的添加到了数据库实体表中,这种操作在需要传递给存储过程数组形式的参数时非常非常方便。
该示例在Visual Studio 2008 SP1 + SQL Server 2008 +Windows XP SP3 下编译调试通过。
这样,就在C#下实现了SQL Server 2008表类型参数传递。
【编辑推荐】