Frage zur Datenbankensuche

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Schamash.

    woeh schrieb:

    einen fehler.

    Klassiker!

    Solche "Fehler" kannst du einfach umgehen indem die deinen CommandText mit Parametern aufbaust.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Dafür habe ich von dir zu wenig Informationen

    Gewöhnlich über Command.parameter.add(....) hängt aber von der Datenbank ab (SQL / Access / Oracle / ....) sind alle leicht unterschiedlich aufgabaut.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    ist ne access-datenbank, die mir sql abgefragt wird:

    VB.NET-Quellcode

    1. sql = "SELECT * FROM Overview WHERE Filename='" & file.Name & "' AND Path='" & file.DirectoryName & "'"


    ich habe dies hier gefunden und versuche es mal:

    VB.NET-Quellcode

    1. SqlCmd = "SELECT * FROM Tabelle WHERE Feld LIKE '%" & Variable.Replace("'","''") & "%'"


    ich weiß nicht, ob es was bringt...falls du was besseres weißt...
    Dein sql ist der CommandText.
    Den weist du in deinem Code einem Command zu. Danach kannst du mit DeinCommand.Parameter.Add(...) einen Parameter hinzufügen.

    Beispiel:

    VB.NET-Quellcode

    1. Dim com As OleDb.OleDbCommand
    2. com.CommandText = "SELECT * FROM Overview WHERE Filename = @fname AND Path = @pfad"
    3. com.Parameters.Add("@fname", OleDb.OleDbType.BSTR).Value = File.Name
    4. com.Parameters.Add("@pfad", OleDb.OleDbType.BSTR).Value = File.DirectoryName
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Ja das bessere hat er gepostet.

    VB.NET-Quellcode

    1. ​Command.parameter.add


    Füge jeden Parameter darüber hinzu.
    Solche Replace Konstrukte beinhalten nicht alle möglichen "Probleme" (Stichwort SQL Injection)
    Das ist meine Signatur und sie wird wunderbar sein!
    1. Command.Parameters -> sauber und empfehlenswert
    2. String.Replace("'", "") -> unsauber

    Das Like % in deinem SQL hat damit nix zu tun, das bewirkt nur, das die Zeichenfolge vor/nach deines Strings egal ist.

    Edit: Ich nehme gerne die .Parameters.AddWithValue() Variante.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @Mono @mrMo Danke für die Unterstützung.
    Im Nachgang fällt mir auch auf das @woeh meinen Lösungsvorschlag mit Parameters.Add völlig ignoriert hat :cursing:
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    nein, habe ich nicht....ich weiß nur nicht wohin damit.....bin am tüfteln....ich ignoriere nichts

    momentan sieht das so aus:

    VB.NET-Quellcode

    1. Public Function DatabaseFillTable(ByVal sql As String) As Boolean
    2. Try
    3. con = New OleDb.OleDbConnection(GetConnectionString)
    4. ds.Tables.Add(dt)
    5. da = New OleDb.OleDbDataAdapter(sql, con)
    6. da.Fill(dt)
    7. Dim cb As New OleDb.OleDbCommandBuilder(da)
    8. bs.DataSource = dt
    9. Return True
    10. Catch ex As Exception
    11. Log(LogColor.errorInfo, Err.Description, Err.Number)
    12. Return False
    13. End Try
    14. End Function


    und wird so aufgerufen:

    VB.NET-Quellcode

    1. sql = "SELECT * FROM Overview WHERE Filename='" & file.Name & "' AND Path='" & file.DirectoryName & "'"
    2. dt = New DataTable
    3. bs = New BindingSource
    4. ds = New DataSet
    5. modDatabase.DatabaseFillTable(sql)


    ich weiß jetzt nicht wohin ich den parameter packen soll....ich gebe es ja zu

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „woeh“ ()

    woeh schrieb:

    ich weiß jetzt nicht wohin ich den parameter packen soll....ich gebe je ja zu


    Keine Schande das (noch) nicht zu wissen. Hab den Syntax grad nicht im Kopf (lieg am Strand), aber die andern können da sicher aushelfen ;)

    P.S. gewöhn dir dann die Parameter Variante an, ist deutlich komfortabler
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Das könnte helfen:
    msdn.microsoft.com/de-de/library/ebxy9a8b(v=vs.90).aspx
    oder
    Der OLE DB-.NET-Anbieter unterstützt keine benannten
    Parameter für die Übergabe von Parametern an eine SQL-Anweisung oder
    gespeicherte Prozedur, die von OleDbCommand aufgerufen wird, wenn
    CommandType auf Text festgelegt ist. In diesem Fall muss das
    Fragezeichen (?) als Platzhalter verwendet werden. Beispiel:

    SELECT * FROM Customers WHERE CustomerID = ?

    Die Reihenfolge, in der OleDbParameter-Objekte der
    OleDbParameterCollection hinzugefügt werden, muss daher direkt der
    Position des Fragezeichenplatzhalters für den Parameter im Befehlstext
    entsprechen.


    VB.NET-Quellcode

    1. Dim cmdText As String = "INSERT INTO Customer(UserName, [Password]) VALUES (?,?)"
    2. Dim cmd As OleDbCommand = New OleDbCommand(cmdText, con)
    3. cmd.CommandType = CommandType.Text ‘ The default is CommandType.Text
    4. With cmd.Parameters
    5. .Add("@p1", OleDbType.VarChar).Value = txtUserName.Text
    6. .Add("@p2", OleDbType.VarChar).Value = txtPassword.Text
    7. End With
    8. cmd.ExecuteNonQuery()
    @woeh

    ich hab dein Beispiel mal "korrigiert"

    VB.NET-Quellcode

    1. Public Function DatabaseFillTable() As Boolean
    2. Dim con As New OleDb.OleDbConnection(GetConnectionString)
    3. Dim com As New OleDb.OleDbCommand("SELECT * FROM Overview WHERE Filename = @fname AND Path = @pfad")
    4. com.Parameters.Add("@fname", OleDb.OleDbType.BSTR).Value = File.Name
    5. com.Parameters.Add("@pfad", OleDb.OleDbType.BSTR).Value = File.DirectoryName
    6. ds.Tables.Add(dt)
    7. da = New OleDb.OleDbDataAdapter(com)
    8. If da.Fill(dt) > 0 Then
    9. bs.DataSource = dt
    10. Return True
    11. Else
    12. Return False
    13. End If
    14. End Function

    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."

    Schamash schrieb:

    @woeh

    ich hab dein Beispiel mal "korrigiert"

    VB.NET-Quellcode

    1. Public Function DatabaseFillTable() As Boolean
    2. Dim con As New OleDb.OleDbConnection(GetConnectionString)
    3. Dim com As New OleDb.OleDbCommand("SELECT * FROM Overview WHERE Filename = @fname AND Path = @pfad")
    4. com.Parameters.Add("@fname", OleDb.OleDbType.BSTR).Value = File.Name
    5. com.Parameters.Add("@pfad", OleDb.OleDbType.BSTR).Value = File.DirectoryName
    6. ds.Tables.Add(dt)
    7. da = New OleDb.OleDbDataAdapter(com)
    8. If da.Fill(dt) > 0 Then
    9. bs.DataSource = dt
    10. Return True
    11. Else
    12. Return False
    13. End If
    14. End Function



    Das wird so nicht funktionieren

    Weil:
    Der OLE DB-.NET-Anbieter unterstützt keine benannten
    Parameter für die Übergabe von Parametern an eine SQL-Anweisung oder
    gespeicherte Prozedur, die von OleDbCommand aufgerufen wird, wenn
    CommandType auf Text festgelegt ist. In diesem Fall muss das
    Fragezeichen (?) als Platzhalter verwendet werden. Beispiel:

    SELECT * FROM Customers WHERE CustomerID = ?

    Die Reihenfolge, in der OleDbParameter-Objekte der
    OleDbParameterCollection hinzugefügt werden, muss daher direkt der
    Position des Fragezeichenplatzhalters für den Parameter im Befehlstext
    entsprechen.

    Das sollte gehen:

    VB.NET-Quellcode

    1. Dim com As New OleDb.OleDbCommand("SELECT * FROM Overview WHERE Filename = ? AND Path = ?")
    2. com.Parameters.Add("@fname", OleDb.OleDbType.BSTR).Value = File.Name
    3. com.Parameters.Add("@pfad", OleDb.OleDbType.BSTR).Value = File.DirectoryName
    @EpagneulBreton Ich arbeite seit Jahren mit Access und "@Name" als Parameter. Das ? ist ein Platzhalter die OLEDB Schnitstelle arbeitet aber auch mit @Paramertern. Die Einschränkung der korrekten Reihenfolge bleibt aber bestehen. Ich finde aber das ein @Name schöner zu lesen ist wie ein ?
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."