npgsql 2.03, locale German_Germany, double precision

Hallo,
ich habe ein Problem mit der neuen Version von npgsql
mein DB Server wurde wie folgt eingerichtet:

lc_messages = 'German_Germany'
lc_monetary = 'German_Germany'
lc_numeric = 'German_Germany'
lc_time = 'German_Germany'

Als Test eine einfache Tabelle

CREATE TABLE test
(
  id serial NOT NULL,
  summe double precision,
  CONSTRAINT pk_id PRIMARY KEY (id)
)
WITH (OIDS=FALSE);
ALTER TABLE test OWNER TO postgres;

Folgender Code funtkioniert klaglos mit Version 2.01 von npgsql:

Imports Npgsql

Public Class Form1
    Sub doTest()
        Dim pgC As New NpgsqlConnection
        Dim pgBC As New NpgsqlConnectionStringBuilder
        With pgBC
            .Host = "localhost"
            .Database = "data"
            .UserName = "admin"
            .Password = ""
            .Port = 5432
        End With
        pgC.ConnectionString = pgBC.ConnectionString
        pgC.Open()
        Dim cmd As New NpgsqlCommand
        cmd.Connection = pgC
        cmd.CommandType = CommandType.Text
        cmd.CommandText = "UPDATE test SET summe=0 WHERE id=1"
        cmd.ExecuteNonQuery()

        Dim mySQL As String = "SELECT id,summe FROM test WHERE id=1"
        Dim da As New NpgsqlDataAdapter(mySQL, pgC)
        Dim myCmdBld As New NpgsqlCommandBuilder(da)
        da.UpdateCommand = myCmdBld.GetUpdateCommand
        da.InsertCommand = myCmdBld.GetInsertCommand
        da.DeleteCommand = myCmdBld.GetDeleteCommand
        Dim dt As New DataTable
        da.Fill(dt)
        Dim dr As DataRow = dt.Rows(0)
        With dr
            .Item("summe") = "1,45678"
        End With
        da.Update(dt)
        dt.AcceptChanges()
        da.Dispose()
        dt.Dispose()
        pgC.Close()
        pgC.Dispose()
    End Sub

    Private Sub SimpleButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SimpleButton1.Click
        doTest()
    End Sub
End Class

Bei der Version 2.03 bekomme ich beim da.update(dt) eine Exception:

("Falscher Eingabesyntax für Typ double precision: »1,45678«")

Der generierte SQL in 2.03 ist:

"UPDATE "datenneux"."public"."test" SET "summe" = ((E'1,45678')::float8) WHERE (("id" = ((1)::int4)) AND ((((0)::int4) = 1 AND "summe" IS NULL) OR ("summe" = ((E'0')::float8))))"

In 2.01 ist es:

UPDATE "datenneux"."public"."test" SET "summe" = '1.45678'::float8 WHERE (("id" = 1::int4) AND ((0::int4 = 1 AND "summe" IS NULL) OR ("summe" = '0'::float8)))

Jetzt meine Frage verhält sich 2.03 falsch oder war es in 2.01 falsch??

Michael

Hallo

Ich bin mir nicht sicher ob es ein Schreibfehler ist, aber im
Statement 2.0.3 schreibst du: E ‘1,45678’ .
Im Statement 2.0.1 schreibst du: E’ 1.4567’ .

Entweder du hast den Punkt durch das Komma nur im Forum vertauscht oder auch in deinem Quellcode!

mfg
Gregor

Das ist der offensichtlich von Treiber generierte Code, nicht der Quellcode, den MBDTeam geschrieben hat. Der beinhaltet ein Komma. Mag sein, daß der Treiber das früher automatisch in einen Punkt gewandelt hat und nun nicht mehr. Ich weiß auch nicht, ob das früher ein ‘Versehen’ und heute richtig oder früher richtig und heute falsch ist, Fakt ist, auf SQL-Ebene ist es falsch.

Andreas

Stimmt genau, das ist der vom Treiber generierte Code. Ich habe mittlerweile auch bei den Programmierern des npgsql Treibers eine Anfrage gestellt. Ich habe in den Release Notes noch folgendes gefunden:

2009-02-17 11:31  fxjr

    * src/NpgsqlTypes/NpgsqlTypeConverters.cs:

      Fixed a culture problem in the ToBasicType<T> method which is
      used to send decimal values. With es_ES for example, decimal
      values were being sent as 32,3 instead of 32.3. Thanks Antonio
      Leiva (antonio dot leiva at gmail dot com) for heads up.

Da wurde scheinbar in dem Bereich was geändert. Für mich eigentlich jetzt noch mehr die Frage,
ob es ein Bug der neuen Version ist, oder ob das Verhalten des Treiber so bleibt.
Wenn letzteres bedeutet das für mich einiges an Arbeit. :frowning: :frowning:

Gruß
Michael

Da du eine DataTable mit DataRows verwendest, könntest Du probieren, hier die CultureInfo auf en_US zu setzten. Dann sollte er eigenltich automatisch einen “.” statt ein “,” nehmen.

So, hab mir die neueste Version vom npgsql aus dem cvs gezogen. Da klappts wieder! Ich hatte beim durchgehen der Mails / des CVS gesehen, das da nach dem Release noch an der Stelle was geändert wurde. Also Entwarnung. Jetzt sind auch unsere Besonderheiten wieder richtig mit drin! :slight_smile: :slight_smile: :smiley: :slight_smile: :slight_smile:

Michael