Domanda

Ho già fatto ricerche su questo, e anche se le domande seguenti sono simili, ne ho provato tutti, ma nessuno sembra risolvere il mio problema.

modo corretto per ottenere un accesso da un accesso Database

Utilizzo dei parametri Inserimento dei dati nel database di accesso

Ottenere dati dall'accesso in una casella di testo in C # facendo clic su un pulsante

Aggiorna query sul database di accesso non funzionante C # .NET < / a>

Parametro di passaggio per accedere alla query da C # .

query parametrizzata per inserire valori

Ecco la parte del codice che è rilevante:

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

Ho dichiarato le seguenti variabili di classe di conseguenza:

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

Questa è la mia situazione attuale:

.

Il problema è che il codice all'interno loadDetails () funziona bene, ed è eseguito sul caricamento del modulo. Quel codice può essere utilizzato ancora e ancora a partire da ora senza problemi, ma quando provo a eseguire le altre query, "falliscono". Non come nel fallimento delle eccezioni definitive e di lancio, ma piuttosto, le query parametrizzate che sto usando all'interno di quella area ( tagsearchbutton_click e namesarchbutton_Click ) , non sostituirebbe i parametri.

.

Questo mi ha confuso, poiché sta facendo ciò che dovrebbe in loaddetails () metodo. Se modifico manualmente il testo del comando durante il debug, sostituendo il parametro manualmente con il valore, quindi il programma funziona come dovrebbe, e restituisce i valori restituiti utilizzando l'istruzione.

.

Che cosa sta causando Oledbcommand.Parameter.addwithValue funzione di non funzionare come previsto?

Maggiori dettagli:

Ad esempio, sto usando questa riga:

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

Pertanto darebbe il comando questa stringa per ora:

.

Selezionare * Da Tagstbl dove Lename= '@ Nome'

Cosa dovrebbe fare la query parametrizzata è quella di modificare @Name a ciò che è in namestextbox , come di seguito:

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

Diciamo che ho dato la casella di testo un valore di input di " jane_smith ". Pertanto dovrebbe cambiare il comando a:

.

Seleziona * Da Tagstbl dove Lename= 'Jane_smith'

Ma invece non fa nulla, quindi il comando è ancora:

.

Selezionare * Da Tagstbl dove Lename= '@ Nome'

Altre informazioni possibilmente rilevanti:

Ho anche letto Questa domanda , ma non è il problema che sto affrontando. Sto usando Microsoft Access 2013. Sto optando per utilizzare un database di accesso MS per il mio programma in considerazione del fatto che è più facile eseguire "standalone", con il client che richiede solo di installare un motore di database di accesso gratuito, se non lo fanno avere installato MS Office. Questo programma funziona offline.

Problema risolto grazie a rumit parakhiya ! (Ho anche imparato che il formato di query MySQL e il formato di query OLEDB per MS Access è diverso anche. Stavo usando il formato di query mysql originariamente.)

È stato utile?

Soluzione

Non è necessario inserire ' (virgolette singole) attorno al parametro denominato nella tua query.Specificandolo, CLR lo considera una stringa.Basta rimuovere quelle citazioni intorno a @name e dovrebbe funzionare come previsto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top