From: | Nils Gösche <cartan(at)cartan(dot)de> |
---|---|
To: | <pgsql-odbc(at)postgresql(dot)org> |
Subject: | Bug? {? = CALL insert_page_segment (?, ?)} |
Date: | 2014-11-11 17:08:04 |
Message-ID: | 002701cffdd2$0f2842d0$2d78c870$@cartan.de |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-odbc |
Hi!
I have a problem with newer versions of the ODBC driver. I made a small
testing example to reproduce the problem:
The following code works fine with version 09.02.0100 of the driver. With
09.03.0210, it crashes. With 09.03.0400, I get a strange exception and error
message.
This is all on Windows, 32-Bit. I tried Windows 7 and Windows 8.1; I also
tried Postgres versions 9.2.4, 9.2.9, 9.3.4 and 9.3.5, all 32-Bit.
Here is the create script for the database:
CREATE TABLE page_segments (
task_id uuid,
id uuid,
PRIMARY KEY (task_id, id)
);
CREATE FUNCTION insert_page_segment(theTaskId uuid, theId uuid) RETURNS int
AS $$
DECLARE
ret int NOT NULL := 0;
BEGIN
BEGIN
INSERT INTO page_segments (task_id, id) VALUES (theTaskId,
theId);
ret := 1;
EXCEPTION WHEN unique_violation THEN
-- ignore
END;
RETURN ret;
END
$$ LANGUAGE plpgsql;
And here is some C# code that calls the insert_page_segment function:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.Odbc;
namespace ODBCTest
{
class Program
{
const string ConnString = @"Driver={PostgreSQL
Unicode};server=localhost;port=5432;database=stringtest;uid=cartan;pwd=...";
static void Main(string[] args)
{
using (var conn = new OdbcConnection(ConnString))
{
conn.Open();
Guid g1 = Guid.NewGuid();
Guid g2 = Guid.NewGuid();
Console.WriteLine("First call returns {0}",
CallTheFunc(conn, g1, g2));
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey(true);
}
static int CallTheFunc(OdbcConnection conn, Guid taskId, Guid id)
{
using (var trans = conn.BeginTransaction())
{
try
{
const string insertCmdText = @"{? = CALL
insert_page_segment (?, ?)}";
using (var insertCmd = new OdbcCommand(insertCmdText,
conn, trans))
{
var retParam = new OdbcParameter();
retParam.OdbcType = OdbcType.Int;
retParam.Direction = ParameterDirection.ReturnValue;
insertCmd.Parameters.Add(retParam);
var taskIdParam = new OdbcParameter();
taskIdParam.OdbcType = OdbcType.UniqueIdentifier;
taskIdParam.Value = taskId;
insertCmd.Parameters.Add(taskIdParam);
var idParam = new OdbcParameter();
idParam.OdbcType = OdbcType.UniqueIdentifier;
idParam.Value = id;
insertCmd.Parameters.Add(idParam);
insertCmd.ExecuteNonQuery();
int ret = (int) retParam.Value;
trans.Commit();
return ret;
}
}
catch
{
trans.Rollback();
throw;
}
}
}
}
}
With the old 9.2.1 driver, the function just returns 1 as expected. With
9.3.4, I get an unusual InvalidOperationException in ExecuteNonQuery(),
saying
"This OdbcTransaction has completed; it is no longer usable."
In the Postgres log file, I find this message:
2014-11-11 17:26:04 CET ERROR: function insert_page_segment(unknown) does
not exist at character 8
2014-11-11 17:26:04 CET HINT: No function matches the given name and
argument types. You might need to add explicit type casts.
2014-11-11 17:26:04 CET STATEMENT: SELECT insert_page_segment ($1, $2)
2014-11-11 17:26:04 CET FATAL: invalid frontend message type 0
Can anybody help me with this?
Regards,
--
Nils Gösche
Dont ask for whom the <Ctrl-G> tolls.
From | Date | Subject | |
---|---|---|---|
Next Message | Ed Hutchinson | 2014-11-11 17:52:42 | Re: Connection string parameter "sslrootcert" does not work |
Previous Message | Adrian Klaver | 2014-11-11 15:10:15 | Re: Connection string parameter "sslrootcert" does not work |