未处理OleDBException:查询中的语法错误(不完整查询子句)

时间:2015-06-26 22:50:59

标签: c# sql ms-access

我正在尝试通过C#在Access数据库上执行一个非常简单的SQL语句。

陈述是这样的:

select M_PASSWORD from TB_USERS where M_USERNAME = 'myuser'

这是我用来执行SQL语句的C#代码:

string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + sources.global_variables.db_source;
using (OleDbConnection connection = new OleDbConnection(connString))
{
    connection.Open();
    OleDbDataReader reader = null;
    OleDbCommand command = new OleDbCommand("SELECT @1 from @2 WHERE @3='@4'", connection);
    command.Parameters.AddWithValue("@1", db_column);
    command.Parameters.AddWithValue("@2", db_table);
    command.Parameters.AddWithValue("@3", db_where_column);
    command.Parameters.AddWithValue("@4", db_where_value);
    reader = command.ExecuteReader();
    //rest of code

一旦我到达reader = command.ExecuteReader();行,读者就无法执行查询,并给出以下错误消息:OleDBException was unhandled: Syntax error in query (Incomplete query clause)。 我调试了代码,看看我是否能在参数值中看到任何错误的赋值,但它们看起来很好。

此外,在数据库的查询分析器上执行完全相同的查询,我检索我想要的值。

任何人都可以提示发现问题并了解我错在哪里吗?

3 个答案:

答案 0 :(得分:2)

我认为你不能选择列名作为参数。这可能是问题所在。

对参数使用if语句或其他条件语句,并将查询移到条件语句中。

答案 1 :(得分:1)

我不相信参数可以用你发布的方式使用。参数用于填充值(即,将DateTime值作为要在表中更新的DateTime列的值放入update语句中。)

尝试更改代码,使列名和表名以文本形式提供或以字符串形式填充。如果要在where子句中填写不同的列名,不同的表名和不同的列名,可以构建查询字符串。所以,不要发布你发布的内容,尝试更像这样的内容:

string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + sources.global_variables.db_source;
using (OleDbConnection connection = new OleDbConnection(connString))
{
    connection.Open();
    OleDbDataReader reader = null;
    string strQuery = "SELECT " + constStringColumnName1 + " FROM " + theTableNamePassedInAsString + " WHERE " + strWhereClauseBuiltEarlierInThisFunction + " = '@1'";
    OleDbCommand command = new OleDbCommand( strQuery , connection);
    command.Parameters.AddWithValue("@1", db_where_value);
    reader = command.ExecuteReader();
    //rest of code
}

当然,您可以格式化字符串并插入更改的选择列名称,表名称和where子句。构建你的选择/命令字符串,然后使用参数填写实际值是正常用法。

答案 2 :(得分:0)

尝试删除'on where参数并使用? @喜欢那个

OleDbCommand command = new OleDbCommand("SELECT ? from ? WHERE ?=?", connection);
command.Parameters.AddWithValue("column", db_column);
command.Parameters.AddWithValue("table", db_table);
command.Parameters.AddWithValue("where_column", db_where_column);
command.Parameters.AddWithValue("where_value", db_where_value);

我不知道你是否可以在列名上使用参数。如果它不运行尝试使用concat执行不带参数的查询,只使用值

的参数