PostgreSql NPGSL 重复主键
PostgreSql NPGSL Duplicate Primary Key
在 NPGSQL 中故意插入重复的主键时执行 ExecuteNonQuery 时,如何 return 出现错误或引发异常。执行后,它只是冻结,什么也没有发生。我尝试用 Try Catch 包围代码,但它仍然在 ExecuteNonQuery 中冻结。
PS。无法使用 AutoIncrement 列。
编辑:
try
{
command = new NpgsqlCommand(strQuery, conn);
if (command.ExecuteNonQuery() > 0)
return true;
else
return false;
}
catch(Exception ex)
{
return false;
}
其中 strQuery 是命令文本。例如。我的table已经有主键值1了,那我就特意再插入一个1作为主键。你如何引发异常?
当 return 值为 false 时。我会抛出异常。但它在 ExecuteNonQuery 中冻结。
Npgsql 正确地抛出带有 PostgreSQL error 23505 的 PostgresException(重复的键值违反唯一约束),这里有一些代码显示它:
using (var conn = OpenConnection())
{
using (var cmd = new NpgsqlCommand("CREATE TABLE foo (id INT PRIMARY KEY)", conn))
cmd.ExecuteNonQuery();
using (var cmd = new NpgsqlCommand("INSERT INTO foo (id) VALUES (1)", conn))
cmd.ExecuteNonQuery();
using (var cmd = new NpgsqlCommand("INSERT INTO foo (id) VALUES (1)", conn))
cmd.ExecuteNonQuery();
}
问题可能出在您的代码中。如果您仍然认为存在问题,请提交完整示例,包括您使用的 Npgsql 版本以及显示问题的完整、可运行的控制台程序(就像我在上面的片段中所做的那样)。
在 NPGSQL 中故意插入重复的主键时执行 ExecuteNonQuery 时,如何 return 出现错误或引发异常。执行后,它只是冻结,什么也没有发生。我尝试用 Try Catch 包围代码,但它仍然在 ExecuteNonQuery 中冻结。
PS。无法使用 AutoIncrement 列。
编辑:
try
{
command = new NpgsqlCommand(strQuery, conn);
if (command.ExecuteNonQuery() > 0)
return true;
else
return false;
}
catch(Exception ex)
{
return false;
}
其中 strQuery 是命令文本。例如。我的table已经有主键值1了,那我就特意再插入一个1作为主键。你如何引发异常?
当 return 值为 false 时。我会抛出异常。但它在 ExecuteNonQuery 中冻结。
Npgsql 正确地抛出带有 PostgreSQL error 23505 的 PostgresException(重复的键值违反唯一约束),这里有一些代码显示它:
using (var conn = OpenConnection())
{
using (var cmd = new NpgsqlCommand("CREATE TABLE foo (id INT PRIMARY KEY)", conn))
cmd.ExecuteNonQuery();
using (var cmd = new NpgsqlCommand("INSERT INTO foo (id) VALUES (1)", conn))
cmd.ExecuteNonQuery();
using (var cmd = new NpgsqlCommand("INSERT INTO foo (id) VALUES (1)", conn))
cmd.ExecuteNonQuery();
}
问题可能出在您的代码中。如果您仍然认为存在问题,请提交完整示例,包括您使用的 Npgsql 版本以及显示问题的完整、可运行的控制台程序(就像我在上面的片段中所做的那样)。