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

时间:2016-02-29 19:16:49

标签: c# .net postgresql odbc

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

我正在尝试发送GUID和DateTime字段。数据库列的类型为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”并使用? 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 个答案:

答案 0 :(得分:0)

我认为@1是数据库参数的正确名称。改变它并尝试。 我在sqlfiddle中尝试使用PostgreSQL9.3 ...它不会将@1识别为参数,将其视为整数。

我在那里遇到了这个错误:

  

错误:列"数据"是uuid类型但表达式是整数类型   提示:您需要重写或转换表达式。职位:36