Αν και έχεις ένα σωρό 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