CRUD Opertaions с базой данных SQL Server CE на устройстве с Windows CE 5

74
8

Есть интеллектуальное устройство, ОС этого устройства - Windows CE 5. Я хочу написать прикладную программу aС# smart device, которая работает на этом устройстве. Программа С# должна связываться с базой данных SQL Server CE.

cedb1.sdf - это база данных SQL Server CE, создаваемая на устройстве, когда программа будет запущена, я вызываю метод ниже в FormLoad():

public void InitializeDatabase()
{
string startupPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
string datalogicFilePath = Path.Combine(startupPath, "cedb1.sdf");

SqlCeEngine engine = new SqlCeEngine(ConnectionString);

if(!File.Exists(datalogicFilePath))
engine.CreateDatabase();
string query = "create table PersonelType(Id int primary key identity not null,Caption nvarchar(100) null)";
ExecuteNonQuery(query);

query = "create table Personel(Id int primary key identity not null,PersonelTypeId int not null,FirstName nvarchar(100) not null,LastName nvarchar(100) not null,CardNumber nvarchar(100) null)";
ExecuteNonQuery(query);

query = @"ALTER TABLE Personel
ADD CONSTRAINT MyConstraint FOREIGN KEY (PersonelTypeId) REFERENCES
PersonelType(Id)
ON UPDATE CASCADE
on delete cascade";
ExecuteNonQuery(query);
}

База данных успешно создана.

Затем в FormLoad() я RefreshGrid() метод RefreshGrid() чтобы показать все PersonelTypes в сетке данных:

private void RefreshGrid()
{
PersonelTypeBLL personelTypeManager = new PersonelTypeBLL();
dgPersonelTypes.DataSource = personelTypeManager.GetAll();
}

PersonelType класс объекта businness:

public class PersonelType
{
public int Id { get; set; }
public string Caption { get; set; }
}

RefreshGrid() вызывает метод GetAll() в BLL:

public List<PersonelType> GetAll()
{
var repository = new PersonelTypeDAL();
var data = repository.GetAll();
List<PersonelType> personelTypes = new List<PersonelType>();

for (int i = 0; i < data.Rows.Count; i++)
{
PersonelType personelType = new PersonelType();
personelType.Id = Convert.ToInt32(data.Rows[i]["Id"]);
personelType.Caption = data.Rows[i]["Caption"].ToString();
personelTypes.Add(personelType);
}
return personelTypes;
}

и соответствующий метод GetAll() в BLL - GetAll() в DAL:

public DataTable GetAll()
{
string query = "select id, caption from personeltype";
return ExecuteDataTable(query);
}

метод ExecuteDataTable реализован следующим образом:

protected DataTable ExecuteDataTable(string commandText)
{
using (SqlCeConnection con = new SqlCeConnection(ConnectionString))
{
SqlCeCommand cmd = new SqlCeCommand();
cmd.Connection = con;
cmd.CommandText = commandText;
DataTable dt = new DataTable();
SqlCeDataAdapter da = new SqlCeDataAdapter(cmd);
con.Open();
da.Fill(dt);
con.Close();
return dt;
}
}

Свойство ConnectionString:

protected string ConnectionString
{
get
{
string startupPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
string datalogicFilePath = Path.Combine(startupPath, "cedb1.sdf");
return string.Format("DataSource={0};password=123456", datalogicFilePath);
}
}

Исключено, сообщение об исключении:

Ошибка: в SDPOffDbPersonel.exe произошло собственное исключение

подробнее об этом исключении пишите:

ExceptionCode: 0xc0000005
ИсключениеAddress: 0x01ca4008
Чтение: 0x00650094
Неисправность: sqlceme35.dll
смещение: 0x00004008

в NativeMethods.GetKeyInfo(IntPtr pTx, String pwszBaseTable, IntPtr PrgDbKeyInfo, Int32 cDbKeyInfo, IntPtr pError) в SqlCeDataReader.FillMetaData (команда SqlCeCommand)
в SqlCeCommand.InitializeDataReader(SqlCeDataReader reader, Int32 resultType)
в SqlCeCommand.ExecuteCommand (поведение CommandBehavior, метод String, параметры ResultSetOptions)
в SqlCeCommand.ExecuteDbDataReader (поведение CommandBehavior)
в DbCommand.System.Data.IDbCommand.ExecuteReader (поведение CommandBehavior)
в DbDataAdapter.FillInternal(DataSet dataset, DataTable [] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, команда IDbCommand, поведение CommandBehavior)
в DbDataAdapter.Fill(DataTable [] datatables, Int32 startRecord, Int32 maxRecords, команда IDbCommand, поведение CommandBehavior)
в DbDataAdapter.Fill(DataTable dataTable)
в DALBase.ExecuteDataTable(String commandText)
в PersonelTypeDAL.GetAll()
в PersonelTypeBLL.GetAll()
в Form1.RefreshGrid()
в Form1.Form1_Load (отправитель объекта, EventArgs e)
в Form.OnLoad(EventArgs e)
в Form._SetVisibleNotify (Boolean fVis)
на Control.set_Visible (логическое значение)
на Application.Run(Form frm)
в Program.Main()

Что проблема? И как я могу это решить?

С уважением

спросил(а) 2021-01-28T00:10:15+03:00 4 недели, 1 день назад
1
Решение
60

Похоже, что это проблема с несоответствием версии между файлом System.Data.SqlServerCe.dll и неуправляемыми файлами dll на устройстве - http://social.msdn.microsoft.com/Forums/en-US/sqlce/thread/fd60ba69-e4d6-441a-901f-947ac7a46d3c/ - решение состоит в том, чтобы убедиться, что такая же версия используется в среде и устройстве dev, возможно, SSCE 3.5 SP2 - http://www.microsoft.com/en-us/download/details.aspx? ID = 8831

ответил(а) 2021-01-28T00:10:15+03:00 4 недели, 1 день назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема