PostgreSQL - 错误:列“id”的类型是uuid,但表达式是整数类型
本文关键字:类型 uuid 整数 表达式 错误 id PostgreSQL | 更新日期: 2023-09-27 18:36:50
我正在尝试通过ODBC驱动程序Driver={PostgreSQL ANSI(x64)}
使用C# .NET将一些数据写入PostgreSQL数据库。 此驱动程序是否有任何已知的数据类型匹配问题?
我正在尝试发送 GUID 和日期时间字段。 数据库列类型为 uuid
和 timestamp without timezone
。 当我尝试发送任何一个时,我得到错误。 当我将 GUID 发送到 uuid 字段时,我收到此错误: ERROR: column "id" is of type uuid but expression is of type integer
对于日期时间,我得到以下内容:ERROR: column "createdate" is of type timestamp without time zone but expression is of type integer;
下面是一些说明问题的简短代码。 此操作失败:
var p = new OdbcParameter
{
ParameterName = "@1",
DbType = DbType.Guid, // I also tried OdbcType = OdbcType.UniqueIdentifier
Value = Guid.NewGuid()
};
var sql = "INSERT INTO mytable (id) VALUES (@1)";
using(var conn = new OdbcConnection(_connectionString))
{
conn.Open();
using (var command = new OdbcCommand(sql))
{
command.CommandType = CommandType.Text;
command.Parameters.Add(p);
command.Connection = conn;
command.ExecuteNonQuery();
}
}
作为健全性检查,我尝试使用SQL注入进行检查,它可以工作:
var sql = "INSERT INTO mytable (id) VALUES ('" + Guid.NewGuid().ToString("N") + "')";
using (var conn = new OdbcConnection(_connectionString))
{
conn.Open();
using (var command = new OdbcCommand(sql))
{
command.CommandType = CommandType.Text;
command.Connection = conn;
command.ExecuteNonQuery();
}
}
如果我涉及日期时间字段,我会得到相同的结果,不同的错误消息。
ODBC 驱动器是否不匹配?
更新
感谢下面的评论,这似乎有效。 我将参数命名为"x"并使用 ?(问号)在插入语句中。 参数似乎是位置性的。
var p = new OdbcParameter
{
ParameterName = "x",
DbType = DbType.Guid,
Value = Guid.NewGuid()
};
var sql = "INSERT INTO mytable (id) VALUES (?)";
using(var conn = new OdbcConnection(_connectionString))
{
conn.Open();
using (var command = new OdbcCommand(sql))
{
command.CommandType = CommandType.Text;
command.Parameters.Add(p);
command.Connection = conn;
command.ExecuteNonQuery();
}
}
我认为@1
不是数据库参数的正确名称。更改它并尝试。我用PostgreSQL9.3在sqlfiddle中尝试过...它不将@1
识别为参数,将其视为整数。
我在那里有这个错误:
错误:"data"列的类型为 uuid,但表达式的类型为整数 提示:您需要重写或强制转换表达式。位置: 36