我试图在一个带有串行主键的PostgreSQL表中插入一行,我需要在插入后检索该列.我有这样的事情:
表"pais"有3列:id,pais,capital; id是一个串行列,是它的主键.
NpgsqlCommand query = new NpgsqlCommand("insert into pais(nombre, capital) values(@nombre, @capital)", conn);
query.Parameters.Add(new NpgsqlParameter("nombre", NpgsqlDbType.Varchar));
query.Parameters.Add(new NpgsqlParameter("capital", NpgsqlDbType.Varchar));
query.Prepare();
query.Parameters[0].Value = this.textBox1.Text;
query.Parameters[1].Value = this.textBox2.Text;
Object res = query.ExecuteScalar();
Console.WriteLine(res);
Run Code Online (Sandbox Code Playgroud)
它在表上插入行,但"res"值为null.如果我使用nexval('table_sequence')插入也返回null.
知道怎样才能返回表的id?我错过了什么吗?
提前致谢
连接字符串参数的名称和这篇博客文章 - http://fxjr.blogspot.co.uk/2010/04/npgsql-connection-pool-explained.html - 让我相信Npgsql不会超过MaxPoolSize值在连接字符串中设置.但是,文档(http://npgsql.projects.postgresql.org/docs/manual/UserManual.html)说"连接池的最大大小.如果池包含的内容超过此值,则将在返回池时处理池化连接连接数.默认值:20"
这表明池实际上可能比MaxPoolSize大,实际上它只是一个级别,Npgsql在返回后立即开始积极地从池中删除连接.
我一直在寻找尝试找到答案但我能确切地知道当你到达MaxPoolSize时会发生什么.其他人都知道吗?
编辑:我应该添加我们正在使用Npgsql 2.0.6.0,因为只有该版本支持另一个依赖项.
我正在尝试将哈希从服务器应用程序移动到PostgreSQL.换句话说,我需要调用PGSQL的查询,它将查询中的字符串与字段中的字符串进行比较,并将相等比较的结果返回为bool,但我不知道如何在没有清除SQL的过程的情况下执行此操作.
upd:我有表用户的字段密码(目前是文本,将来 - bytea).我想写一些像
select * from values ('WrittenPassword' = users.password) where username = 'someuser' ,
Run Code Online (Sandbox Code Playgroud)
必须返回true或false作为平等比较的结果.
我有一个使用Npgsql获取PostGIS数据的查询.它的目的是取一个点(x,y坐标)并计算出那个(如果有的话)几何形状.对于数据库中的绝大多数几何,查询工作正常,但至少有一个我得到以下异常:
错误:XX000:使用LWGEOMCOLLECTION类型调用的相关操作.这是不受支持的.
堆栈顶部的跟踪是:
[NpgsqlException(0x80004005):错误:XX000:使用LWGEOMCOLLECTION类型调用的相关操作.这是不受支持的.]
Npgsql.d__0.MoveNext()+ 3160
Npgsql.ForwardsOnlyDataReader.GetNextResponseObject(布尔清理)+808 Npgsql.ForwardsOnlyDataReader.GetNextRow(布尔clearPending)+308 Npgsql.ForwardsOnlyDataReader.Read()+47
所有几何都应该是有效的,因为我调用ST_MakeValid任何不是,并且当前没有ST_IsValid返回false.几何图形是通过调用创建的,ST_GeomFromKML并且在地图上使用WMS通过GeoServer作为栅格图层渲染,或者作为矢量图层使用,ST_AsGeoJSON因此PostGIS数据似乎没问题.
有什么办法可以修改我的代码或数据来阻止这种情况发生吗?代码失败的部分是读入读取器的部分:
command.CommandText = "SELECT area_code FROM area WHERE ST_INTERSECTS(ST_SetSRID(ST_Point(:x, :y), 4326), shape) AND area_type_code = :typecode";
command.CommandType = CommandType.Text;
var typeCodeParameter = new NpgsqlParameter
{
DbType = DbType.String,
ParameterName = "typecode",
Value = _typeCode
};
var xParameter = new NpgsqlParameter
{
DbType = DbType.Double,
ParameterName = "x",
Value = _x
};
var yParameter = new NpgsqlParameter
{
DbType = DbType.Double,
ParameterName = …Run Code Online (Sandbox Code Playgroud) 我找到了 npgsql 提供程序扩展来为实体框架核心实体设置并发令牌,它应该执行如下操作:
modelBuilder.Entity<MyEntity>(b =>
{
b.Property<uint>("xmin")
.HasColumnType("xid")
.ValueGeneratedOnAddOrUpdate()
.IsConcurrencyToken();
});
Run Code Online (Sandbox Code Playgroud)
如果我理解得很好,它会在实体上创建影子属性。
例如,如何使用此属性来跟踪 ASP.NET Core 中的并发更新(更多用户尝试更新同一实体)?我是否应该尝试将 xmin 列映射到普通属性并将其放入隐藏的输入标记,如asp.net core 文档中所示?或者还有别的办法吗?
尝试将 SQLTypeProvider 与 postgres 一起使用时,运行时出现以下错误
dotnet build
Run Code Online (Sandbox Code Playgroud)
错误 FS3033:类型提供程序 'FSharp.Data.Sql.SqlTypeProvider' 报告错误:无法加载文件或程序集 'System.Runtime.CompilerServices.Unsafe, Version=4.0.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'。该系统找不到指定的文件。[/home/sashan/code/titan/src/Server/Server.fsproj]
我的数据提供者是这样的:
type SQL = SqlDataProvider<
ConnectionString = pg_dev_conn_string,
DatabaseVendor = Common.DatabaseProviderTypes.POSTGRESQL,
UseOptionTypes = true >
Run Code Online (Sandbox Code Playgroud)
如果我将其更改为以下内容
type SQL = SqlDataProvider<
ConnectionString = pg_dev_conn_string,
DatabaseVendor = Common.DatabaseProviderTypes.POSTGRESQL,
ResolutionPath = "/home/sashan/code/dotnet/2.1.500/sdk/NuGetFallbackFolder/system.runtime.compilerservices.unsafe/4.5.1/lib/netcoreapp2.0",
UseOptionTypes = true >
Run Code Online (Sandbox Code Playgroud)
错误消失了,但我不明白为什么。修复看起来真的很奇怪。为什么我必须将它指向我的项目之外的文件?System.Runtime.CompilerServices.Unsafe.dll 不应该位于编译器可以找到它的项目子目录之一中的某个位置吗?
几个月来,我对通过删除并重新创建从数据库生成模型没有任何问题。从 git pull 后,在尝试制作相同的 process 时出现问题。在第二步(使用 DB 的连接字符串创建)之后,第三步不再继续进行,并且在 app.config 文件中没有创建与数据库的连接字符串。我尝试使用数据库凭据测试连接,并且我得到以下信息。
当我尝试从模型图中更新特定表作为替代方案时,我还得到以下信息:
System.Data.Entity.Core.EntityException:关闭提供程序连接时出错。有关详细信息,请参阅内部异常。---> System.IO.FileNotFoundException: 无法加载文件或程序集“System.Memory, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51”或其依赖项之一。
我重新安装了实体框架和 npgsql 包,并尝试添加所有(相同的)程序集,但没有成功。Stack 上的类似答案并没有解决我的问题。(我可以使用当前版本,而无需在 VS 或其任何软件包上进行进一步更新。)
!注意:当我使用 API 调用与当前模型(与 DB 正确通信)时,我从我的服务中获取了所有适当的数据,但我无法从 DB 生成新模型。
任何解决方案?
我在用
视窗 10
VS 2015
实体框架 6.2.0
Npgsql 3.1.1
.Net v.4.6.2
Asp.net
提前致谢 !
我有两台服务器连接到PostgresSQL 9.6Azure 上托管的数据库。服务器正在做一件事 -SELECT 1每 5 秒通过查询访问Postgres 数据库。
连接到数据库并获取数据的典型时间:
25 MS500 MS我的问题是我的 .NET Core 应用程序在获取数据方面比 Node慢 20 倍。我相信.NET Core 由于某种原因没有汇集连接。这种缓慢发生在本地运行应用程序和在 Azure 应用程序服务上运行它时 - 没有区别。我想解决 .NET --> Postgres 缓慢的问题。
请只浏览相关细节,不要在这一点上阅读整个内容 - 我相信只有.NET Core代码是相关的。
APsPing到我的机器上的数据库(应用程序Node和.NET Core应用程序都在其上运行:
Connecting to foobarPostGres:5432 (warmup): from someIp: 19.98ms
Connecting to foobarPostGres:5432: from someIp: 1.65ms
Connecting to foobarPostGres:5432 from …Run Code Online (Sandbox Code Playgroud) 假设我们有一个如下所示的实体类:
public class SerializedEntity
{
public JsonDocument Payload { get; set; }
public SerializedEntity(JsonDocument payload)
{
Payload = payload;
}
}
Run Code Online (Sandbox Code Playgroud)
根据npsql这会生成一个表,该表payload的类型jsonb为此类,这是正确的。
现在我想做的是获取任何类实例并将其存储payload在此表中,例如:
public class Pizza {
public string Name { get; set; }
public int Size { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后应该可以作为具有以下结构的对象进行检索:
{Name: "name", Size: 10}
Run Code Online (Sandbox Code Playgroud)
所以我需要这样的东西:
var pizza = new Pizza("Margharita", 10);
var se = new SerializedEntity(someConverter.method(pizza))
Run Code Online (Sandbox Code Playgroud) 我有一个包含几何列的表,使用EF Core 空间数据和Npgsql.EntityFrameworkCore.PostgreSQL 提供程序
class City
{
public int ID { get; set; }
public string CityName { get; set; }
public Point Location { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我曾经这样按距离过滤
Point myLocation = new Point(longitude, latitude)
{
SRID = 4326
};
cities = db.Cities.Where(a => a.Location.ProjectTo(2855).Distance(myLocation.ProjectTo(2855)) <= radiusMeters);
Run Code Online (Sandbox Code Playgroud)
更新后我收到以下错误:
无法翻译 LINQ 表达式“DbSet()...”。其他信息:方法“App.GeometryExtensions.ProjectTo”的翻译失败。
它无需使用即可工作ProjectTo(),但按度数计数。有没有办法再次将此查询翻译为与仪表一起使用?
npgsql ×10
c# ×9
.net ×2
asp.net-core ×2
postgis ×2
postgresql ×2
azure ×1
concurrency ×1
f# ×1
f#-data ×1
sql ×1