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

 

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

Επιστροφή μοναδικής τιμής από βάση SQL σε VB 2005

Îåêßíçóå áðü ôï ìÝëïò PlayMobiL. Τελευταία δημοσίευση από το μέλος PlayMobiL στις 27-05-2008, 16:25. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  26-05-2008, 16:12 42412

    Επιστροφή μοναδικής τιμής από βάση SQL σε VB 2005

    Καλησπέρα σας, και καλώς σας βρήκα.

    Είμαι καινούργιος στον αντικειμενοστραφή προγραμματισμό αλλά και σε visual περιβάλλοντα όπως αυτό του .NET 2005.

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

    Προχωρώ λοιπόν στο παρασύνθημα και εξηγώ. Αυτό που χρειάζομαι είναι δίνοντας το ΑΦΜ σε ένα TextBox  και πατώντας ένα button να συνδέεται σε μια βάση και να ελέγχει αν το ΑΦΜ υπάρχει ή όχι. Για το σκοπό αυτό συνέταξα το παρακάτω κώδικα οποίος όμως δεν λειτουργεί, και επιστρέφει το εξής μήνυμα: ExecuteScalar: Δεν έχει προετοιμαστεί η ιδιότητα Connection.

    Ο κώδικας είναι ο εξής:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim SQLConn As New OleDb.OleDbConnection
    Dim OleDbCommand As New OleDb.OleDbCommand
    Dim scalarcmd As String
    Dim AFM As String

    SQLConn.ConnectionString = "Provider=SQLOLEDB;Password=ΧΧΧΧΧΧΧ;Persist Security Info=True;" _
    & "User ID=ΑΑΑΑΑΑΑ;Initial Catalog=MyDatabase;" _
    & "Data Source=MySQLServer"

    scalarcmd = "SELECT AFM FROM CUSTOMER WHERE AFM = " & (TextBox1.Text)
    OleDbCommand.CommandType = CommandType.Text
    OleDbCommand.CommandText = scalarcmd
    SQLConn.Open()
    AFM = CType(OleDbCommand.ExecuteScalar(), String)
    SQLConn.Close()
    MessageBox.Show("AFM = " & AFM.ToString)

    End Sub

    Στο παραπάνω κώδικα δεν ελέγχω, για την ώρα τουλάχιστον, αν το αποτέλεσμα είναι ίδιο με αυτό του πεδίου TextBox1, απλά προσπαθώ να τον φέρω σε ένα MsgBox για να ξέρω αν λειτουργεί ή όχι.

    Βεβαίως όπως προείπα δεν λειτουργεί. Μπορεί σας παρακαλώ κάποιος να μου πεί τί πρέπει να αλλάξω για να λειτουργήσει...?

    Ευχαριστώ εκ των προταίρων.

     


    If we can not find a way.. we shall create one..!!
  •  26-05-2008, 16:35 42417 σε απάντηση της 42412

    Re: Επιστροφή μοναδικής τιμής από βάση SQL σε VB 2005

    Νομίζω ότι δεν έχεις περάσει το instantiated connection στο OleDBCommand σου, οπότε τρέχει το command χωρίς να έχει κάποιο δικό του connection για να τραβήξει δεδομένα.  Δοκίμασε να αντικαταστήσεις το SQLConn.Open με OleDbCommand.Connection=SQLConn και OleDbCommand.Connection.Open().  Λογικά θα σου παίξει.

    Αν πρόκεται να ασχοληθείς πολύ με τέτοια πράγματα ίσως να είναι καλό να ρίξεις μια ματιά στο Data Access Block του Enteprize Library. Τα κάνει αρκετά πιο εύκολα στην διαχείριση.

     


    The people of the straight land have really got it made, a warm friendly sleep from the craddle to the grave
  •  27-05-2008, 11:25 42421 σε απάντηση της 42412

    Απ: Επιστροφή μοναδικής τιμής από βάση SQL σε VB 2005

    Καταρχήν, καλό είναι ο τίτλος του post να έχει σχέση με αυτό που πραγματικά ρωτάς, γιατί έτσι είναι πολύ πιθανότερο να πάρεις έγκαιρη απάντηση. Στην περίπτωση σου θα ήταν καλύτερο να είχες βάλει τίτλο "Πρόβλημα σύνδεσης σε SQL Server".

    Όσον αφορά το πρόβλημα σου, έχεις ανοίξει τη σύνδεση αλλά δεν την έχεις περάσει στο command. Οπότε δεν έχει σύνδεση για να εκτελεστεί. Αν προσθέσεις τη γραμμή OleDbCommand.Connection = SQLConn πριν την ExecuteScalar, θα δουλέψει. Θα πρέπει όμως να έχεις υπόψη ότι ο κώδικας σου έχει αρκετά προβλήματα.

    • Χρησιμοποιείς τις κλάσεις του OLEDB provider του SQL Server αντί για τον .ΝΕΤ provider ο οποίος είναι αρκετά πιο γρήγορος και εύκολος στη χρήση
    • Δημιουργείς και εκτελείς ένα SQL string, κάτι που δημιουργεί προβλήματα ασφάλειας και ταχύτητας. Μπορεί πχ. ο χρήστης να δώσει ένα περίεργο string, κάτι σαν "; xp_cmdshell 'format c:'". Αυτό λέγεται SQL Injection attack, αλλά είναι απίστευτα εύκολο να το αποφύγεις στον SQL Server. Αντί να φτιάξεις ένα χύμα sql string μπορείς να χρησιμοποιήσεις παραμέτρους. Επιπλέον, ο SQL Server διατηρεί τα execution plans (τα compiled queries ας πούμε) και μπορεί να τα ξαναχρησιμοποιήσει. Τα χύμα queries πρέπει να τα κάνει ξανά compile κάθε φορά.
    • Αντί να ανοίγεις και να κλείνεις το connection με το χέρι, μπορείς να χρησιμοποιήσεις τη Using για να κλείσει το connection αυτόματα. Διαφορετικά, σε περίπτωση exception το connection θα μείνει ανοικτό.
    • Αντί να ορίζεις σε μία γραμμή τη μεταβλητή και μετά να θέτεις την τιμή της, καλύτερα να τα κάνεις όλα σε μία γραμμή. Έτσι αποφεύγεις την ύπαρξη μισο-φτιαγμένων μεταβλητών στον κώδικα σου. Όσο προσεκτικός να είσαι, κάποια στιγμή, στις 3 το πρωί, θα προσπαθήσεις να χρησιμοποιήσεις μία μεταβλητή η οποία δεν έχει ετοιμαστεί πλήρως.

    Θα μπορούσες να ξαναγράψεις τον κώδικα σου ως εξής:

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
       Dim AFM As String

       Dim query As String = "SELECT AFM FROM CUSTOMER WHERE AFM = @AFM"

       Using myConnection As New SqlConnection("Data Source=.\SQLEXPRESS;Initial Catalog=MyDatabase;User ID=AAAAAA;Password=XXXXXX")
          Using myCommand = New SqlCommand(query, myConnection)
             myCommand.Parameters.AddWithValue("@AFM", TextBox1.Text)
             myConnection.Open()
             AFM = CStr(myCommand.ExecuteScalar())
             MessageBox.Show(String.Format("AFM = {0}", AFM))
          End Using
       End Using
    End Sub

    Χρησιμοποιώ την String.Format στο τέλος για να αποφύγω τη δημιουργία περιττών string. Σε αυτή την περίπτωση δεν γλυτώνω και πολλά, αλλά αν είχα κάτι σαν "AFM = " & AFM & " Name = " & Name, θα δημιουργούνταν και καταστραφούν 2 temporary strings κάθε φορά που θα εκτελούσα τον κώδικα (ένα κάθε φορά που προσθέτω μία μεταβλητή). Ενώ θα μπορούσα με την String.Format("AFM - {0} Name={1}",AFM,Name) να κάνω την ίδια δουλειά χωρίς να δημιουργηθεί κανένα temporary string.

    Ένα πρόβλημα που υπάρχει ακόμα είναι ότι το connection string βρίσκεται μέσα στον κώδικα σου, με αποτέλεσμα για κάθε αλλαγή να πρέπει να πειράξεις τον κώδικα σου. Μπορείς αντί γι αυτό να αποθηκεύσεις το Connection String στα application settings της εφαρμογής σου π.χ. με το όνομα MyDB και να χρησιμοποιείς το My.Settings.MyDB αντί για ολόκληρο το string. Άνοιξε το My Project του project σου και πήγαινε στο tab Settings. Εκεί πρόσθεσε το MyDB με τύπο Connection String (είναι στο τέλος). Στη στήλη value βάζεις το connection string ή χρησιμοποιείς τον connection builder (το κουμπί "...") για να φτιάξεις ένα νέο.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  27-05-2008, 16:25 42441 σε απάντηση της 42421

    Απ: Επιστροφή μοναδικής τιμής από βάση SQL σε VB 2005

    Παναγιώτης Καναβός:

    Καταρχήν, καλό είναι ο τίτλος του post να έχει σχέση με αυτό που πραγματικά ρωτάς, γιατί έτσι είναι πολύ πιθανότερο να πάρεις έγκαιρη απάντηση. Στην περίπτωση σου θα ήταν καλύτερο να είχες βάλει τίτλο "Πρόβλημα σύνδεσης σε SQL Server".

    Έχεις απόλυτο δίκιο, έτσι θα πράττω στο μέλλον.

    Παναγιώτης Καναβός:

    Όσον αφορά το πρόβλημα σου, έχεις ανοίξει τη σύνδεση αλλά δεν την έχεις περάσει στο command. Οπότε δεν έχει σύνδεση για να εκτελεστεί. Αν προσθέσεις τη γραμμή OleDbCommand.Connection = SQLConn πριν την ExecuteScalar, θα δουλέψει. Θα πρέπει όμως να έχεις υπόψη ότι ο κώδικας σου έχει αρκετά προβλήματα.

    Είμαι αρχάριος τί να κάνουμε.. ευχαριστώ για τις παρατηρήσεις...

    Αν και το έκανα να λειτουργήσει με τις συμβουλές του OldGeorge, πριν δω το δικό σου post, θα αλλάξω όμως το κώδικα γιατί πράγματι ενδέχεται να δημιουργηθούν προβλήματα ασφαλείας και οπωσδήποτε δεν θα ήθελα να έχω το κωδικό της βάσης στο κώδικα της εφαρμογής.

    Θα το φτιάξω και θα ενημερώσω για τα αποτελέσματα..

    Ευχαριστώ και πάλι...

     


    If we can not find a way.. we shall create one..!!
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems