PostgreSQL - 错误:列 "id" 的类型为 uuid,但表达式的类型为整数



我正在尝试通过ODBC驱动程序Driver={PostgreSQL ANSI(x64)}使用C# .NET将一些数据写入PostgreSQL数据库。 此驱动程序是否有任何已知的数据类型匹配问题?

我正在尝试发送 GUID 和日期时间字段。 数据库列类型为 uuidtimestamp 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

最新更新