none
SQL Command und falsche CultureInfo? RRS feed

  • Frage

  • Hallo zusammen,

    ich habe ein kleines Problem beim Einfügen eines Datensatzes in die Datenbank.

    Es werden ein paar Zahlen und Strings übergeben. Im SQL-Server ist für eine Datum-Spalte  ein Default-Wert hinterlegt. Wenn ich die Informationen manuell eingebe, funktioniert das auch gut. Im Programm bekomme ich jedoch die Fehlermeldung

    "Bei der Konvertierung eines nvarchar-Datentyps in einen datetime-Datentyp liegt der Wert außerhalb des gültigen Bereichs.
    Die Anweisung wurde beendet."

    Da ich zwei SQL-Server bedienen muss (einer in deutsch der andere in englisch) habe ich schon die CultureInfo in meinen DLLs angepasst weil ich dachte, dass es möglicherweise damit zutun haben könnte. Allerdings ohne Erfolg bisher.

    Jemand noch eine Idee?

    Freitag, 19. Dezember 2014 09:40

Antworten

  •                     cmd.Parameters.Add("@ManufactureDate", System.Data.SqlDbType.DateTime).Value = System.Data.SqlTypes.SqlDateTime.MinValue;
                        cmd.Parameters.Add("@ExpiryDate", System.Data.SqlDbType.DateTime).Value = System.Data.SqlTypes.SqlDateTime.MaxValue;
                        cmd.Parameters.Add("@DepletedDate", System.Data.SqlDbType.DateTime).Value = System.Data.SqlTypes.SqlDateTime.MaxValue;
                        cmd.Parameters.Add("@MsdOpenDate", System.Data.SqlDbType.DateTime).Value = System.Data.SqlTypes.SqlDateTime.MinValue;
                        cmd.Parameters.Add("@LastModifiedDate", System.Data.SqlDbType.DateTime).Value = System.Data.SqlTypes.SqlDateTime.MinValue;
                        cmd.Parameters.Add("@VerifiedDate", System.Data.SqlDbType.DateTime).Value = System.Data.SqlTypes.SqlDateTime.MinValue;
                        cmd.Parameters.Add("@LastProductionDate", System.Data.SqlDbType.DateTime).Value = System.Data.SqlTypes.SqlDateTime.MinValue;
    Lösung des Problems... einfach den Datum-Werts als Parameter mit übergeben :-)
    • Als Antwort markiert David Stania Freitag, 19. Dezember 2014 14:54
    Freitag, 19. Dezember 2014 14:54

