Frage

Ich habe diesbezüglich bereits Nachforschungen angestellt, und obwohl die folgenden Fragen ähnlich sind, habe ich sie alle ausprobiert, aber keine scheint mein Problem zu lösen.

Richtige Methode zum Abrufen von Daten aus einer Access-Datenbank

Verwenden von Parametern zum Einfügen von Daten in die Access-Datenbank

Abrufen von Daten aus Access in ein Textfeld in C# durch Klicken auf eine Schaltfläche

UPDATE-Abfrage in der Access-Datenbank funktioniert nicht in C#.NET

Übergabe eines Parameters für den Zugriff auf die Abfrage von c#

Parametrisierte Abfrage zum Einfügen von Werten

Hier ist der Teil des Codes, der relevant ist:

private void LoadDetails(int index)
{
    try
    {
        connection.Open();
        command = new OleDbCommand("SELECT * from tagsTbl WHERE ID=@1", connection);
        command.Parameters.AddWithValue("@1", index);
        reader = command.ExecuteReader();
        while (reader.Read())
        {
            nameTextBox.Text = reader["leName"].ToString();
            altTextBox.Text = reader["altName"].ToString();
            unitTextBox.Text = reader["currUnit"].ToString();
            tagTextBox.Text = reader["currTag"].ToString();
            oldTextBox.Text = reader["oldTag"].ToString();
            descTextBox.Text = reader["currDesc"].ToString();
        }
        connection.Close();
    }
    catch
    {
        connection.Close();
        MessageBox.Show(errortxt);
        Application.Exit();
    }
}

private void testWin_Load(object sender, EventArgs e)
{
    loadFileDialog.ShowDialog();
    connection = new OleDbConnection(strConn);
    if (!blnLoaded)
        Application.Exit();
    else
    {
        errortxt = "Attempt to establish connection to database failed!";
        LoadDetails(testInt);
        this.Show();
    }
}

private void loadFileDialog_FileOk(object sender, CancelEventArgs e)
{
    strConnPath = loadFileDialog.FileName;
    strConn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strConnPath;
    blnLoaded = true;
}

private void prevButton_Click(object sender, EventArgs e)
{
    if (testInt > 1)
        testInt--;
    LoadDetails(testInt);
    gotoNumericUpDown.Value = testInt;
}

private void nextButton_Click(object sender, EventArgs e)
{
    testInt++;
    errortxt = "You cannot go higher than that!";
    try
    {
        LoadDetails(testInt);
        gotoNumericUpDown.Value = testInt;
    }
    catch
    {
        testInt--;
    }
}

private void gotoButton_Click(object sender, EventArgs e)
{
    try
    {
        testInt = (int)gotoNumericUpDown.Value;
        LoadDetails(testInt);
    }
    catch 
    { 

    }
}

private void nameSearchButton_Click(object sender, EventArgs e)
{
    try
    {
        connection.Open();
        command = new OleDbCommand("SELECT * from tagsTbl WHERE leName='@name'", connection);
        command.CommandType = CommandType.Text;
        command.Parameters.AddWithValue("@name", namesTextBox.Text);
        reader = command.ExecuteReader();
        while (reader.Read())
        {
            nameTextBox.Text = reader["leName"].ToString();
            altTextBox.Text = reader["altName"].ToString();
            unitTextBox.Text = reader["currUnit"].ToString();
            tagTextBox.Text = reader["currTag"].ToString();
            oldTextBox.Text = reader["oldTag"].ToString();
            descTextBox.Text = reader["currDesc"].ToString();
        }
        connection.Close();
      }
      catch
      {
          connection.Close();
      }
}

