Toon posts:

[MSSQL / VB6] Decimale waarden met komma in query

Pagina: 1
Acties:

Verwijderd

Topicstarter
Een functie van een bepaalde audio-DLL geeft op verzoek de lengte van een bepaald audiobestand terug. Zoiets als dit:

code:
1
2
Dim FileLength as Double
FileLength = GetFileLength(txtFile.text)


FileLength zou in dit geval de waarde "352,35339" kunnen aannemen. De vraag is nu: hoe krijg ik deze waarde in een MSSQL database?

De query loopt in eerste instantie in de soep, dankzij de komma die gebruikt wordt in FileLength. Elders wordt er gesuggereerd om van de komma zomaar een punt van te maken (met een Replace-functie), maar behalve dat dat relatief traag kan zijn, betekent dat dan ook dat ik FileLength behandel als een String en niet meer als Double.

Ook tussen dubbele of enkele aanhalingstekens ontstaan er problemen. Bij dubbele krijg ik "this name is not permitted in this context" en bij enkele aanhalingstekens staat er dat hij VARCHAR niet kan converteren naar FLOAT. Blijkbaar wordt alles tussen enkele aanhalingstekens gezien als string en dat past inderdaad niet in een FLOAT datatype.

Ten slotte heb ik ook square brackets geprobeerd, maar ook dat helpt niet.

Iemand enig idee?

Verwijderd

Ik snap niet hoe uit een lengte van een file een getal achter de komma kan komen, maar dat kan aan mij liggen.

Het probleem zit hem in de cultuursettings waaronder de applicatie draait. In Nederland is een comma het scheidingsteken, in Engelstalige gebieden is dat de punt, en dat is daarom in veel software ook zo. Je kunt gelukkig binnen .net applicaties de cultuur aanpassen. Zie http://msdn.microsoft.com...urrentcultureproperty.asp voor meer info.

HTH :)

Edit: d'oh, VB6, niet VB.Net .... |:(
/me moet beter lezen ...

[ Voor 8% gewijzigd door Verwijderd op 31-08-2005 10:22 ]


Verwijderd

Topicstarter
Thanks MrX voor je reply!

Met lengte bedoelde ik overigens de lengte van het audiobestand in seconden, vandaar dat decimalen dan wel mogelijk zijn. :)

Het probleem is dat ik in VB6 werk en daar kan ik voorzover ik weet niets veranderen dat betrekking heeft op de system locale. Ik weet idd dat het in .net wel kan, maar da's helaas niet voor mij weggelegd...

Het enige wat ik nog zou kunnen doen is het getal vermenigvuldigen met 10^3 of zo en dan de decimalen erafhalen. Dat is voor mij opzich een workaround die voldoet (met 10^3 sla ik dus eigenlijk in milliseconden op en dat is genoeg voor mij), maar ik zou toch wel graag weten hoe dit op de normale manier zou moeten. :)

Verwijderd

conversietruukje
Visual Basic:
1
2
3
4
5
6
7
8
9
Public Function DoubleToString(Value As Double) As String
  If InStr(0.5, ",") > 0 Then
    ' Decimaalteken is komma
    DoubleToString = Replace(Value, ",", ".")
  Else
    ' Decimaalteken is punt
    DoubleToString = Value
  End If
End Function

Deze functie geeft een double altijd met een . als decimaalteken terug, onafhankelijk van de landinstellingen.

[ Voor 24% gewijzigd door Verwijderd op 31-08-2005 01:34 ]


  • BertS
  • Registratie: September 2004
  • Laatst online: 13-02 08:33
@FFrenzy:
Je hebt alleen maar deze regel nodig:
Visual Basic:
1
DoubleToString = Replace(Value, ",", ".")

Als er geen komma in Value staat, wordt er ook niets gereplaced. Lijkt me toch wat efficienter dan eerst nog de positie van de komma bepalen :)

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 20:17

Janoz

Moderator Devschuur®

!litemod

Die komma komt er pas in zodra je van de double een string maakt (waarschijnlijk bij het opbouwen van de query). In plaats van al die ranzige replace methoden kun je beter gebruik maken van geparameteriseerde queries. Dat vorkomt gelijk ook een heleboel andere problemen. Meer over geparameteriseerde queries is afaik wel in de faq te vinden.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1