Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Currency???

Îåêßíçóå áðü ôï ìÝëïò Ευθύμης Δημόπουλος. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 23-12-2006, 08:30. Υπάρχουν 37 απαντήσεις.
Σελίδα 1 από 3 (38 εγγραφές)   1 2 3 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  18-12-2006, 12:26 22436

    Currency???

    Χαίρετε...

    Έχω την εξής απορία...

    Σε μια φόρμα (vb2005) έχω το textbox μου που χρησιμεύει για την εισαγωγή τιμής σαν δεκαδικό
    έχω αποκλείσει να δέχεται τον χαρακτήρα "," και δέχεται "."

    αυτή την τιμή θέλω να την αποθηκεύω σε ένα table της access 2000

    στο sql statement λοιπόν περνάει κανονικά το "." αλλά λόγω των region settings
    αποθηκεύεται στην access ως ακέραιος!


    υπάρχει καμιά ιδέα πως ένας δεκαδικός μπορεί να εισαχθεί σε μια access?

    κάτι μου διαφεύγει...

    ευχαριστώ...................
  •  18-12-2006, 12:52 22437 σε απάντηση της 22436

    Απ: Currency???

    xmmm

    ναι!

    επρεπε να περάσει σαν string

    sorry για το άσκοπο μήνυμα...

    sorry admins!
  •  18-12-2006, 13:17 22439 σε απάντηση της 22437

    Απ: Currency???

    Πάντως η όλη λογική είναι αρκετά λάθος. Όταν θέλεις να αποθηκεύσεις έναν αριθμό σε μια βάση, τότε η αντίστοιχη στήλη πρέπει να έχει οριστεί σαν αριθμητική. Ο χρήστης πρέπει να δίνει στο textbox το αριθμό χρησιμοποιώντας ως υποδιαστολή τον χαρακτήρα που ο ίδιος έχει επιλέξει μέσω των regional options και το query σου που κάνει το update πρέπει να έχει τον αριθμό πάντα με υποδιαστολή την τελεία, μια που αυτή είναι η σωστή σύνταξη στην sql:

    Στην φόρμα:

    MyTextBox.Text = "3,43" ' αυτό υποτίθεται ότι το δίνει ο χρήστης στην οθόνη

    Dim number as Double = Convert.ToDouble(MyTextBox.Text)

    Στο επίπεδο αποθήκευσης στη βάση:

    Dim numberForSQL as string = STR(number)

    Dim sql as String = "INSERT INTO Mytable (myColumn) VALUES (" & numberForSQL & ")"

    Σημείωση: Η STR μετατρέπειν τον αριθμό σε string χρησιμοποιώντας πάντα την τελεία ως υποδιαστολή, ανεξάρτητα από τα regional options. Είναι παλιά εντολή, αλλά την έβαλα χάρην συντομίας.
    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  19-12-2006, 12:56 22480 σε απάντηση της 22439

    Απ: Currency???

    χμμ

    Δημήτρη σε ευχαριστώ,

    άλλαξα τη διαδικασία που περιέγραφα πιο πάνω λίγο πριν γράψεις
    νομίζω κατάλαβα τι παίζει και το διόρθωσα...


    αυτό που θέλω να ρωτήσω είναι το εξής:

    Αν τα settings είναι greek
    και στέλνω μια τιμή "0.00" στην access την καταλαβαίνει σαν ακέραιο "000"
    αν στείλω με τη μορφή "0,00" τη περνάει σαν δεκαδικό


    Αν τα settings είναι english
    το αντίστοιχο...

    θα πρέπει να στέλνω το string (στο sql statement)
    ανάλογα με τα settings του κάθε χρήστη;
    και αν ναι,  πώς μπορώ να ζητήσω τα settingsq



  •  19-12-2006, 13:11 22482 σε απάντηση της 22480

    Απ: Currency???

    όπως σου γράφω και παραπάνω, όντα γράφεις ένα sql statement, τότε οι αριθμοί πρέπει να έχουν πάντα τελεία σαν υποδιαστολή.

    π.χ. UPDATE MYTABLE SET MYNUMERICCOLUMN=3.324 όπου MYNUMERICCOLUMN είναι στήλη που είναι αριθμητικού τύπου και όχι αλφαριθμητικού.
    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  19-12-2006, 13:14 22484 σε απάντηση της 22439

    Απ: Currency???

     papadi wrote:
    Στο επίπεδο αποθήκευσης στη βάση:

    Dim numberForSQL as string = STR(number)

    Dim sql as String = "INSERT INTO Mytable (myColumn) VALUES (" & numberForSQL & ")"

    Σημείωση: Η STR μετατρέπειν τον αριθμό σε string χρησιμοποιώντας πάντα την τελεία ως υποδιαστολή, ανεξάρτητα από τα regional options. Είναι παλιά εντολή, αλλά την έβαλα χάρην συντομίας.


    Η εισαγωγή των δεδομένων σαν "καρφωτά" strings μέσα σε SQL statements είναι μια πρακτική που πρέπει να αποφεύγουμε για λόγους ασφάλειας (SQL injection) και επιδόσεων (δε δίνουμε στον query parser να επαναχρησιμοποιεί execution plans). Το σωστό είναι να έχουμε ένα statement της μορφής:
    Dim sql as String = "INSERT INTO Mytable (myColumn) VALUES (?)"
    Και στο IDbCommand που θα εκτελέσουμε (εδώ υποθέτω OdbcCommand, γι' αυτό και η παράμετρος είναι με ?) προσθέτουμε την παράμετρο με την CreateParameter.
    Έτσι λύνονται αυτομάτως και όλα τα προβλήματα με τις υποδιαστολές και τις τελείες.

    Νατάσα Μανουσοπούλου
  •  19-12-2006, 13:48 22487 σε απάντηση της 22480

    Απ: Currency???

    Γι αυτό το λόγο πρέπει να προτιμάς να χρησιμοποιείς parameters στα queries αντί να περνάς τις τιμές σαν strings. Με τα parameters δεν χρειάζεται να ασχοληθείς με τύπους και υποδιαστολές και μετατροπές. Οπωσδήποτε, μην προσπαθήσεις να "διορθώσεις" την συμπεριφορά της VB σε αυτό το θέμα, καθώς ....΄

    Γιατί νομίζω ότι αυτό ακριβώς έγραφα και πριν μία εβδομάδα? Μήπως οι ερωτήσεις αυτού του τύπου αποτελούν τις πιο συχνές ερωτήσεις σε όλο το DNZ?
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  19-12-2006, 14:27 22488 σε απάντηση της 22487

    Απ: Currency???

    Παιδιά... cool. Ο άνθρωπος είχε μια πολύ συγκεκριμένη απορία. Για την ακρίβεια δεν ήταν καν απορία. Απλά είναι μια παρεξήγηση της χρήσης της υποδιαστολής, γι αυτό και θεώρησα σκόπιμο να το διευκρινίσω, χωρίς καν να ρωτήσει.

    Από 'κει και πέρα η χρήση των sqlcommand object αντί για direct sql είναι ένα άλλο θέμα, το οποίο νομίζω δεν είναι επί του παρόντος!
    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  19-12-2006, 15:15 22493 σε απάντηση της 22488

    Απ: Currency???

    Δεν κατάλαβες τον πόνο μου. Δεν τα βάζω με τον άνθρωπο. Απλά τους τελευταίους μήνες μου φαίνεται ότι το πιο συχνό bug που συναντώ έχει να κάνει με τα regional settings! Και καλά όταν μιλάμε για μικρές εφαρμογές, ή νέους χρήστες. Αλλά σε μεγάλες εφαρμογές, η προσπάθεια "διόρθωσης" των settings μπορεί να οδηγήσει σε πραγματικά τραγικές καταστάσεις! Sad
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  19-12-2006, 15:21 22494 σε απάντηση της 22488

    Απ: Currency???

    ευχαριστώ για την ανταπόκριση...

    δουλεύω με oledbcommand

    θα δοκιμάσω τα parameters...

    ένα απόσπασμα από τον κώδικά μου αυτή τη στιγμή είναι το εξής:

    Dim appath

    appath = My.Application.Info.DirectoryPath

    appath = appath & "\db1.mdb"

    Dim ConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & appath & ";User ID=Admin;Password=; "

    Using connection As New OleDbConnection(ConnectionString)

    Dim command As New OleDbCommand

    Dim transaction As OleDbTransaction

    Dim sqlstmt As String

    sqlstmt = "INSERT INTO Book ("

    sqlstmt = sqlstmt & "Title, SubTitle, Version, Lan, ShortDescription, ISBN, Place, NFO, Price, CategoryID, Writer, Publisher, Translator, Pages, DYear, Quantity) VALUES ('"

    sqlstmt = sqlstmt & TTitle & "', "

    sqlstmt = sqlstmt & "'" & SSubTitle & "', "

    sqlstmt = sqlstmt & "'" & VVersion & "', "

    sqlstmt = sqlstmt & "'" & LLan & "', "

    sqlstmt = sqlstmt & "'" & DDescr & "', "

    sqlstmt = sqlstmt & "'" & IISBN & "', "

    sqlstmt = sqlstmt & "'" & PPlace & "', "

    sqlstmt = sqlstmt & "'" & NNFO & "', "

    sqlstmt = sqlstmt & "'" & xe & "', "

    sqlstmt = sqlstmt & CCatID & ", " & WWri & ", " & PPub & ", " & TTran & ", " & PPages & ", " & YYear & ", " & QQuantity & ");"

    Try

    connection.Open()

    transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)

    command.Connection = connection

    command.Transaction = transaction

    command.CommandText = sqlstmt

    command.ExecuteNonQuery()

    transaction.Commit()

    MessageBox.Show("Done", "Complete successfull", MessageBoxButtons.OK)

    Catch ex As Exception

    MessageBox.Show(ex.Message, "Incomplete action", MessageBoxButtons.OK)

    Try

    transaction.Rollback()

    Catch ex2 As Exception

    MessageBox.Show(ex2.Message, "Failure Rollback", MessageBoxButtons.OK)

    End Try

    End Try

    End Using

  •  19-12-2006, 15:27 22495 σε απάντηση της 22494

    Απ: Currency???

    θα προσπαθήσω να καταλάβω πως λειτουργούν τα parameters...
  •  19-12-2006, 16:18 22500 σε απάντηση της 22495

    Απ: Currency???

    xmmmm

    όλα καλά ρε παιδιά...

    όταν όμως περνάει με τη μορφή "3.14" --> στην ACCESS αποθηκεύεται σαν "314"

    όταν περνάει με τη μορφή "3,14" --> τότε αποθηκεύεται σαν "3,14"

    τι δεν καταλαβαίνω...?

    *****************

    ...

    PPrice = CDec(txtPrice.Text)

    Using connection As New OleDbConnection(ConnectionString)

    Dim command As New OleDbCommand

    Dim transaction As OleDbTransaction

    Dim sqlstmt As String

    sqlstmt = "INSERT INTO Book (Title, Price) VALUES (?,?)"



    Try

    connection.Open()

    transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)

    command.Connection = connection

    command.Transaction = transaction

    command.CommandText = sqlstmt

    command.Parameters.Add("@p1", OleDbType.Char, 50).Value = txtTitle.Text

    command.Parameters.Add("@p2", OleDbType.Decimal).Value = PPrice

    command.ExecuteNonQuery()

    transaction.Commit()

    MessageBox.Show("Done", "Complete successfull", MessageBoxButtons.OK)

    ....

    *************************

  •  19-12-2006, 17:15 22504 σε απάντηση της 22494

    Απ: Currency???

    Το PPrice τί τύπου είναι? Το έχεις ορίσει decimal?
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  19-12-2006, 21:37 22529 σε απάντηση της 22504

    Απ: Currency???

    Βεβαιώσου ότι το PPrice είναι decimal. Αν είναι και δέν βρείς άλλο τρόπο μπορείς να αλλάζεις τα Regional settings από τον κώδικα. Δηλαδή να τα κάνεις en-US να κάνεις την δουλειά σου και μετά να τα επαναφέρεις σε el-GR...
    View Παναγιώτης Χαραλάμπους's profile on LinkedIn
    Coding at Mediterranean Acoustics
  •  19-12-2006, 23:19 22532 σε απάντηση της 22529

    Απ: Currency???

     Pak wrote:
    Αν είναι και δέν βρείς άλλο τρόπο μπορείς να αλλάζεις τα Regional settings από τον κώδικα. Δηλαδή να τα κάνεις en-US να κάνεις την δουλειά σου και μετά να τα επαναφέρεις σε el-GR...

    Αυτό δεν είναι καθόλου καλή λύση! Το αντίθετο!

    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
Σελίδα 1 από 3 (38 εγγραφές)   1 2 3 >
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems