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

 

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

Ποιό είναι το πρόβλημα;

Îåêßíçóå áðü ôï ìÝëïò mdtgr. Τελευταία δημοσίευση από το μέλος agrammenos στις 01-03-2007, 15:19. Υπάρχουν 10 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  26-02-2007, 18:41 25467

    Ποιό είναι το πρόβλημα;

    Αγαπητοί φίλοι όταν κάνω debug τον παρακάτω κώδικα

    Private Sub btnEggrafi_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEggrafi.Click

    Dim sDateAgoras As String = CStr(Me.txtDateAgoras.Text)

    Dim sPromitheftis As String = CStr(Me.cmbPromitheytis.Text)

    Dim sArParast As Integer = CInt(Me.txtArParast.Text)

    Dim conn As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Test.mdb")

    Dim strSQL As String

    strSQL = "INSERT INTO tblParalavi (DateAgoras,Promitheytis,ArParast) VALUES ('" + sDateAgoras + "','" + sPromitheftis + "','" + sArParast + "')"

    έχω το εξής πρόβλημα:

    Το μήνυμα λάθους που παίρνω στην προκειμένη περίπτωση είναι: Conversion from string "INSERT INTO tblParalavi (DateAgo" to type 'Double' is not valid.

    Αν τώρα αντικαταστήσω στο strSQL to '" + sArParast + "' με ' + sArParast +' παίρνω το μήνυμα λάθους:Data type mismatch in criteria expression.

    Αν το παραλείψω τελείως γράφω στη Βάση (Access2000) κανονικά.

    Χρειάζομαι τη βοήθειά σας γιατί δεν μπορώ να καταλάβω τι συμβαίνει.

    Επίσης αν μπρούσε κάποιος να μου εξηγήσει πότε και γιατί χρειάζεται τα '"+

    Ευχαριστώ για τη βοήθεια.


    Μάνος Τ.
  •  26-02-2007, 19:03 25468 σε απάντηση της 25467

    Απ: Ποιό είναι το πρόβλημα;

    Για σου.

    Καλό είναι να είναι ποιο συγκεκριμένος ο Τίτλος . Π.Χ. Έχω πρόβλημα με αυτό «…» ή μου «βγάζει πρόβλημα όταν κάνω αυτό» κ.τ.λ.

    Μια μικρή συμβουλή.

  •  26-02-2007, 19:52 25471 σε απάντηση της 25467

    Απ: Ποιό είναι το πρόβλημα;

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

    Ρίξε μια ματιά εδώ: http://msdn2.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.parameters.aspx. Λέει για UPDATE αλλά ακριβώς το ίδιο ισχύει και για το INSERT.


    Vir prudens non contra ventum mingit
  •  26-02-2007, 20:09 25472 σε απάντηση της 25467

    Απ: Ποιό είναι το πρόβλημα;

    Μανο,

    το πρόβλημά σου, αν και απλό, είναι σύνθετο για κάποιον που τώρα ξεκινά. Να συμφωνήσω κατ'αρχήν με τον Θωμά οτι το θεμα της δημοσίευσης καλό θα ήταν να είναι πιό συγκεκριμένο για να μπορούμε γρήγορα να εντοπίζουμε τι είναι αυτό που απασχολεί τον συντάκτη της δημοσίευσης. Παμε λοιπόν να δούμε λίγο τι συμβαίνει με το θέμα σου:

    Αυτό που προσπαθείς να κάνεις είναι να δημιουργήσεις ένα string το οποίο θα στείλεις στην Access. Το string αυτό θα είναι ένα SQL Insert Query. Για να το κάνεις αυτό, συνενώνεις την εντολή INSERT INTO και τις τιμές κάποιων μεταβλητών που έχεις ορίσει.

    Ομως, η εντολη INSERT INTO έχει κάποιους κανόνες. Για παράδειγμα (ας υποθέσουμε οτι ο πίνακάς σου είχε ένα πεδίο κάθε φορά και όχι τρία όπως τώρα), αν έδινες τις εντολές απευθείας (και όχι μέσα από script) θα μπορούσες να έχεις κάποιες περιπτώσεις όπως τις παρακάτω:

    INSERT INTO tblParalavi (Promitheytis) VALUES ('Sotiris')
    INSERT INTO tblParalavi (ArParast) VALUES (954)

    Γιατί στην πρώτη εντολή έβαλα τα μονά εισαγωγικά και στη δεύτερη όχι; Μα γιατί το πρώτο INSERT αφορά σε πεδίο τύπου string (η, για να είμαι πιό ακριβής, char κατά τον ορισμό της access). Η τιμή λοιπόν που πρέπει να του περάσω είναι ένα string. Το δεύτερο INSERT αφορά εισαγωγή σε πεδίο τύπου integer (number), οπότε εκεί περνάω μια τιμή ως έχει. Αν προσπαθήσω στη δεύτερη περίπτωση να περάσω κάτι τέτοιο:

    INSERT INTO tblParalavi (ArParast) VALUES ('954')

    Θα πάρω το μήνυμα "Data type mismatch in criteria expression". Αυτό, γιατί θα προσπαθήσω να περάσω το STRING '954' (το οποίο δεν έχει διαφορά από το string 'bourboulia' π.χ.) σε ένα ΑΡΙΘΜΗΤΙΚΟ πεδίο. Αρα, τι σφάλμα προκύπτει; Λάθος data type (data type mismatch). Πού προκύπτει; Στο criteria expression μου (στο VALUES κομμάτι του query, το οποίο για την Access είναι το criteria expression).

    Ωραία μέχρι εδώ. Τώρα, εσύ προσπαθείς όλα αυτά να τα συνδυάσεις σε ένα μεγααααλο string επιχειρώντας να εισάγεις τιμές σε τρία πεδία με διαφορετικά data types το καθένα. Ας προσπαθήσουμε να φτιάξουμε το string σου με ενα πεδίο στην αρχή:

    strSQL="INSERT INTO tblParalavi (Promitheytis) VALUES ('" + sPromitheytis + "')"

    Εδώ ενώνεις το string σου με την τιμή της μεταβλητής sPromitheytis. Ομως, επειδή το πεδίο Promitheytis του πίνακά σου είναι τύπου char, θα χρειαστείς αυτάκια γύρω από την τιμή του sPromitheytis. Αν το sPromitheytis εχει την τιμή "Μήτσος", το τελικό αποτέλεσμα που θα μπεί στη μεταβλητή strSQL θα είναι το εξής:

    INSERT INTO tblParalavi (Promitheytis) VALUES ('Μήτσος')

    Ωραία. Ας το δοκιμάσουμε με το δεύτερο πεδίο:

    strSQL="INSERT INTO tblParalavi (ArParast) VALUES (" + sArParast + ")"

    Προσεξες οτι εδώ, που έχουμε να κάνουμε με το ΑΡΙΘΜΗΤΙΚΟ πεδίο ArParast δεν έβαλα αυτάκια; Γιατί; Γιατί θέλεις να βγεί στο τέλος ένα string χωρίς αυτάκια γύρω από την τιμή του sArParast το οποίο είναι νούμερο. Βεβαια, εδώ υπάρχει ένα παράδοξο: Προσπαθούμε να κάνουμε ένωση ενός string (που αντιπροσωπεύει την εντολή insert into) με την τιμή του sArParast που είναι αριθμός. Η Access, βέβαια, μας προφυλάσσει από λάθη χρησιμοποιώντας κάποιο implicit conversion.  Αν όμως παίρνουμε σφάλμα (που είναι πολύ πιθανό), καλό ειναι να κάνουμε το εξής (εύχομαι να το γράφω σωστά):

    strSQL="INSERT INTO tblParalavi (ArParast) VALUES (" + cStr(sArParast) + ")"

    Η συνάρτηση cStr μετατρέπει την τιμή του arParast σε string για να ενωθεί με τα υπόλοιπα κομμάτια δίνοντας τιμή στην strSQL. Ομως, η τιμή συνεχίζει να μην έχει αυτάκια, οπότε μόλις την "δώσεις" στην Access θα καταλάβει οτι είναι αριθμός.

    Για το πρώτο σου πεδίο DateAgoras, το οποίο επιχειρείς να περάσεις ΜΕ αυτάκια, επειδή είναι πεδίο datetime, η access "συγχωρεί" την ασυμβατότητα μετατρέποντας το string που θα της περάσεις (με αυτάκια) σε τιμή datetime.

    Αρα λοιπόν μια σωστή συνολική σύνταξη θα ήταν:

    strSQL =
    "INSERT INTO tblParalavi (DateAgoras,Promitheytis,ArParast) VALUES ('"+ sDateAgoras +  "' ,' " + sPromitheftis + "'," + sArParast + ")"

    Εχοντας αυτάκια ουσιαστικά γύρω από τις δύο πρώτες μεταβλητές μας. Αυτό θα μας έδινε εντέλει σαν τιμή του strSQL το string (παράδειγμα:)

    INSERT INTO tblParalavi (DateAgoras,Promitheytis,ArParast) VALUES ('1/1/2000', 'Makis o ftinos', 1032)

    Το άλλο error που παίρνεις εκτιμώ οτι οφείλεται σε λανθασμένη χρήση των "αυτακίων". Γενικά τα διπλά quotes οριοθετούν ένα string ενώ τα μονά quotes οριοθετούν τα "αυτάκια" γύρω από τις τιμές των μεταβλητών που θα προκύψουν στο τελικό query.

    Ελπίζω να βοήθησα λίγο.

     


     

     


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  26-02-2007, 20:11 25473 σε απάντηση της 25472

    Απ: Ποιό είναι το πρόβλημα;

    Και ναι, επειδή με πρόλαβε ο Μανος την ώρα που σου έγραφα την μακροσκελή απάντηση, η τεχνική συνένωσης strings για τη δημιουργία ενός query είναι ΛΑΝΘΑΣΜΕΝΗ. Προτείνω, αφού καταλάβεις γιατί συμβαίνουν όσα συμβαίνουν, να ρίξεις μια ματιά στο link που παραθέτει.

     


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  26-02-2007, 20:29 25476 σε απάντηση της 25473

    Απ: Ποιό είναι το πρόβλημα;

    Εγώ θα σου πρότεινα ούτε καν να προσπαθήσεις να διορθώσεις σύμφωνα με αυτά που σου έγραψε ο Σωτήρης! File, New Project!


    Vir prudens non contra ventum mingit
  •  28-02-2007, 22:31 25653 σε απάντηση της 25476

    Απ: Ποιό είναι το πρόβλημα;

    Κατ' αρχήν να ζητήσω συγγνώμη που ο τίτλος δεν ήταν σαφής αλλά εκείνη τη στιγμή δεν ήξερα πως να περιγράψω το πρόβλημα.

    Στη συνέχεια να ευχαριστήσω τον cap για την πολύ επεξηγηματική ανάλυση που έκανε. Φίλε cap δοκίμασα να εφαρμόσω τις οδηγίες σου χωρίς όμως επιτυχία. Επειδή όμως όπως καταλαβαίνετε είμαι αρχάριος θέλω να πάρω από την αρχή σωστές (όσο γίνεται) βάσεις και μετά από πολλή σκέψη κατέληξα να ακολουθήσω, εν μέρει, τη συμβουλή του φίλου KelMan. Λέω λοιπόν να αφήσω την Access και να προχωρήσω στην χρήση SQLExpress αλλάζοντας φυσικά ότι χρειάζεται στον κώδικα. Δεν ξέρω αν είναι σωστή απόφαση, ειδικά για έναν αρχάριο, και θα ήθελα πριν δώσω status "Έχει επιλυθεί" να ακούσω την γνώμη σας.

    Σας ευχαριστώ για τις άμεσες και επεξηγηματικές απαντήσεις.

    ΥΓ. Έχω πάρα πολλές απορίες οπότε να είστε stand by. Εύχομαι μόνο να μην με βαρεθείτε. Smile


    Μάνος Τ.
  •  28-02-2007, 22:40 25654 σε απάντηση της 25653

    Απ: Ποιό είναι το πρόβλημα;


    To τι data store θα χρησιμοποιήσεις δεν παίζει κανέναν ρόλο στο παραπάνω πρόβλημα. Αυτά που ανέφερα εφαρμόζονται με τον ίδιο τρόπο στην Access και στον SQL Server. Σαφώς ο SQL Server είναι πολύ πιο περίπλοκος από την Access οπότε θα έχεις και το overhead της εκμάθησής του. Καλό κουράγιο λοιπόν!
    Vir prudens non contra ventum mingit
  •  28-02-2007, 23:29 25656 σε απάντηση της 25654

    Απ: Ποιό είναι το πρόβλημα;

    Παρά το overhead θα προτείνω και εγώ να ασχοληθείς το δυνατόν γρηγορότερα με τον SQL Server μια και η γνώση που θα αποκτήσεις εκεί θα έχει περισσότερη διάρκεια και βάθος.

    Και όσο για τις ερωτήσεις, όσο περισσότερες και καλύτερες τόσο καλύτερα! Αυτοί που ρωτάνε καλές ερωτήσεις δίνουν αργότερα και καλές απαντήσεις! :)

     


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  01-03-2007, 09:40 25684 σε απάντηση της 25656

    Απ: Ποιό είναι το πρόβλημα;

    Και επίσης μελέτησε τις αρχές που διέπουν τις βάσεις δεδομένων για να έχεις το σωστό υπόβαθρο. Ξεκίνα με τα Fundamentals of Database Systems (Elmasri, Navathe) και Principles of Database & Knowledge-Base Systems Vol. 1: Classical Database Systems του Ullman. Το δεύτερο είναι παλιό αλλά κλασικό και θα το βρεις μάλλον μόνο σε πανεπιστημιακές βιβλιοθήκες.

    Νατάσα Μανουσοπούλου
  •  01-03-2007, 15:19 25715 σε απάντηση της 25684

    Απ: Ποιό είναι το πρόβλημα;

    Η αν έχεις καρτούλα το παραγγέλνεις από amazon :)
    Living within numbers...
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems