2013-02-28 161 views
0

我有一个名为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; 
+1

是它的@ P1单引号? – 2013-02-28 21:08:21

回答

3

您分配一个号到参数,因此该值将被转换成字符串"10005",不"010005"

其指定为一个字符串参数:

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

此外,您还需要去掉周围的参数撇号,否则将不承认它作为一个参数,并查找字符串"@p1"代替:

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

好吧,这是有道理的。我已经更新了我的代码,您的建议,但查询仍然无法在表中找到010005。我已经三重检查了值是否存在,并且表名是正确的。 – 2013-02-28 21:21:20

+0

@JeffBrady:将值直接放入查询中进行测试:'“Select * FROM Table1 WHERE FieldA ='010005'”'。如果这有效,那么你知道你如何使用这个参数有什么问题,否则它根本就不存在,你可能会在一个错误的数据库中出现。 – Guffa 2013-02-28 21:25:11

+0

我试过了,仍然没有结果。我期待dataGridView1显示结果..希望这是在我的代码中是正确的。 – 2013-02-28 21:35:46

0

您正在寻找@p1因为你引用它

使用这个:

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

谢谢..我已经放弃了参数周围的引号,并且还在每个@ Guffa的建议上面添加了引号。但是,它仍然没有找到结果。 – 2013-02-28 21:23:49

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(),你不需要再做一次(除非你改变正确的(而不仅仅是它们的值参数)。

相关问题