SQL之多行数据添加与修改----用户定义表类型

Posted on 2020-03-15 01:05  樱木007  阅读(633)  评论(0编辑  收藏  举报

       对于多行数据的增加和修改,之前一直是使用循环,一条条调用insert或update语句,这样后台会不停与sqlserver建立连接,会严重影响SQLSERVER的性能,现使用用户定义表类型,解决此问题,后台将插入或修改的数据转为DataTable,然后传入参数,调用存储过程,本次案例使用vs2019和SQL Server2014。

1.创建自定义表类型:点击 数据库---db_ERP(数据库名称)---可编译性---类型---用户定义表类型---右键 新建用户定义表类型

CREATE TYPE InsertTPerson AS TABLE 
(
    [FName] [varchar](30) NULL,
    [FCITY] [varchar](20) NULL,
    [FAGE] [int] NULL,
    [FSalary] [decimal](18, 0) NULL
)

2.创建存储过程

CREATE PROCEDURE InsertT_Person
    @dt dbo.InsertTPerson readonly
AS
BEGIN
  INSERT INTO T_Person
  SELECT FName
        ,FCity
        ,FAge
        ,FSalary
    FROM @dt
END

3.c#代码:注意datatable字段必须与建立的自定义表类型字段顺序一致,不一致会出错,此方法还有一个就是执行结果返回为0,所以不能根据执行行数判断结果

using System.Data.SqlClient;
using System.Data;
namespace ThreadDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("FName");
            dt.Columns.Add("FCity");
            dt.Columns.Add("FAge");
            dt.Columns.Add("FSalary");
            DataRow row1 = dt.NewRow();
            row1["FName"] = "小明";
            row1["FCity"] = "哈尔滨";
            row1["FAge"] = 27;
            row1["FSalary"] = 18000;
            dt.Rows.Add(row1);
            DataRow row2 = dt.NewRow();
            row2["FName"] = "小蔡";
            row2["FCity"] = "哈尔滨";
            row2["FAge"] = 25;
            row2["FSalary"] = 10000;
            dt.Rows.Add(row2);
            InsertTPerson(dt);
        }

        private static void InsertTPerson(DataTable dt)
        {
            string connstr = "Server=.;database=db_ERP;integrated security=true;";
            try
            {
                using (SqlConnection conn = new SqlConnection(connstr))
                {
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = conn;
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = "InsertT_Person";
                    cmd.Parameters.AddWithValue("@dt", dt);
                    conn.Open();
                    cmd.ExecuteNonQuery();
                    conn.Close();
                }
            }
            catch (SqlException ex)
            {
                throw ex;
            }
        }
    }
}

 

Copyright © 2024 樱木007
Powered by .NET 8.0 on Kubernetes