|
-
18-12-2006, 12:26
|
|
Χαίρετε...
Έχω την εξής απορία...
Σε μια φόρμα (vb2005) έχω το textbox μου που χρησιμεύει για την εισαγωγή τιμής σαν δεκαδικό έχω αποκλείσει να δέχεται τον χαρακτήρα "," και δέχεται "."
αυτή την τιμή θέλω να την αποθηκεύω σε ένα table της access 2000
στο sql statement λοιπόν περνάει κανονικά το "." αλλά λόγω των region settings αποθηκεύεται στην access ως ακέραιος!
υπάρχει καμιά ιδέα πως ένας δεκαδικός μπορεί να εισαχθεί σε μια access?
κάτι μου διαφεύγει...
ευχαριστώ...................
|
|
-
18-12-2006, 12:52
|
|
xmmm
ναι!
επρεπε να περάσει σαν string
sorry για το άσκοπο μήνυμα...
sorry admins!
|
|
-
18-12-2006, 13:17
|
|
Πάντως η όλη λογική είναι αρκετά λάθος. Όταν θέλεις να αποθηκεύσεις έναν αριθμό σε μια βάση, τότε η αντίστοιχη στήλη πρέπει να έχει οριστεί σαν αριθμητική. Ο χρήστης πρέπει να δίνει στο 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. Είναι παλιά εντολή, αλλά την έβαλα χάρην συντομίας.
Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
|
|
-
19-12-2006, 12:56
|
|
χμμ
Δημήτρη σε ευχαριστώ,
άλλαξα τη διαδικασία που περιέγραφα πιο πάνω λίγο πριν γράψεις νομίζω κατάλαβα τι παίζει και το διόρθωσα...
αυτό που θέλω να ρωτήσω είναι το εξής:
Αν τα settings είναι greek και στέλνω μια τιμή "0.00" στην access την καταλαβαίνει σαν ακέραιο "000" αν στείλω με τη μορφή "0,00" τη περνάει σαν δεκαδικό
Αν τα settings είναι english το αντίστοιχο...
θα πρέπει να στέλνω το string (στο sql statement) ανάλογα με τα settings του κάθε χρήστη; και αν ναι, πώς μπορώ να ζητήσω τα settingsq
|
|
-
19-12-2006, 13:11
|
|
όπως σου γράφω και παραπάνω, όντα γράφεις ένα sql statement, τότε οι αριθμοί πρέπει να έχουν πάντα τελεία σαν υποδιαστολή.
π.χ. UPDATE MYTABLE SET MYNUMERICCOLUMN=3.324 όπου MYNUMERICCOLUMN είναι στήλη που είναι αριθμητικού τύπου και όχι αλφαριθμητικού.
Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
|
|
-
19-12-2006, 13:14
|
|
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
|
|
Γι αυτό το λόγο πρέπει να προτιμάς να χρησιμοποιείς parameters στα queries αντί να περνάς τις τιμές σαν strings. Με τα parameters δεν χρειάζεται να ασχοληθείς με τύπους και υποδιαστολές και μετατροπές. Οπωσδήποτε, μην προσπαθήσεις να "διορθώσεις" την συμπεριφορά της VB σε αυτό το θέμα, καθώς ....΄
Γιατί νομίζω ότι αυτό ακριβώς έγραφα και πριν μία εβδομάδα? Μήπως οι ερωτήσεις αυτού του τύπου αποτελούν τις πιο συχνές ερωτήσεις σε όλο το DNZ?
Παναγιώτης Καναβός, Freelancer Twitter: http://www.twitter.com/pkanavos
|
|
-
19-12-2006, 14:27
|
|
Παιδιά... cool. Ο άνθρωπος είχε μια πολύ συγκεκριμένη απορία. Για την ακρίβεια δεν ήταν καν απορία. Απλά είναι μια παρεξήγηση της χρήσης της υποδιαστολής, γι αυτό και θεώρησα σκόπιμο να το διευκρινίσω, χωρίς καν να ρωτήσει.
Από 'κει και πέρα η χρήση των sqlcommand object αντί για direct sql είναι ένα άλλο θέμα, το οποίο νομίζω δεν είναι επί του παρόντος!
Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
|
|
-
19-12-2006, 15:15
|
|
Δεν κατάλαβες τον πόνο μου. Δεν τα βάζω με τον άνθρωπο. Απλά τους τελευταίους μήνες μου φαίνεται ότι το πιο συχνό bug που συναντώ έχει να κάνει με τα regional settings! Και καλά όταν μιλάμε για μικρές εφαρμογές, ή νέους χρήστες. Αλλά σε μεγάλες εφαρμογές, η προσπάθεια "διόρθωσης" των settings μπορεί να οδηγήσει σε πραγματικά τραγικές καταστάσεις!
Παναγιώτης Καναβός, Freelancer Twitter: http://www.twitter.com/pkanavos
|
|
-
19-12-2006, 15:21
|
|
ευχαριστώ για την ανταπόκριση...
δουλεύω με 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
|
|
θα προσπαθήσω να καταλάβω πως λειτουργούν τα parameters...
|
|
-
19-12-2006, 16:18
|
|
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
|
|
Το PPrice τί τύπου είναι? Το έχεις ορίσει decimal?
Παναγιώτης Καναβός, Freelancer Twitter: http://www.twitter.com/pkanavos
|
|
-
19-12-2006, 21:37
|
-
19-12-2006, 23:19
|
|
Pak wrote: | Αν είναι και δέν βρείς άλλο τρόπο μπορείς να αλλάζεις τα Regional settings από τον κώδικα. Δηλαδή να τα κάνεις en-US να κάνεις την δουλειά σου και μετά να τα επαναφέρεις σε el-GR... |
|
Αυτό δεν είναι καθόλου καλή λύση! Το αντίθετο!
Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
|
|
Σελίδα 1 από 3 (38 εγγραφές)
1
|
|
|