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

 

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

error converting data type nvarchar to numeric

Îåêßíçóå áðü ôï ìÝëïò Παπαδημητρίου Γεώργιος. Τελευταία δημοσίευση από το μέλος George J. Capnias στις 22-10-2007, 00:08. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  21-10-2007, 17:01 36459

    error converting data type nvarchar to numeric

    Γεια χαρα,

    Στον sql server έχω στηλες οι οποιες είναι του τυπου numeric(8,2).
    Στην εφαρμογη που εχω φτιαξει εχω δηλωσει πχ την ακολουθη μεταβλητη.

    Dim Assos as double = "2.3"

    Κατα την εκτελεση της ακολουθης εντολης, λαμβανω το μηνυμα λαθους error converting data type nvarchar to numeric

    sqlcmd.CommandText = "INSERT INTO Coupon (Assos) VALUES (N'" & Assos & "'')"
    sqlcmd.ExecuteNonQuery()

    Σας παραθετω δε τα ακολουθα συμφωνα με τη microsoft:
    "Implicit conversions are those conversions that occur without specifying either the CAST or CONVERT function"

    Τι ακριβως κάνω λαθος;
    Σας ευχαριστω εκ των προτερων.

  •  21-10-2007, 17:24 36460 σε απάντηση της 36459

    Απ: error converting data type nvarchar to numeric

    Σωστό είναι να περνάς ως «parameters» τα ορίσματα σου.


    while (!dead) learn();
  •  21-10-2007, 17:44 36463 σε απάντηση της 36460

    Απ: error converting data type nvarchar to numeric

    Αν και έχεις ένα σωρό implicit conversions στον κώδικα που δίνεις, πράγμα που δεν πρέπει να συμβαίνει, κατά τη γνώμη μου το πιό σημαντικό για να λύσεις το πρόβλημά σου είναι να δεις ποιά πραγματικά SQL παράγεται. Δοκίμαζε να κάνεις ανάθεση σε μια μεταβλητή και debug πριν τη στείλεις στο CommandText property ή εναλλακτικά κάνε debug επάνω στο statement αυτό για να δεις τι πραγματικά έχει πάρει το commandtext property. Αυτό που έχει συμβεί στην συγκεκριμένη περίπτωση που κανεiς string concatenation προκειμένου να επιτύχεις τη σύνθεση του SQL statement σου είναι το εξής παραγόμενο:

    INSERT INTO Coupon (Assos) VALUES (N'2.3')

    Και, φυσικά, αυτό είναι λάθος. Είναι λάθος γιατί προσπαθεις να περάσεις στο πεδίο Assos, το οποίο είναι numeric, μια τιμή nvarchar. (Ναι, είναι nvarchar, παρά το ο,τι μπορεί να πιστεύεις!). Αν βγάλεις τα "αυτάκια" γύρω από την τιμή 2.3 το πρόβλημά σου θα λυθεί. Ομως, για το πώς έφτασες μέχρι εδώ προκύπτει ούτως η άλλως μια σειρά κακών πρακτικών τις οποίες αναλύω παρακάτω.

    Ας δούμε ένα ένα τα implicit conversions που έχουν συμβεί (για να αναλύσουμε πιό σωστά τα διάφορα σφάλματα που έγιναν μέχρι να φτάσουμε στο error αυτό). Προσοχή: Δεν έχουν τα σφάλματα να κάνουν με το error αυτό καθαυτό, μια και το γιατί συμβαίνει το αναλύσαμε παραπάνω. Απλά πιό ακαδημαϊκά, για να δούμε ποιό είναι το λανθασμένο practice.

    Dim Assos as double = "2.3"
    Εδώ γίνεται της κακομοίρας. Ορίζεις μια μεταβλητή ως double και της περνάς σαν τιμή ένα string. Δεν το έχω κάνει, αλλά υποθέτω οτι implicitly γίνεται μετατροπή του string στο αντίστοιχο double της, οπότε η μεταβλητή Assos έχει πάρει όντως την τιμή 2.3.

    sqlcmd.CommandText = "INSERT INTO Coupon (Assos) VALUES (N'" & Assos & "'')"
    Εδώ πάλι γίνεται δεύτερο implicit conversion. Προσπαθείς να κάνεις concatenate ένα string και ένα double. Φυσικά, implicitly πάλι το double γίνεται convert σε string και η εντολή σου γίνεται τελικά η πολύπαθη INSERT INTO Coupon (Assos) VALUES (N'2.3').

    Το πιό λογικό θα ήταν αυτό που είπε ο Γιώργος. Δεν φτιάχνουμε SQL commands με string concatenation, αλλά χρησιμοποιούμε SQLParameters. Επίσης βάζουμε Option Explicit για να αποφύγουμε τις ανεπιθύμητες μετατροπές μεταξύ data types. Αν το είχες αυτό, ο κώδικάς σου θα είχε χτυπήσει σε compile time από το dim statement, οπότε θα υποψιαζόσουν οτι κάτι πηγαίνει στραβά.

     


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

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  21-10-2007, 17:48 36464 σε απάντηση της 36460

    Απ: error converting data type nvarchar to numeric

    Γιώργος Μπακογιάννης:

    Σωστό είναι να περνάς ως «parameters» τα ορίσματα σου.

    With sqlcmd.Parameters

    .Add("@Assos", Data.SqlDbType.Decimal).Value = Assos

    End With

    sqlcmd.CommandText = "INSERT INTO Coupon (Assos) VALUES @Assos)"
    sqlcmd.ExecuteNonQuery()

    Ok it works!
    Αλλά τελείως εγκυκλοπαιδικά, υπάρχει λογική εξηγηση σε αυτο;

  •  22-10-2007, 00:08 36470 σε απάντηση της 36459

    Απ: error converting data type nvarchar to numeric

    Παπαδημητρίου Γεώργιος:
    Dim Assos as double = "2.3"

    Το Dim είναι λάθος - το σωστό είναι:

    Dim Assos as double = 2.3

    Η μεταβλητή δεν είναι string! Προς τί τα εισαγωγικά;

    Παπαδημητρίου Γεώργιος:
    sqlcmd.CommandText = "INSERT INTO Coupon (Assos) VALUES (N'" & Assos & "'')"

    Εκτός του ότι η μετατροπή της μεταβλητής Assos είναι λάθος, και το SQL είναι λάθος - η τιμή της στύλης είναι αριθμιτική, γιατί να γίνει Unicode string; Το σωστό είναι:

    sqlcmd.CommandText = "INSERT INTO Coupon (Assos) VALUES (" & Assos.ToString() & ")"

    Άμα κάνεις τις παραπάνω αλλαγές ο αρχικός σου κώδικας θα δουλέψει...

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems