Question

J'ai déjà fait des recherches en cela, et même si les questions ci-dessous sont semblables, j'ai tout essayé, mais aucune ne semble résoudre mon problème.

La bonne façon d'obtenir des données à partir d'une Base de données Access

à l'aide des paramètres de l'insertion des données dans la base de données access

L'obtention de Données de l'Accès à une zone de texte dans C# en cliquant sur un bouton

Requête de mise à JOUR sur l'Accès de la Base de données ne fonctionne pas C#.NET

passage de paramètre à la requête d'accès à partir de c#

Requête paramétrée pour l'insertion de valeurs

Voici la partie du code qui est pertinent:

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();
    }
}

Je l'ai déclaré à la suite de variables de classe en conséquence:

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

C'est ma situation actuelle:

Le problème est que le code à l'intérieur LoadDetails() fonctionne très bien, et il est exécuté à la forme de chargement.Ce code peut être utilisé encore et encore, dès maintenant, sans problèmes, mais quand j'essaye d'exécuter les requêtes d'autres, ils "échec".Pas comme en omettant d'emblée et de lever des exceptions, mais plutôt, l' Les Requêtes paramétrées, je suis en utilisant à l'intérieur de cette zone (tagSearchButton_Click et nameSearchButton_Click), ne serait-ce pas remplacer les paramètres.

Ce qui m'a confus, car elle fait ce qu'elle doit à LoadDetails() la méthode.Si j'ai modifié manuellement le texte de la commande lors du débogage, en remplaçant le paramètre manuellement avec la valeur, alors le programme fonctionne comme il se doit, et renvoie les valeurs renvoyées par l'aide de l'instruction.

Quelle est la cause de la OleDbCommand.Le paramètre.AddWithValue la fonction ne fonctionne pas comme prévu?

Plus De Détails:

Par exemple, je suis en utilisant cette ligne:

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

Par conséquent, il donnerait à la commande de cette chaîne pour l'instant:

SÉLECTIONNEZ * à partir de tagsTbl OÙ les noms de chier='@'nom

Ce que la Requête Paramétrée doit être fait est de changer le @nom pour ce qui est de la namesTextBox, comme indiqué ci-dessous:

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

Disons que j'ai donné à la zone de texte une valeur d'entrée de l' "Jane_Smith".Par conséquent, il doit changer la commande à:

SÉLECTIONNEZ * à partir de tagsTbl OÙ les noms de chier='Jane_Smith'

Mais au lieu de cela ne fait rien, donc la commande est toujours:

SÉLECTIONNEZ * à partir de tagsTbl OÙ les noms de chier='@'nom

D'autres, éventuellement, des informations pertinentes:

Je viens également de lire cette question, mais ce n'est pas la question, je suis confronté.Je suis l'aide de Microsoft Access 2013.Je suis d'opter pour l'utilisation d'une base de données MS Access pour mon programme en vue de le fait il est plus facile de courir "autonome", avec le client a seulement besoin d'installer un Accès gratuit Moteur de Base de données, si elles n'ont pas de MS Office installé.Ce programme fonctionne en mode hors connexion.

Problème Résolu Grâce à la Rumit Parakhiya!(J'ai aussi appris que MySQL format de la requête et la requête OleDb format MS Access est différent aussi.J'ai été en utilisant la requête MySQL format d'origine.)

Était-ce utile?

La solution

Vous n'avez pas besoin de mettre ' (guillemets simples) autour de paramètre nommé dans votre requête.Le précisant, CLR considère comme une chaîne de caractères.Seulement supprimer les guillemets autour de @name et il devrait fonctionner comme prévu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top