首页 > 代码库 > 将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据

将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据

领导让在存储过程中批量添加数据,找出效率最高的,我看到后台代码后,发现可以将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据,知道还有其他的方法,不过这个方法已经实现,就写一下了:

  1.创建表。

CREATE TABLE [dbo].[person](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL,
    [Pwd] [nvarchar](50) NULL,
    [Age] [int] NULL
)
View Code

  2.创建表值参数类型

  我们打开查询分析器,然后在查询分析器中执行下列代码:

create type pson as table
(
    [Name] [nvarchar](50) NULL,
    [Pwd] [nvarchar](50) NULL,
    [Age] [int] NULL
)
go
View Code

  执行成功以后,我们打开企业管理器,按顺序依次展开下列节点--数据库、展开可编程性、类型、用户自定义表类型,就可以看到我们创建好的表值类型了如下图所示:

   

说明我们创建表值类型成功了。

  3.编写存储过程

存储过程的代码为:

  create proc sp_InsertSingleUser
(
    @User pson readonly
)
as
BEGIN

SET NOCOUNT ON;

Insert into person(Name,Pwd,Age) select Name,Pwd,Age from @User

END

4.编写代码调用存储过程。

  添加数据按钮的功能

 List<person> pList = new List<person>();             //声明集合
person p1 = new person();        //个人实体对象
        p1.Name = "a";
        p1.Pwd = "12";
        p1.Age =11;
        pList.Add(p1);

 person p2 = new person();        //个人实体对象
        p2.Name = "b";
        p2.Pwd = "21";
        p2.Age =12;
        pList.Add(p2);

  XmlSerializer s = new XmlSerializer(typeof(List<person>));
        StringWriter sw = new StringWriter();
        s.Serialize(sw,pList);
        DataSet ds = new DataSet();
        ds.ReadXml(new StringReader(sw.ToString()));
        DataTable dt = ds.Tables[0];

        TVPInsert(dt);
View Code

  Dal层的编码

  private static void TVPInsert(DataTable dt)
    {
        

        DataTable dataTable = dt;
        try
        {
            SqlParameter[] sqlParameter = { new SqlParameter("@User", dataTable) };
            SqlHelper.ExecuteNonQuery(strCon, CommandType.StoredProcedure, "sp_InsertSingleUser", sqlParameter);
        }
        catch (Exception)
        {
            
            throw;
        }
       
    }
View Code

这样可实现在存储过程中批量插入数据。