当前位置: 首页 > news >正文

C# call store procedure with table input parameters

有时候我们调用SQL server的存储过程的时候,需要批量传入表数据(比如表字段包括[UserId],[CompanyId], [DealId], [RoleId]),而并不是简单的传入@Ids或者一些简单的参数(例如 @UserId int, @DealId int)。

此文章介绍利用SQL Server 的User Defined Type实现table作为存储过程的入参,然后如何用C#去调用存储过程的方法。

目录

1. 创建User Defined Type

2. 创建存储过程

3. C#代码调用

4. SQL Profile检测到的执行脚本


1. 创建User Defined Type

CREATE TYPE [dbo].[udTestDemo] AS TABLE 
(UserId INT,CompanyId INT, DealId INT, RoleId INT, IsAdded bit
)GO

2. 创建存储过程

/*
Description: Test demo
2025-11-13      Evan   Created Test Demo:declare @p1 [dbo].[udTestDemo]
insert into @p1 values(88934,48456,37961,25,1)
insert into @p1 values(194194,48456,37961,25,1)exec SP_TEST_USER_DEFINED_TYPE_AS_INPUT_PARAMETERS @AddOrRemovedItems=@p1,@ApproverUserId=174963*/
CREATE PROCEDURE [dbo].[SP_TEST_USER_DEFINED_TYPE_AS_INPUT_PARAMETERS]@AddOrRemovedItems [dbo].[udTestDemo] READONLY,@ApproverUserId int
AS
BEGIN-- Insert;WITH AddedItems as (select [UserId],[CompanyId], [DealId], [RoleId] from @AddOrRemovedItems where IsAdded = 1)select [UserId],[CompanyId], [DealId], [RoleId] from AddedItems--Delete;WITH RemovedItems as (select [UserId],[CompanyId], [DealId], [RoleId] from @AddOrRemovedItems where IsAdded = 0)select [UserId],[CompanyId], [DealId], [RoleId] from RemovedItems
END

3. C#代码调用

/// <summary>
/// RelationShip
/// </summary>
public class RelationShip
{/// <summary>/// UserId/// </summary>public int UserId { get; set; }/// <summary>/// DealId/// </summary>public int DealId { get; set; }/// <summary>/// CompanyId/// </summary>public int CompanyId { get; set; }
}

调用方法

 private const int AGENCY_CLIENT_ROLE_ID = 25;/// <summary>
/// SaveRelationShips (Save Deal to Client).
/// Aka: Save Contact to one Deal
/// </summary>
/// <param name="approverUserId"></param>
/// <param name="addedRelations"></param>
/// <param name="removedRelations"></param>
/// <param name="roleId"></param>
/// <returns></returns>
private async Task<bool> SaveRelationShips(int approverUserId, List<RelationShip> addedRelations, List<RelationShip> removedRelations, int? roleId = 25)
{try{DataTable table = new();table.Columns.Add("UserId", typeof(int));table.Columns.Add("CompanyId", typeof(int));table.Columns.Add("DealId", typeof(int));table.Columns.Add("RoleId", typeof(int));table.Columns.Add("IsAdded", typeof(bool));if (addedRelations != null && addedRelations.Count > 0){foreach (RelationShip relationship in addedRelations){table.Rows.Add(relationship.UserId, relationship.CompanyId, relationship.DealId, roleId ?? AGENCY_CLIENT_ROLE_ID, true);}}if (removedRelations != null && removedRelations.Count > 0){foreach (RelationShip relationship in removedRelations){table.Rows.Add(relationship.UserId, relationship.CompanyId, relationship.DealId, roleId ?? AGENCY_CLIENT_ROLE_ID, false);}}using SqlConnection DbConnection = new SqlConnection(connectionString);DbConnection.Open();SqlCommand comm = new SqlCommand(CRM_GPRC_SP_SAVE_RELATIONSHIP_FOR_USER, DbConnection);comm.CommandType = CommandType.StoredProcedure;comm.CommandTimeout = 50;comm.Parameters.AddWithValue("@AddOrRemovedItems", table);comm.Parameters.AddWithValue("@ApproverUserId", approverUserId);var result = await comm.ExecuteNonQueryAsync();DbConnection.Close();return true;}catch (Exception ex){Log.Error(ex, $"SaveRelationShips failed. {ex.Message}");}return false;
}

4. SQL Profile检测到的执行脚本

declare @p1 [dbo].[udTestDemo]
insert into @p1 values(88934,48456,37961,25,1)
insert into @p1 values(194194,48456,37961,25,1)exec SP_TEST_USER_DEFINED_TYPE_AS_INPUT_PARAMETERS @AddOrRemovedItems=@p1,@ApproverUserId=174963

http://www.dtcms.com/a/605705.html

相关文章:

  • 怎么样用自己电脑做网站实用设计网站推荐
  • 【uniapp实践】主题样式配置浅色深色以及自定义
  • LangChain Model I/O 使用示例
  • 北京做网站设计公司网站开发主要参考文献
  • AI 十大论文精讲(三):RLHF 范式奠基 ——InstructGPT 如何让大模型 “听懂人话”
  • GPT-5.1 发布:更智能也更“人性化“的 AI 助手
  • std::bind 的简单使用
  • 中山网站seo关键词国外开源建站系统
  • [论文阅读]Friend or Foe: How LLMs‘ Safety Mind Gets Fooled by Intent Shift Attack
  • 北京出名做网站的公司怎么查网站注册信息
  • 梧州网站建设制作个人服务器网站备案
  • ppo爬坡代码及解释
  • 广东省建设厅官方网站多少钱网站logo例子
  • C语言编译器手机版 | 高效便捷的C语言编程工具
  • Vue 项目实战《尚医通》,登录模块表单校验,笔记28
  • 都江堰旅游门户网站网站设计培训哪里好
  • 重塑 Web 性能:用 Rust 与 WASM 构建“零开销”图像处理器
  • 如何实现网络与安全的深度融合
  • 探索图像处理中的九种滤波器:从模糊到锐化与边缘检测
  • Cognex VisionPro 视觉工具集成与加载机制分析笔记
  • 网站建设需要那种技术磐安网站建设
  • 日语学习-日语知识点小记-进阶-JLPT-N1阶段应用练习(11):语法 +2022年12月N1
  • HCIP—Datacom面试技术常问问题
  • transformer 在 DETR当中的应用
  • 基于MATLAB的飞机气动导数系统辨识
  • 沧州网站设计多少钱开发微信小程序需要多少钱
  • 金融科技项目管理方式在AI加持下发展方向之,需求分析精准化减少业务与技术偏差
  • 福安城乡建设与规划局网站深圳工商注册核名查询系统
  • Unity模型中人形角色的嘴巴一直开着怎么办
  • 【支承导向元件】滚动轴承及其选型计算