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

Posted on   樱木007  阅读(653)  评论(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;
            }
        }
    }
}
复制代码

 

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义

随笔 - 88, 文章 - 0, 评论 - 18, 阅读 - 47077

Copyright © 2025 樱木007
Powered by .NET 9.0 on Kubernetes

点击右上角即可分享
微信分享提示