PostgreSQL - 错误:列“ID”类型为uuid,但表达式类型为整数
我试图使用C#.NET将一些数据写入PostgreSQL数据库,通过ODBC驱动程序Driver={PostgreSQL ANSI(x64)}
。此驱动程序是否有任何已知的数据类型匹配问题?PostgreSQL - 错误:列“ID”类型为uuid,但表达式类型为整数
我想发送一个GUID和DateTime字段。数据库列键入为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驱动器不匹配的东西?
UPDATE
由于下面的评论,这似乎工作。我将参数命名为“x”并用于? (问号)在INSERT语句中。看起来参数是位置的。
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
是DB参数的正确名称。改变它并尝试。 我试用了sqlfiddle与PostgreSQL9.3 ...它不认为@1
作为参数,认为它是一个整数。
我有这样的错误:
ERROR: column "data" is of type uuid but expression is of type integer Hint: You will need to rewrite or cast the expression. Position: 36
上,我应该尝试什么有什么建议?我刚刚尝试过'@ x'和':myparam'。对于@x,它表示x不是列名,对于:myparam,它不喜欢冒号。 – 010110110101
你可以试试$ x或$ 1吗?我只是在Google上搜索......似乎有点混乱:P – SamGhatak
确定问号?在INSERT语句中工作,像在x中的随机单词在Parameter对象中工作。然而,由于它无论如何似乎都是位置,名称并不重要。 – 010110110101