Во-первых, некоторые вещи, на которые следует обратить внимание:
1) Как отметили другие комментаторы, используйте столбец «Чтение», а не столбец «Местоположение».Я знаю, что вы упомянули, что тестируете, но поменять местами имена столбцов и затем изменить код - не самый простой способ устранения этих проблем.Попробуйте изменить только одну вещь за раз.
2) Если чтение является числовым, вам придется преобразовать значение столбца в первую очередь.
Таким образом, ваш запрос становится:
"SELECT * FROM Main2 WHERE CONVERT(varchar, Reading) LIKE @Barcode";
Также см. Как использовать параметр с LIKE в Sql Server Compact Edition для получения дополнительной помощи по работе с параметрами в SqlServerCE.
3) Установите тип параметра для вашего SqlCEParameter.Я привел ссылку на соответствующую страницу в приведенном ниже примере кода.
4) Вы используете ExecuteNonQuery без причины.Просто избавьтесь от этого в этом контексте.Это когда вы хотите внести изменения в базу данных (например, вставить, обновить, удалить) или выполнить что-то (например, сохраненный процесс, который также может вставлять, обновлять, удалять и т. Д.), Который не возвращает никаких строк.Возможно, вы вырезали и вставили этот код из другого места в вашем приложении: -)
5) Используйте , используя на одноразовых предметах (см. Пример ниже).Это сделает управление жизненным циклом вашего соединения намного проще.Он также более читабелен (IMO) и позаботится о проблемах при возникновении исключений.
6) Используйте оператор using
для импорта BCL (библиотеки базовых классов) в текущее пространство имен:
Добавьте следующие операторы использования в начало вашего класса (.cs).Это значительно упростит использование всех классов .Net (и будет намного легче читать и меньше изнашивать вашу клавиатуру; -)
using System.Data.SqlServerCe;
using System.IO;
using System.Reflection;
Более полный пример будет выглядеть следующим образом
private void buttonStart_Click(object sender, EventArgs e)
{
using(SqlCeConnection conn = new SqlCeConnection(
("Data Source=" + (Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase), "ElectricReading.sdf") + ";Max Database Size=2047"))))
{
// Connect to the local database
conn.Open();
using(SqlCeCommand cmd = conn.CreateCommand())
{
SqlCeParameter param = new SqlCeParameter();
param.ParameterName = "@Barcode";
param.DBType = DBType.String; //Intellisense is your friend here but See http://msdn.microsoft.com/en-US/library/system.data.sqlserverce.sqlceparameter.dbtype(v=VS.80).aspx for supported types
param.Value = "%" + textBarcode.Text.Trim() + "%";
// SELECT rows
cmd.CommandText = "SELECT * FROM Main2 WHERE CONVERT(varchar, Reading) LIKE @Barcode";
cmd.Parameters.Add(param);
//cmd.ExecuteNonQuery(); //You don't need this line
DataTable data = new DataTable();
using (SqlCeDataReader reader = cmd.ExecuteReader())
{
data.Load(reader); //SqlCeDataReader does not support the HasRows property.
if(data.Rows.Count > 0)
{
this.dataGrid1.DataSource = data;
}
}
}
}
}
Intellisense должен быть в состоянии устранить любые ошибки с помощью вышеприведенного, но не стесняйтесь обращаться за дополнительной помощью.
Наконец, вы также можете установить источник данных сетки непосредственно насчитыватель данных, попробуйте!
using (SqlCeDataReader reader = cmd.ExecuteReader())
{
dataGrid1.DataSource = reader;
}
Затем вы можете избавиться от DataTable.