Alle Antworten

  • Hallo Desert-Fox,

    das liegt natürlich daran, wie du das Datum im Code übergibst.

    Kannst du mal ein Beispiel posten ?

    Als kleine Hilfe habe ich einen alten Thread gefunden mit einem ähnlichen Thema, schau da mal rein https://social.msdn.microsoft.com/forums/sqlserver/de-DE/cef3df30-683e-4084-b86e-233091b9c9ca/nvarchar-nach-datetime-casten

    Da wird das Problem nämlich auf die SET DATETIME Funktion geschoben, was bei deiner Beschreibung auch meine erste Idee war. Kannst ja auch da mal in die Doku schauen, wies genau geht oder eben im anderen Thread

    Gruß Claudius

    Freitag, 19. Dezember 2014 10:02
  • Hallo Claudius,

    using (SqlConnection con = new SqlConnection(ConnectionString))
                    {
                        SqlCommand cmd = new SqlCommand("INSERT INTO PackagingUnit (PackagingUnitId, SiplaceProComponent, RawComponentBarcode, ComponentBarcodeFragment, OriginalQuantity, Quantity, Extra1, Extra2, Extra3, Comment) VALUES (@PackagingUnitId, @SiplaceProComponent, @RawComponentBarcode, @ComponentBarcodeFragment, @OriginalQuantity, @Quantity, @Extra1, @Extra2, @Extra3, @Comment)", con);
    
                        cmd.Parameters.Add("@PackagingUnitId", System.Data.SqlDbType.VarChar).Value = UniqueID;
                        cmd.Parameters.Add("@SiplaceProComponent", System.Data.SqlDbType.VarChar).Value = ComponentName;
                        cmd.Parameters.Add("@RawComponentBarcode", System.Data.SqlDbType.VarChar).Value = ComponentName;
                        cmd.Parameters.Add("@ComponentBarcodeFragment", System.Data.SqlDbType.VarChar).Value = ComponentName;
                        cmd.Parameters.Add("@Quantity", System.Data.SqlDbType.Int).Value = Quantity;
                        cmd.Parameters.Add("@OriginalQuantity", System.Data.SqlDbType.Int).Value = OriginalQuantity;
                        cmd.Parameters.Add("@Batch", System.Data.SqlDbType.VarChar).Value = Batch;
                        cmd.Parameters.Add("@BrightnessClass", System.Data.SqlDbType.VarChar).Value = Batch;
                        cmd.Parameters.Add("@Extra1", System.Data.SqlDbType.VarChar).Value = Extra1;
                        cmd.Parameters.Add("@Extra2", System.Data.SqlDbType.VarChar).Value = Extra2;
                        cmd.Parameters.Add("@Extra3", System.Data.SqlDbType.VarChar).Value = Extra3;
                        cmd.Parameters.Add("@Comment", System.Data.SqlDbType.VarChar).Value = Comment;
    
                        con.Open();
    
                        result = cmd.ExecuteNonQuery() == 1;
                    }

    Laut meinem Code gibt es keine Übergabe an ein Date-Field. Alle Felder die ich hier übergebe sind nvarchar oder int. Da ist genau das was ich nicht verstehe. Kein Feld im Code ist vom Typ Datetime.


    Freitag, 19. Dezember 2014 14:08
  • Im SQL-Server ist für eine Datum-Spalte  ein Default-Wert hinterlegt.

    Hallo,

    wie sieht die Hinterlegung konkret aus, ein fixes Datum als String? In welchem Format? Nutzt die Anwendung Windows Authentifizierung zur Anmeldung an den SQL Server oder einen eigenen SQL Login?

    Wenn es ein Datum als fester String ist, sollte der besser sprachenneutral formatiert sein, um Konvertierungsfehler aufgrund von Spracheinstellungen zu vermeiden.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Freitag, 19. Dezember 2014 14:29
  • DEFAULT (N'1753-01-01 00:00:00.000')

    Das ist das was ich im SQL-Script sehe wenn ich die Tabelle neu erstellen würde. Ist eine Tabelle vom Hersteller, da weiß ich natürlich nicht ob die das auch so per Default eingetragen haben.

    Es gibt ein SQL-Login. Update, Select funktioniert tadellos.

    Freitag, 19. Dezember 2014 14:43
  •                     cmd.Parameters.Add("@ManufactureDate", System.Data.SqlDbType.DateTime).Value = System.Data.SqlTypes.SqlDateTime.MinValue;
                        cmd.Parameters.Add("@ExpiryDate", System.Data.SqlDbType.DateTime).Value = System.Data.SqlTypes.SqlDateTime.MaxValue;
                        cmd.Parameters.Add("@DepletedDate", System.Data.SqlDbType.DateTime).Value = System.Data.SqlTypes.SqlDateTime.MaxValue;
                        cmd.Parameters.Add("@MsdOpenDate", System.Data.SqlDbType.DateTime).Value = System.Data.SqlTypes.SqlDateTime.MinValue;
                        cmd.Parameters.Add("@LastModifiedDate", System.Data.SqlDbType.DateTime).Value = System.Data.SqlTypes.SqlDateTime.MinValue;
                        cmd.Parameters.Add("@VerifiedDate", System.Data.SqlDbType.DateTime).Value = System.Data.SqlTypes.SqlDateTime.MinValue;
                        cmd.Parameters.Add("@LastProductionDate", System.Data.SqlDbType.DateTime).Value = System.Data.SqlTypes.SqlDateTime.MinValue;
    Lösung des Problems... einfach den Datum-Werts als Parameter mit übergeben :-)
    • Als Antwort markiert David Stania Freitag, 19. Dezember 2014 14:54
    Freitag, 19. Dezember 2014 14:54