.NET8调用存储过程传入DataTable表类型解决方案
目录
测试代码
C# 全选
private void button11_Click(object sender, EventArgs e)
{
var config = GetConfig("Normal");
//
//DAL层操作直接使用 _Database 成员变量。
//
//创建数据库实例
IDatabase db = DatabaseFactory.GetDatabase(GetDatabaseType(), config.ConnectionString, config.Schema);
//模拟传人的参数表DataTable
var table = GetTableParameter();
//创建DbCommand参数
var pTable = db.CreateParameter("pTable", table, ParameterDirection.Input);
//调用存储过程,并返回多张表
var ds = db.GetDataSet("usp_InTable", CommandType.StoredProcedure, pTable);
//可以将DataTable转换为List<T>
//ds.Tables[0].ToList<DataModel>();
var list =DataTableHelper.ConvertTo< DataModel >(ds.Tables[0]);
}
模拟传入的DataTable数据
C# 全选
/// <summary>
/// 获取模拟数据
/// </summary>
/// <returns></returns>
private DataTable GetTableParameter()
{
var table = new DataTable();
table.Columns.Add("DocNo", typeof(String));
table.Columns.Add("DocDate", typeof(DateTime));
table.Columns.Add("Quantity", typeof(Double));
table.Columns.Add("Price", typeof(Decimal));
table.Columns.Add("Amount", typeof(Decimal));
table.Rows.Add("AR250602001", DateTime.Today, 100, 2.1, 210);
table.Rows.Add("AR250602002", DateTime.Today, 10, 2.1, 21);
table.Rows.Add("AR250602003", DateTime.Today, 1, 2.1, 2.1);
table.Rows.Add("AR250602004", DateTime.Today, 200, 1, 200);
table.Rows.Add("AR250602005", DateTime.Today, 300, 2, 600);
table.AcceptChanges();
return table;
}
存储过程返回的是DataSet/DataTable,可以转换为自定义模型
C# 全选
public class DataModel
{
public string DocNo { get; set; }
public DateTime DocDate { get; set; }
public Double Quantity { get; set; }
public Decimal Price { get; set; }
public Decimal Amount { get; set; }
}
测试结果
返回 DataSet
将DataTable转换List<T>
存储过程 usp_InTable
SQL 全选
alter procedure usp_InTable
@pTable TMyTable READONLY --自定义表类型,须加上READONLY
as
begin
--将传递来的DataTable写入临时表#MyTmpTable4Doc
IF OBJECT_ID(N'tempdb..#MyTmpTable4Doc',N'U') IS NOT NULL
DROP Table #MyTmpTable4Doc
SELECT * INTO #MyTmpTable4Doc FROM @pTable
--模拟操作数据
update #MyTmpTable4Doc set DocDate=GETDATE();
--返回表1:操作后的数据,可以是其他表结构
SELECT * FROM #MyTmpTable4Doc
--返回表2:操作状态
SELECT '操作完成' AS MSG, GETDATE() AS TIME;
end;
Sql自定义类型 TMyTable
SQL 全选
-- 创建用户自定义类(表类型)
CREATE TYPE dbo.TMyTable AS TABLE
(
DocNo varchar(50),
DocDate datetime,
Quantity float,
Price decimal(19,2),
Amount decimal(19,2)
)
总结
- 定义Sql自定义类型(Table类型)
- 存储过程的参数使用自定义类型,标注READONLY
- 将传递来的DataTable写入临时表#tmp, 基于临时表操作
版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
NewDoc C/S框架网