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

 

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

Πρόβλημα σε εκτέλεση SQL ερωτημάτων

Îåêßíçóå áðü ôï ìÝëïò dtakis. Τελευταία δημοσίευση από το μέλος gio στις 29-12-2006, 10:18. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  21-12-2006, 17:24 22662

    Πρόβλημα σε εκτέλεση SQL ερωτημάτων

    Τρέχω την εντολή



    SELECT * FROM db_content where UPPER(title) like UPPER('%" +key+ "%') or UPPER(text) like UPPER('%" + key + "%') or UPPER(smalltext) like UPPER('%" + key + "%') "

    μέσα από VB και παίρνω το εξής exception:

    Error Search: System.Data.SqlClient.SqlException: Argument data type text is invalid for argument 1 of upper function. at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream) at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior) at System.Data.SqlClient.SqlCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) at System.Data.Common.DbDataAdapter.FillFromCommand(Object data, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable, IDbCommand command, CommandBehavior behavior) at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable) at test.search1.CreateDataSource()

     

    Θέλω να κάνω LOWER ή UPPER τις μεταβλητές για να κάνω συγκρίσεις μεταξύ μόνο κεφαλαίων (όπως το παράδειγμα) ή πεζών.

    Ευχαριστώ εκ των προτέρων!

     

    UPDATE τροποποίησα το παραπάνω ερώτημα σε

    Dim strcmd As String = "SELECT * FROM db_content where UPPER(title) like '%UPPER(" + func.convertFCKstring(key) + ")%' or UPPER(text) like '%UPPER(" + func.convertFCKstring(key) + ")%' or UPPER(smalltext) like '%UPPER(" + func.convertFCKstring(key) + ")%' "

    μιας και η σύνταξη του upper ήταν ήδη λανθασμένη αλλά δεν κατάφερα να μου δουλέψει και πάλι σωστά καθώς επιμένει ότι υπάρχει το πρόβλημα με το πρώτο argument.

    Να σημειώσω ότι χωρίς upper παίζει κανονικά!

     

  •  21-12-2006, 19:39 22668 σε απάντηση της 22662

    Απ: Πρόβλημα σε εκτέλεση SQL ερωτημάτων

    Η στήλη text του πίνακά σου έχει όνομα που είναι reserved word στον SQL Server. Θα πρότεινα να τη μετονομάσεις. Αν δεν μπορείς, τότε να αναφέρεσαι σε αυτήν σαν [text], π.χ. UPPER(db_content.[text])

    Νατάσα Μανουσοπούλου
  •  21-12-2006, 20:07 22669 σε απάντηση της 22662

    Απ: Πρόβλημα σε εκτέλεση SQL ερωτημάτων

    Επίσης  νομίζω πρέπει να γράψεις ...

    ...  UPPER(title) like '%' + UPPER(" + func.convertFCKstring(key) + ") + '%'  ...  

     ... κάνε το ίδιο κ για τις επόμενες συνθηκες 

  •  21-12-2006, 21:06 22671 σε απάντηση της 22668

    Απ: Πρόβλημα σε εκτέλεση SQL ερωτημάτων

    Και τέλος, αφού χρησιμοποιείς .NET και θα φτιάξεις που θα φτιάξεις ένα command αντικείμενο, γιατί δεν μετατρέπεις το query σε parameterized query ώστε να απαλλαγείς από τις μετατροπές μέσα σε SQL? Έτσι το SQL statement θα μετατραπεί σε :

    "SELECT * FROM db_content where UPPER(title) like @key or UPPER([text]) like @key or UPPER(smalltext) like @key "

    Μετά θέτεις την τιμή της παραμέτρου @key:

    cmd.Parameters.Add("@key",SqlType.NVarChar).Value="%" + func.convertFCKstring(key) + "%"

    Και γλυτώνεις από περίεργα concatenations και UPPER
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  21-12-2006, 22:28 22677 σε απάντηση της 22671

    Απ: Πρόβλημα σε εκτέλεση SQL ερωτημάτων

    Ναι έχεις δίκιο, είναι πιο ασφαλές αυτό!

    Ευχαριστώ για την βοήθειά σας!

  •  21-12-2006, 23:15 22680 σε απάντηση της 22677

    Απ: Πρόβλημα σε εκτέλεση SQL ερωτημάτων

    Ψιλο-άσχετο, αλλά να συμπληρώσω ότι με ένα τέτοιο query τα indexes πάνε περίπατο... Όταν έχεις OR μεταξύ των arguments, θα πρέπει να υπάρχει index για κάθε ένα από τα πεδία που αναφέρονται τα arguments. Επιπρόσθετα, όταν βάζεις function πάνω στο πεδίο, συνήθως αγνοείται το index του πεδίου, οπότε αν κάποια στιγμή δεις ότι το query αργεί, η καλύτερη λύση είναι να φτιάξεις ένα view που να κάνει SELECT πάνω σε αυτά τα πεδία όπως αναφέρονται στο WHERE, δηλαδή:

    SELECT UPPER(title), UPPER([text]), UPPER(smalltext) FROM db_content

    και κατόπιν να δημιουργήσεις τα indexes (ένα clustered στο πρώτο και ένα non-clustered στα άλλα δύο) πάνω σε αυτό το view. Προϋπόθεση για να κάνεις κάτι τέτοιο είναι SQL Server 2000. Στον 2005 που μπορείς στο index να σέρνεις και extra πεδία, αρκεί ένα index.


    Vir prudens non contra ventum mingit
  •  21-12-2006, 23:33 22681 σε απάντηση της 22680

    Απ: Πρόβλημα σε εκτέλεση SQL ερωτημάτων

    Το πρόσεξα κι εγώ αυτό, αλλά από τη στιγμή που χρησιμοποιείται το LIKE '%key%' έτσι κι αλλιώς δεν λαμβάνονται υπόψη τα indexes. Γενικά πάντως, αντί για τη χρήση της upper, μπορεί κανείς να ορίσει ένα case insensitive collation δίπλα από κάθε text πεδίο, και να πετύχει το ίδιο αποτέλεσμα, χωρίς UPPER και χρησιμοποιώντας τα indexes. Π.χ.

    SELECT * FROM db_content where title = @key COLLATE Greek_CI_AS or [text]=@key COLLATE Greek_CI_AS or smalltext=@key COLLATE Greek_CI_AS
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  22-12-2006, 10:38 22697 σε απάντηση της 22669

    Απ: Πρόβλημα σε εκτέλεση SQL ερωτημάτων

    @gio Νομίζω ότι κάνεις λάθος στο θέμα του '' καθώς έτσι χτυπάει error για την σύνταξη!
  •  29-12-2006, 10:18 22884 σε απάντηση της 22697

    Απ: Πρόβλημα σε εκτέλεση SQL ερωτημάτων

    όντως κατι μου ξέφυγε.Αν επιμένεις όμως να μην ακολουθείς τις προηγούμενες συμβουλές , το σωστό πρέπει να είναι :

    ...  UPPER(title) like '%' + UPPER('" + func.convertFCKstring(key) + "') + '%'  ...

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

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems