2013-02-28 2 views
0

У меня есть таблица доступа с именем Table1, которая имеет поле с именем 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; 

Что мне здесь не хватает?

Спасибо!

EDIT: Это работает, и это то, что я в конечном итоге с помощью:

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? –

ответ

3

Вы назначаете номер к параметру, поэтому значение будет преобразовано в строку "10005", не "010005".

Назначают его в виде строки параметра:

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

Кроме того, вы должны удалить апостроф вокруг параметра, в противном случае он не будет признавать его в качестве параметра и искать строки "@p1" вместо:

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

ОК, что имеет смысл. Я обновил свой код с вашим предложением, но запрос все еще не находит 010005 в таблице. Я трижды проверил, что это значение существует, и имя таблицы верное. –

+0

@JeffBrady: Сделайте тест, поместив значение непосредственно в запрос: '' Выберите * FROM Таблица1 WHERE FieldA = '010005' "'. Если это работает, то вы знаете, что что-то не так с тем, как вы используете параметр, иначе его просто нет, и вы можете, например, проглатывать неправильную базу данных. – Guffa

+0

Я пробовал это и до сих пор не возвращает результатов. Я ожидаю, что dataGridView1 покажет результат. Надеюсь, это правильно в моем коде. –

0

вы ищете @p1 так вы процитировали его

Используйте вместо этого:

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

спасибо .. Я сбросил котировки вокруг параметра, а также добавил котировки к значению, указанному выше в предложении Гуффа. Однако он все еще не находит результата. –

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(), вам не нужно делать это снова (если вы не изменяли параметры правильные (а не только их значения).

Смежные вопросы