Welcher Datentyp muss beim SQL-Server für ein Double verwendet werden?



  • In meiner MFC-Anwendung soll ich jetzt Messdaten in eine SQL-Datenbank (MS SQL-Server 2019) abspeichern. Ich habe mit meiner alten VS 2015 eine ODBC-Consumer-Klasse erstellt, da VS 2019 das nicht mir unterstützt. In den Tabellen im SQL-Server habe ich als Datentyp float verwendet, da ich das in der Doku so entnommen habe. Die Consumerklasse interpretiert das aber in C++ als float und die Datenaustauschfunktion benutzt auch die Version für float:

    in *.h
    float	m_RadiusIZyl_rechts_min;
    
    in *.cpp
    DoFieldExchange(CFieldExchange* pFX)
    RFX_Single(pFX, _T("[RadiusIZyl_rechts_min]"), m_RadiusIZyl_rechts_min);
    

    Welcher Datentyp ist auf der SQL-Serverseite der korrekte Typ für einen Double unter C++?



  • eine kurze suche nach "sql server double" ergab folgendes:

    https://stackoverflow.com/questions/1209181/what-represents-a-double-in-sql-server



  • @firefly Danke für den Link. Den hab ich auch gesehen. Dort bezieht man sich aber auf .net /CLR. Interpretiert .net einen die internen Datentypen exakt wie C++?
    Ich kann also jetzt problemlos im ODBC-Consumer das float gegen ein double und das RFX_Single gegen ein RFX_Double tauschen?



  • @AndyDD sagte in Welcher Datentyp muss beim SQL-Server für ein Double verwendet werden?:

    Ich kann also jetzt problemlos im ODBC-Consumer das float gegen ein double und das RFX_Single gegen ein RFX_Double tauschen?

    Ich denke das sollte funktionieren. Probier's doch einfach aus.



  • @hustbaer
    Das werde ich tun. Jedoch Probleme durch Rundungsfehler sind dann immer schwer zu finden. Möglicherweise benötige ich die Genauigkeit von double, da oft weniger Stellen betrachtet werden.



  • @AndyDD sagte in Welcher Datentyp muss beim SQL-Server für ein Double verwendet werden?:

    Jedoch Probleme durch Rundungsfehler sind dann immer schwer zu finden. Möglicherweise benötige ich die Genauigkeit von double, da oft weniger Stellen betrachtet werden.

    Das lässt sich doch recht einfach ausprobieren. float hat weniger als 32 Bit Mantisse, double hat mehr. D.h. in einem double kannst du Zahlen wie 4294967297 (=2^32 + 1) noch exakt darstellen. In einem float nicht. Also schieb über deine Anwendung so einen Wert in die DB rein, und dann guck was in der DB steht. Wenn da dann die selbe Zahl drinnen steht, dann funktioniert zumindest schonmal der Weg Anwendung -> DB. Dann liest du den Wert wieder über deine Anwendung aus der DB aus. Wenn da auch wieder das richtige rauskommt, dann funktioniert auch der Weg DB -> Anwendung.



  • @hustbaer
    Ich hab das jetzt ausprobiert. Es scheint innerhalb der von den Randbedinungen geforderten Genauigkeit zu funktionieren.


Log in to reply