Ergebnis 1 bis 6 von 6

Thema: npgsql 2.03, locale German_Germany, double precision

  1. #1
    MBDTeam ist offline Neuer Benutzer
    Registriert seit
    27.02.2009
    Beiträge
    3

    Unglücklich 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:

    Code:
    lc_messages = 'German_Germany'
    lc_monetary = 'German_Germany'
    lc_numeric = 'German_Germany'
    lc_time = 'German_Germany'
    Als Test eine einfache Tabelle

    Code:
    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:

    Code:
    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:

    Code:
    ("Falscher Eingabesyntax für Typ double precision: »1,45678«")
    Der generierte SQL in 2.03 ist:

    Code:
    "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:
    Code:
    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

  2. #2
    Nuadu ist offline Benutzer
    Registriert seit
    09.10.2008
    Ort
    Essen
    Beiträge
    45

    Standard

    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

  3. #3
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von Nuadu Beitrag anzeigen
    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
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  4. #4
    MBDTeam ist offline Neuer Benutzer
    Registriert seit
    27.02.2009
    Beiträge
    3

    Standard

    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:

    Code:
    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.

    Gruß
    Michael

  5. #5
    Avatar von progs
    progs ist offline Super-Moderator
    Registriert seit
    26.11.2005
    Ort
    Kulmbach, Bayern, Germany, 108121049209415, Kulmbach
    Beiträge
    185

    Standard

    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.

  6. #6
    MBDTeam ist offline Neuer Benutzer
    Registriert seit
    27.02.2009
    Beiträge
    3

    Standard

    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!

    Michael

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum