为什么此查询未返回结果?

时间:2013-02-28 21:06:28

标签: c# ms-access

我有一个名为Table1的Access表,其中有一个名为FieldA的字段。 FieldA的数据类型为文本。

FieldA包含值010005。

当我运行查询时,它找不到匹配项。如果我在Access中运行查询,它确实找到了值。

OleDbConnection conn = null;
OleDbDataReader reader = null;

conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=\\\\server\\folder\\mydatabase.accdb");
conn.Open();

OleDbCommand cmd = new OleDbCommand("Select * FROM Table1 WHERE FieldA = @p1", conn);
cmd.Parameters.Add("@p1", OleDbType.VarChar);
cmd.Parameters["@p1"].Value = "010005";
reader = cmd.ExecuteReader();

dataGridView1.DataSource = reader;

我在这里缺少什么?

谢谢!

编辑:这很有用,也是我最终使用的:

OleDbConnection conn = null;
conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=\\\\server\\folder\\mydatabase.accdb");
conn.Open();

string theValue = "010005";
string sql = string.Format("SELECT * FROM Table 1 where FieldA = '{0}'", theValue);

OleDbDataAdapter ada = new OleDbDataAdapter(sql, conn);

ada.Fill(dataTable1);

dataGridView1.DataSource = dataTable1;

4 个答案:

答案 0 :(得分:3)

您正在为参数指定一个数字,因此该值将转换为字符串"10005",而不是"010005"

将其作为字符串分配给参数:

cmd.Parameters["@p1"].Value = "010005";

此外,您需要删除参数周围的撇号,否则它不会将其识别为参数,而是查找字符串"@p1"

OleDbCommand cmd = new OleDbCommand("Select * FROM Table1 WHERE FieldA = @p1", conn);

答案 1 :(得分:0)

您正在寻找@p1引用它

请改用:

OleDbCommand cmd = new OleDbCommand("Select * FROM Table1 WHERE FieldA = @p1", conn);

答案 2 :(得分:0)

可能是因为你试图使用OleDb的命名参数,我认为不支持。

详细说明如何改为: http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.parameters.aspx

答案 3 :(得分:0)

我认为在您第一次将命令添加到命令之后以及执行命令之前,您需要Prepare()命令:

OleDbCommand command    = new OleDbCommand(null, rConn);

// Create and prepare an SQL statement.
command.CommandText = "insert into Region (RegionID, RegionDescription) values (@id, @desc)" ;
command.Parameters.Add ( "@id", id) ;
command.Parameters.Add ( "@desc", desc) ;
command.Prepare() ;  // Calling Prepare after having set the Commandtext and parameters.
command.ExecuteNonQuery();

// Change parameter values and call ExecuteNonQuery.
command.Parameters[0].Value = 21;
command.Parameters[1].Value = "mySecondRegion";
command.ExecuteNonQuery();

一旦正确Prepared(),您就不需要再次执行此操作(除非您更改参数(而不仅仅是它们的值)。