我正在尝试通过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)
。
我调试了代码,看看我是否能在参数值中看到任何错误的赋值,但它们看起来很好。
此外,在数据库的查询分析器上执行完全相同的查询,我检索我想要的值。
任何人都可以提示发现问题并了解我错在哪里吗?
答案 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执行不带参数的查询,只使用值
的参数