postgresql 函数 参数为复合类型
postgresql没有存储过程,但是函数功能很强大、
在近期开发的电商管理平台中,对于产品的类目管理,设计时有个属性字段,设为字符数组,但是EF不支持数组的操作,所以在添加和修改类目时,需要对属性的存储和维护进行特殊处理,导致代码量增大。
public static async Task AddCategory(MerchandiseCategory category)
{
using (MasonDB db = new MasonDB())
{
var p_attributes = new NpgsqlParameter("attributes", NpgsqlDbType.Array | NpgsqlDbType.Text);
p_attributes.Value = category.Attributes;
var p_parentid = new NpgsqlParameter { ParameterName = "parentid", Value = category.ParentID };
var p_categoryname = new NpgsqlParameter { ParameterName = "categoryname", Value = category.CategoryName };
var p_isvalid = new NpgsqlParameter { ParameterName = "isvalid", Value = category.IsValid };
var p_operatorid = new NpgsqlParameter { ParameterName = "operatorid", Value = category.OperatorID };
var p_operatortime = new NpgsqlParameter { ParameterName = "operatortime", Value = category.OperateTime };
var p_sortweight = new NpgsqlParameter { ParameterName = "sortweight", Value = DateTime.Now.Subtract(DateTime.Parse("1970-1-1")).TotalMilliseconds };
await db.Database.ExecuteSqlCommandAsync("INSERT INTO \"MerchandiseCategories\" (\"ParentID\", \"CategoryName\", \"IsValid\", \"OperatorID\", \"OperateTime\", \"SortWeight\", \"Attributes\") VALUES(@parentid, @categoryname, @isvalid, @operatorid, @operatortime,@sortweight,@attributes); ", p_parentid, p_categoryname, p_isvalid, p_operatorid, p_operatortime, p_sortweight, p_attributes);
}
}
后期如果需要对数据库表加入新的字段或者是删除不需要的字段,SQL作为弱类型语言就会暴露出很多问题、编译无法通过,我们修改代码后重启服务器,这带来的后果有时是不可估量的。所以在开发中采用EF和LINQ。
为了减少代码量,以及便于维护,因此把插入和修改都用数据库函数实现、
postgresql函数的参数可以是表类型、即复合类型、要注意的是表类型要加“”,这个和oracle是一样的、
插入时我想得到插入的一行的数据的ID,代码实现如下:
CREATE OR REPLACE FUNCTION func_add_merchandisecategory(category "MerchandiseCategories")
RETURNS integer AS
$BODY$
INSERT INTO "MerchandiseCategories"(
"ParentID", "CategoryName", "IsValid", "SortWeight", "OperatorID",
"OperateTime", "Attributes")
VALUES (category."ParentID", category."CategoryName",category."IsValid", category."SortWeight", category."OperatorID", category."OperateTime",
category."Attributes")
--select currval('MerchandiseCategories_ID_seq');
returning "ID"; $BODY$
LANGUAGE sql VOLATILE
COST 100;
ALTER FUNCTION func_add_merchandisecategory("MerchandiseCategories")
OWNER TO LujieZheng;
对于返回ID网上还有一种做法是
select currval('MerchandiseCategories_ID_seq');
但是一直提示找不到该序列,我在数据库中以创建该序列,这个问题暂时还没有解决
在调用该函数的时候也出现了很多问题,因为是复合类型,所以格式为:select * from func_add_merchandisecategory(( )),需要加两个括号,括号内的复合类型的各个字段的在赋值时也有区别、对于boolean、character varying()、timestamp without time zone,text类型都要加上单引号
category.ID = await db.Database.SqlQuery<int>($"select * from func_add_merchandisecategory((0,{category.ParentID},'{category.CategoryName}','{category.IsValid}',{category.SortWeight},{category.OperatorID},'{category.OperateTime}','{{{attrs}}}'))").FirstAsync();
注:{{{}}}可以输出{}
postgresql 函数 参数为复合类型的更多相关文章
- 2、Golang基础--包的使用、if-else语句、循环、switch语句、数组、切片、可变函数参数、map类型
1 包的使用 // 为了便于组织代码,同一种类型的代码,写在同一个包下,便于管理 // 定义包 -新建一个文件夹 -内部有很多go文件 -在每个go文件的第一行,都要声明包名,并且包名必须一致 -在一 ...
- 深入理解javascript函数参数与闭包(一)
在看此文章,希望先阅读关于函数基础内容 函数定义与函数作用域 的章节,因为这篇文章或多或少会涉及函数基础的内容,而基础内容,我放在函数定义函数作用域 章节. 本文直接赘述函数参数与闭包,若涉及相关知识 ...
- Python 带参数的装饰器 [2] 函数参数类型检查
在Python中,不知道函数参数类型是一个很正常的事情,特别是在一个大项目里.我见过有些项目里,每一个函数体的前十几行都在检查参数类型,这实在是太麻烦了.而且一旦参数有改动,这部分也需要改动.下面我们 ...
- pycahrm使用docstrings来指定变量类型、返回值类型、函数参数类型
py里面不需要显示声明类型,这和java c这些静态语言不同,虽然python这样做少了一些代码和写代码的困难度,但还是非常多的弊端的,运行速度 代码安全, 这些都是语言本身带来的本的弊端,这些没办法 ...
- Golang - 复合类型
目录 Golang - 复合类型 1. 指针 2. new()和make() 3. 数组 4. slice 5. Map 6. 结构体 7. 结构体参数 Golang - 复合类型 1. 指针 go语 ...
- day10.函数基础及函数参数
一.函数 功能:包裹一部分代码 实现某一个功能 达成某一个目的 特点: """ 特点:可以反复调用,提高代码的复用性,提高开发效率,便于维护管理 函数基本格式 函数的定义 ...
- Hive 文件格式 & Hive操作(外部表、内部表、区、桶、视图、索引、join用法、内置操作符与函数、复合类型、用户自定义函数UDF、查询优化和权限控制)
本博文的主要内容如下: Hive文件存储格式 Hive 操作之表操作:创建外.内部表 Hive操作之表操作:表查询 Hive操作之表操作:数据加载 Hive操作之表操作:插入单表.插入多表 Hive语 ...
- 实现在GET请求下调用WCF服务时传递对象(复合类型)参数
WCF实现RESETFUL架构很容易,说白了,就是使WCF能够响应HTTP请求并返回所需的资源,如果有人不知道如何实现WCF支持HTTP请求的,可参见我之前的文章<实现jquery.ajax及原 ...
- PowerShell控制台输出符号+函数参数类型指定+文本内容读取
There are several ways: Write-Host: Write directly to the console, not included in function/cmdlet o ...
随机推荐
- Robotlegs2 学习笔记 -- SwiftSuspenders 2.x (2)
Swiftsuspenders2简介 Swiftsuspenders2是一个基于元数据(metadata)的IOC(控制反转,inversion of control)的AS3的解决方案.(对于元数据 ...
- CRC校验代码实现
1.CRC校验简介 CRC就是块数据的计算值,它的全称是“Cyclic Redundancy Check”,中文名是“循环冗余码”.CRC校验是数据通讯中最常采用的校验方式.在嵌入式软件开发中,经常要 ...
- Leetcode026. Remove Duplicates from Sorted Array
water class Solution { public: int removeDuplicates(vector<int>& nums) { for(vector<int ...
- PowerDesigner之PDM检查
一.PDM检查 1.检查项的设置 PDM错误级别分为Error和Warning两种.Error是致命错,一旦发现这类错误,系统会自动CDM生成PDM或者OOM,Warning是警告错误,是系统认为不合 ...
- asp.net中导出Execl的方法
一.asp.net中导出Execl的方法: 在 asp.net中导出Execl有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址 输出在浏览器上:一种是将文件直接将文件输出流写给 ...
- IE 不兼容的几个js问题及解决方法1
IE 不兼容的几个js问题及解决方法 1 Table的问题 在动态新增tr或者td时,createElecment() 一般用appendChild();都不生效,解决办法是用新增tbody, 如 ...
- Android IOS WebRTC 音视频开发总结(四十)-- 国内webrtc现状
本文主要介绍目前国内webrtc开发现状,文章来自博客园rtc.blacker,支持原创,转载必须说明出处. 上次一国外合作伙伴问我国内rtc应用和开发状况怎样,哪些城市比较火,那些行业应用比较多,我 ...
- JavaScript高级 引用类型(一)《JavaScript高级程序设计(第三版)》
引用类型是一种数据结构.它也被称作类.有时也被称作 对象的定义. 对象 是某个特定引用类型的实例. 一.Object类型 表达式上下文(expression context):指能够返回一个值 语 ...
- 树莓派(Rospberry Pi B+)到货亲测
1 图鉴 Rospberry Pi B+终于在今天下午有蜗牛快递公司圆*送到了.B+主要是增加了2个USB,增加了GPIO,sd卡换成了micro sd ...先不说直接上图再说,期待了好久好久 整 ...
- LoadCursor 函数
从可执行文件中载入指定的光标资源,加载到指定的应用实例中 ? 1 2 3 4 5 HCURSOR WINAPI LoadCursor( _In_opt_ HINSTANCE hInstance, ...