在Windows CE 5的设备上使用SQL Server CE数据库进行CRUD操作
本文关键字:CE 数据库 Server SQL 操作 CRUD Windows | 更新日期: 2023-09-27 18:16:27
有一个智能设备,该设备的操作系统是Windows CE 5。我想写一个c#智能设备应用程序,运行在这个设备上。c#程序必须与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()
方法来显示数据网格中的所有PersonelTypes
:
private void RefreshGrid()
{
PersonelTypeBLL personelTypeManager = new PersonelTypeBLL();
dgPersonelTypes.DataSource = personelTypeManager.GetAll();
}
PersonelType
是业务对象类:
public class PersonelType
{
public int Id { get; set; }
public string Caption { get; set; }
}
RefreshGrid()
方法调用GetAll()
方法:
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;
}
, BLL中GetAll()
的对应方法为DAL中的GetAll()
:
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: 0 xc0000005
在NativeMethods
ExceptionAddress: 0 x01ca4008
阅读:0 x00650094
故障模式:sqlceme35.dll
偏移量:0x00004008。GetKeyInfo(IntPtr pTx, String pwszBaseTable, IntPtr PrgDbKeyInfo, Int32 cDbKeyInfo, IntPtr pError) at SqlCeDataReader。FillMetaData (SqlCeCommand命令)
在SqlCeCommand。InitializeDataReader(SqlCeDataReader reader, Int32 resultType)
在SqlCeCommand。执行命令(CommandBehavior行为,字符串方法,ResultSetOptions选项)
在SqlCeCommand。ExecuteDbDataReader (CommandBehavior行为)
在DbCommand.System.Data.IDbCommand。ExecuteReader (CommandBehavior行为)
在DbDataAdapter。FillInternal(DataSet DataSet, DataTable[] DataTable, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand命令,CommandBehavior行为)
在DbDataAdapter。Fill(DataTable[] DataTable, Int32 startRecord, Int32 maxRecords, IDbCommand命令,CommandBehavior行为)
在DbDataAdapter。填充(DataTable DataTable)
在DALBase。ExecuteDataTable(字符串commandText)
在PersonelTypeDAL.GetAll ()
在PersonelTypeBLL.GetAll ()
在Form1.RefreshGrid ()
在Form1。Form1_Load(对象发送者,EventArgs e)
在形式。OnLoad (EventArgs e)
在形式。_SetVisibleNotify(布尔fVis)
在控制。set_Visible(布尔值)
在应用程序中。运行(农场)
是什么问题?怎么解呢?
对
看起来这是一个与System.Data.SqlServerCe.dll文件和设备上的非托管dll文件之间的版本不匹配的问题- http://social.msdn.microsoft.com/Forums/en-US/sqlce/thread/fd60ba69-e4d6-441a-901f-947ac7a46d3c/-解决方案是确保在开发环境和设备中使用相同的版本,最好是SSCE 3.5 SP2 - http://www.microsoft.com/en-us/download/details.aspx?id=8831