Hallo,
ich habe ein Problem mit der neuen Version von npgsql
mein DB Server wurde wie folgt eingerichtet:
Als Test eine einfache TabelleCode:lc_messages = 'German_Germany' lc_monetary = 'German_Germany' lc_numeric = 'German_Germany' lc_time = 'German_Germany'
Folgender Code funtkioniert klaglos mit Version 2.01 von npgsql: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;
Bei der Version 2.03 bekomme ich beim da.update(dt) eine Exception: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
Der generierte SQL in 2.03 ist:Code:("Falscher Eingabesyntax für Typ double precision: »1,45678«")
In 2.01 ist es: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))))"
Jetzt meine Frage verhält sich 2.03 falsch oder war es in 2.01 falsch??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)))
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
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
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:
Da wurde scheinbar in dem Bereich was geändert. Für mich eigentlich jetzt noch mehr die Frage,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.
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
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!
Michael
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen