- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们最大限度地使用postgresql的特性来减轻我们的开发工作。我们在 postgresql 中大量使用自定义类型(用户定义的类型);我们的大多数函数和存储过程要么将它们作为输入参数,要么返回它们。
我们想在 F# 的 SqlDataProvider 中使用它们。这意味着我们应该能够以某种方式告诉 F# 如何将 F# 用户类型映射到 postgresql 用户类型。也就是说
我们应该指示 Npgsql 以某种方式执行此映射。到目前为止,我的研究为我指出了两种方法,但我对它们都不是很清楚。感谢任何帮助
方法一
NpgsqlTypes 命名空间有一组预定义的 postgresql 类型映射到开箱即用的 .NET。其中很少是类,其他是结构。假设我想使用 postgresql 的内置类型点,它由 Npgsql 通过 NpgsqlPoint 映射到 .NET。我可以像这样将其映射到特定于应用程序的数据结构:
let point (x,y) = NpgsqlTypes.NpgsqlPoint(x,y)
(来自 PostgreSQLTests.fsx)
在这种情况下,已经定义了 postgresql point 和 NpgsqlPoint (.NET)。现在我想为我的自定义类型做同样的事情。
假设用户定义的 postgresql 组合是
create type product_t as ( name text, product_type text);
而应用程序数据结构(F#)就是记录
type product_f = {name :string; ptype :string }
或者一个元组
type product_f = string * string
当作为参数传递给 postgresql 函数/过程时,我如何告诉 Npgsql 使用我的类型?看起来我需要使用 NpgsqTypes.NpgsqlDbType.Composite 或 Npgsql.PostgresCompositeType,它们没有公开的构造函数。
我在这里走投无路了!
方法二
从 this post 得到提示,我可以创建一个自定义类型并向 MapCompositeGlobally 注册并使用它传递给 postgresql 函数。所以,我在这里尝试一下
在Postgresql这边,类型和函数分别是
CREATE TYPE product_t AS
(name text,
product_type text)
和
func_product(p product_t) RETURNS void AS
从我的 F# 应用程序
type PgProductType(Name:string,ProductType:string)=
member this.Name = Name
member this.ProductType = ProductType
new() = PgProductType("","")
Npgsql.NpgsqlConnection.MapCompositeGlobally<PgProductType>("product_t",null)
然后
类型提供者 = SqlDataProvider
让 ctx = Provider.GetDataContext()let prd = new PgProductType("F#Product","") ctx.Functions.FuncProduct.Invoke(prd);;
ctx.Functions.FuncIproduct.Invoke(prd);;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
stdin(29,1): error FS0501: The member or object constructor 'Invoke' takes 0 argument(s) but is here given 1. The requir
ed signature is 'SqlDataProvider<...>.dataContext.Functions.FuncIproduct.Result.Invoke() : Unit'.
奇怪的是错误报告:constructor 'Invoke' takes 0 argument(s) but is here given 1。 F# 方面对 postgresql 函数采用的参数完全视而不见。它确实认识到函数 FuncIproduct 存在,但对它采用的参数视而不见。
最佳答案
关于您的第一种方法,正如您所了解的那样,NpgsqlTypes 包含一些 Npgsql 开箱即用支持的类型 - 但这些只是 PostgreSQL 内置类型。如果不更改 Npgsql 的源代码,您就无法向其中添加新类型,这不是您想要做的事情。
此外,您还应该了解用户定义类型(PostgreSQL 称之为“复合”)和完全独立的类型(例如 point
)之间的区别。后者是完整类型(类似于 int4
),具有自己的自定义二进制表示,而前者则不是。
您的第二种方法是正确的——Npgsql 完全支持 PostgreSQL 复合类型。我不知道 SqlDataProvider 是如何工作的——我假设这是一个特定于 F# 的类型提供程序——但是一旦你通过 MapCompositeGlobally 正确映射了你的复合 Material ,Npgsql 允许你通过将 NpgsqlParameter 的值设置为 PgProductType 的实例来透明地编写它.首先尝试让它与类型提供程序一起工作可能是值得的。
关于postgresql - 使用 F# 中的 Npgsql 的用户定义的 postgresql 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44446588/
如果没有正确设置项目,总会出现这样的错误: 无法加载文件或程序集“Npgsql,版本 = 3.1.2.0,文化 = 中立,PublicKeyToken = 5d8b90d52f46fda7”或其依赖项
我正在尝试将 TransactionScope 与 Npgsql 提供程序一起使用。 我在一个旧问题 ( provider for PostgreSQL in .net with support fo
添加到我的 vs2015 update 3 安装中。到一个全新的控制台项目。 Attempting to gather dependency information for package 'Npgs
我正在尝试将数据从 PostgreSQL 数据库获取到 PowerBI Desktop,但似乎不起作用。我认为问题出在 npgsql 的安装上。当尝试在 PowerBI 中设置新的数据库连接时,我输入
我是 C# 的新手。我在下面的 .UseNpgsql(string connectionString) 上看到了一些红色波浪线(错误下划线)。悬停错误告诉我,我可能没有使用正确的 using 语句。
我正在使用 NLog4.1 版本进行日志记录。 我的“NLog.config”看起来像: PRODUCTION INSERT INTO "MY"."LOG_TABL
我有一个使用 PostgreSQL 并使用 Npgsql 作为数据驱动程序的 ASP.NET 应用程序。我时不时地收到这个错误: Could not load file or assembly 'Np
我正在尝试从 NPGSQL v2.0.11 迁移到 v3.1.7 但是在我的代码中我正在访问 NpgsqlException 的代码属性。在 3.1.7 中,这已经消失了;我现在如何从 postgre
我想将现有的事件实现替换为可以在事件进入时处理事件的实现,如有必要,可以同时处理。不幸的是,我以前从未实现过任何类型的并发,但必须从某个地方开始,嗯? 我一直在阅读 Functional Reacti
当我在我的连接字符串中使用 Pooling=True 时,出现错误“无法在恢复期间执行不监听”。 此错误发生在热备运行的复制/读取服务器上。 最佳答案 这在 3.2.7 版本中仍然存在。应该可以在热备
背景:我正在将我的应用程序从 mssql 移动到 npgsql v2.0.11.92。 运行我的应用程序几分钟或几小时后,我得到一个 System.Exception:从池中获取连接时超时 . 我在
我目前正在开发一个具有 PostgreSQL 后端的 .Net 应用程序。我正在使用 NpgSQL 来连接两者。当我尝试进行简单的数据检索时,NpgSQL 返回以下错误: 42601: syntax
我正在尝试将 Postgres 中的 timestamp[] 字段类型与 NPGSQL 一起使用,这样我就可以在我的 Entity Framework 模型中使用 DateTime[] 类型。 我已将
我使用 PostgreSQL/NpgSQL 将 c# 桌面应用程序连接到 PostgreSQL 数据库。第一个任务是返回我数据库中的所有表名,这工作正常。根据这个结果,我想获取每个表的所有列名。但问题
我们正在为多人游戏开发数据库后端。服务器用 C# 编写,并通过 Npgsql 与 Postgres 数据库对话。 现在,手册展示了如何使用准备好的语句: NpgsqlCommand command =
这可能与我在 FNH 遇到的其他问题有某种联系。 Fluent NHibernate cannot load MySql.Data from GAC in debug mode of a test 通
我无法在程序启动时可靠地检查 NET/Npgsql 中的数据库是否存在。 代码如下: Public Function dbExists(ByVal _dbName As String) As Bool
我编写了一个基本脚本,可将数据从 PostgreSQL 数据库同步到另一个系统,该脚本在我的测试/开发环境中执行时没有问题,使用: PostgreSQL 9.4 Npgsql dll 版本 3.0.3
这是手册中给出的示例。当我尝试同样的操作时,我得到了无数的异常(exception)。这有什么错误。 using(NpgsqlConnection conn = new NpgsqlConnectio
我正在尝试创建一个包含文件路径的记录。使用 NpqSQL 驱动程序插入启用 UTF8 的 Postgres 数据库。 我的表格定义: CREATE TABLE images ( id seri
我是一名优秀的程序员,十分优秀!