C# Microsoft Access参数化查询未能发挥作用

5
我已经对此进行了研究,虽然下面的问题类似,但我已经尝试了所有这些方法,但似乎都不能解决我的问题。 从Access数据库获取数据的正确方法 使用参数将数据插入到Access数据库中 通过单击按钮在C#中将数据从Access获取到文本框中 C#.NET上的Access数据库UPDATE查询不起作用 从C#传递参数到Access查询 插入值的参数化查询 以下是相关代码部分:
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();
    }
}

我已经相应地声明了以下类变量:
private string strConnPath = "";
private string strConn = "";
private bool blnLoaded = false;
OleDbConnection connection;
OleDbDataReader reader;
OleDbCommand command;
private string errortxt = "";
int testInt = 1;

这是我的当前情况:

问题在于,LoadDetails() 方法内的代码运行良好,并且在窗体加载时运行。目前该代码可以反复使用而没有问题,但是当我尝试运行其他查询时,它们会“失败”。并非直接失败并抛出异常,而是位于该区域内的参数化查询tagSearchButton_ClicknameSearchButton_Click无法替换参数。

这让我感到困惑,因为在 LoadDetails() 方法中它正在执行其应有的功能。如果我在调试期间手动更改了命令文本,通过手动替换参数值,那么程序将按预期工作,并返回使用该语句返回的值。

是什么导致 OleDbCommand.Parameter.AddWithValue 函数无法按预期工作?

更多细节:

例如,我正在使用以下行:

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

因此,现在它会给出这个字符串的命令:

SELECT * from tagsTbl WHERE leName='@name'

参数化查询应该做的是将@name更改为namesTextBox中的内容,如下所示:
command.Parameters.AddWithValue("@name", namesTextBox.Text);

假设我给文本框一个输入值"Jane_Smith"。因此,它应该更改命令为:

SELECT * from tagsTbl WHERE leName='Jane_Smith'

但它什么也没做,所以命令仍然是:

SELECT * from tagsTbl WHERE leName='@name'

其他可能相关的信息:

我也刚刚阅读了这个问题,但我面临的问题不是这个。我正在使用Microsoft Access 2013。考虑到它更容易运行“独立”,如果客户端没有安装MS Office,则客户端只需安装免费的Access数据库引擎即可。此程序可以离线使用。

感谢Rumit Parakhiya解决了我的问题!(我也学到了MySQL查询格式和MS Access的OleDb查询格式是不同的。我最初使用的是MySQL查询格式。)

1个回答

5

在查询中,你不需要在命名参数周围加上单引号'。CLR会将其视为字符串。只需删除@name周围的引号即可按预期工作。


那不起作用...说实话,我之前也试过了。 (结果:http://imgur.com/TLUweWb)参数化查询仍然无法更改参数。 - Kaitlyn
算了,现在对于@name已经可以工作了,谢谢。但是第二个@1不起作用。或者参数需要始终不同吗? - Kaitlyn
@Aria:我也遇到了同样的问题。你在 tagSearchButton_Click 方法中使用了 ' 包裹 @1 。无论其数据类型如何,只要你使用 命名参数,就不需要将其包裹在 ' 中。 - Rumit Parakhiya
不好意思,貌似我在数据库中输入了错误的内容。还是非常感谢你的帮助。 - Kaitlyn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接