Pergunta

Já pesquisei sobre isso e, embora as perguntas abaixo sejam semelhantes, tentei todas elas, mas nenhuma parece resolver meu problema.

Maneira correta de obter dados de um banco de dados Access

usando parâmetros inserindo dados no banco de dados de acesso

Obtendo dados do Access em uma caixa de texto em C# clicando em um botão

Consulta UPDATE no banco de dados Access não funciona C#.NET

passando parâmetro para acessar consulta de c#

Consulta parametrizada para inserção de valores

Aqui está a parte do código que é relevante:

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

Eu declarei as seguintes variáveis ​​de classe de acordo:

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

Esta é a minha situação atual:

A questão é que o código dentro CarregarDetalhes() funciona muito bem e é executado no carregamento do formulário.Esse código pode ser usado repetidamente a partir de agora sem problemas, mas quando tento executar as outras consultas, elas "falham".Não como falhar completamente e lançar exceções, mas sim, o Consultas parametrizadas que estou usando nessa área (tagSearchButton_Click e nomeSearchButton_Click), não substituiria os parâmetros.

Isso me deixou confuso, pois está fazendo o que deveria CarregarDetalhes() método.Se eu alterei manualmente o texto do comando durante a depuração, substituindo o parâmetro manualmente pelo valor, o programa funcionará como deveria e retornará os valores retornados usando a instrução.

O que está causando o OleDbCommand.Parameter.AddWithValue função não funcionar como pretendido?

Mais detalhes:

Por exemplo, estou usando esta linha:

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

Portanto, daria ao comando esta string por enquanto:

SELECIONE * nas tagsTbl WHERE leNome='@nome'

O que a consulta parametrizada deveria fazer é alterar o @nome para o que está no nomesTextBox, como abaixo:

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

Digamos que eu dei à caixa de texto um valor de entrada de "Jane Smith".Portanto deve mudar o comando para:

SELECIONE * nas tagsTbl WHERE leName='Jane_Smith'

Mas em vez disso não faz nada, então o comando ainda é:

SELECIONE * nas tagsTbl WHERE leNome='@nome'

Outras informações possivelmente relevantes:

Eu também acabei de ler essa questão, mas não é o problema que estou enfrentando.Estou usando o Microsoft Access 2013.Opto por utilizar um banco de dados MS Access para o meu programa pelo fato de ser mais fácil rodar "standalone", sendo que o cliente só precisa instalar um Access Database Engine gratuito, caso não possua o MS Office instalado.Este programa funciona offline.

Problema resolvido graças a Rumit Parakhiya!(Também aprendi que o formato de consulta MySQL e o formato de consulta OleDb para MS Access também são diferentes.Eu estava usando o formato de consulta MySQL originalmente.)

Foi útil?

Solução

Você não precisa colocar ' (aspas simples) em torno do parâmetro nomeado em sua consulta.Ao especificá-lo, o CLR o considera como uma string.Basta remover essas aspas @name e deve estar funcionando conforme o esperado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top