private void tagSearchButton_Click(object sender, EventArgs e)
{
    try
    {
        command = new OleDbCommand("SELECT * from tagsTbl WHERE currTag='@1'", connection);
        command.Parameters.AddWithValue("@1", tagsTextBox.Text);
        connection.Open();
        MessageBox.Show(command.CommandText);
        reader = command.ExecuteReader();
        while (reader.Read())
        {
            nameTextBox.Text = reader["leName"].ToString();
            altTextBox.Text = reader["altName"].ToString();
            unitTextBox.Text = reader["currUnit"].ToString();
            tagTextBox.Text = reader["currTag"].ToString();
            oldTextBox.Text = reader["oldTag"].ToString();
            descTextBox.Text = reader["currDesc"].ToString();
        }
        connection.Close();
    }
    catch
    {
        connection.Close();
    }
}

Folgende Klassenvariablen habe ich entsprechend deklariert:

private string strConnPath = "";
private string strConn = "";
private bool blnLoaded = false;
OleDbConnection connection;
OleDbDataReader reader;
OleDbCommand command;
private string errortxt = "";
int testInt = 1;

Das ist meine aktuelle Situation:

Das Problem ist, dass der Code darin LoadDetails() funktioniert einwandfrei und wird beim Laden des Formulars ausgeführt.Dieser Code kann ab sofort ohne Probleme immer wieder verwendet werden, aber wenn ich versuche, die anderen Abfragen auszuführen, schlagen sie fehl.Nicht das völlige Scheitern und Auslösen von Ausnahmen, sondern das Parametrisierte Abfragen, die ich in diesem Bereich verwende (tagSearchButton_Click Und nameSearchButton_Click), würde die Parameter nicht ersetzen.

Das verwirrt mich, da es tut, was es soll LoadDetails() Methode.Wenn ich den Befehlstext während des Debuggens manuell geändert habe, indem ich den Parameter manuell durch den Wert ersetzt habe, funktioniert das Programm ordnungsgemäß und gibt die von der Anweisung zurückgegebenen Werte zurück.

Was verursacht das OleDbCommand.Parameter.AddWithValue funktioniert die Funktion nicht wie vorgesehen?

Mehr Details:

Ich verwende zum Beispiel diese Zeile:

command = new OleDbCommand("SELECT * from tagsTbl WHERE leName='@name'", connection);

Daher würde es dem Befehl vorerst diese Zeichenfolge geben:

SELECT * from tagsTbl WHERE leName='@name'

Was die parametrisierte Abfrage tun sollte, ist, das zu ändern @Name zu dem, was in der NamenTextBox, wie nachstehend:

command.Parameters.AddWithValue("@name", namesTextBox.Text);

Nehmen wir an, ich habe dem Textfeld den Eingabewert „Jane Smith".Daher sollte der Befehl wie folgt geändert werden:

SELECT * from tagsTbl WHERE leName='Jane_Smith'

Aber stattdessen passiert nichts, daher lautet der Befehl immer noch:

SELECT * from tagsTbl WHERE leName='@name'

Weitere möglicherweise relevante Informationen:

Habe ich auch gerade gelesen diese Frage, aber das ist nicht das Problem, mit dem ich konfrontiert bin.Ich verwende Microsoft Access 2013.Ich entscheide mich für die Verwendung einer MS Access-Datenbank für mein Programm, da es einfacher ist, es „standalone“ auszuführen, da der Client nur dann eine kostenlose Access-Datenbank-Engine installieren muss, wenn er kein MS Office installiert hat.Dieses Programm funktioniert offline.

Problem gelöst dank Rumit Parakhiya!(Ich habe auch erfahren, dass das MySQL-Abfrageformat und das OleDb-Abfrageformat für MS Access ebenfalls unterschiedlich sind.Ich habe ursprünglich das MySQL-Abfrageformat verwendet.)

War es hilfreich?

Lösung

Sie müssen nicht setzen ' (einfache Anführungszeichen) um benannte Parameter in Ihrer Abfrage.Wenn Sie es angeben, betrachtet CLR es als Zeichenfolge.Entfernen Sie einfach die Anführungszeichen @name und es sollte wie erwartet funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top