我正在尝试通过ODBC驱动程序Driver={PostgreSQL ANSI(x64)}
使用C#.NET将一些数据写入PostgreSQL数据库。此驱动程序是否具有任何已知的数据类型匹配问题?
我正在尝试发送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驱动器不匹配吗?
更新
感谢下面的评论,这似乎有效。我将参数命名为“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();
}
}
答案 0 :(得分:0)
我认为@1
是数据库参数的正确名称。改变它并尝试。
我在sqlfiddle中尝试使用PostgreSQL9.3 ...它不会将@1
识别为参数,将其视为整数。
我在那里遇到了这个错误:
错误:列"数据"是uuid类型但表达式是整数类型 提示:您需要重写或转换表达式。职位:36