【发布时间】:2013-06-03 07:24:08
【问题描述】:
有一个智能设备,这个设备的操作系统是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() 方法在 BLL 中调用 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 中发生本机异常
此异常的详细信息:
异常代码:0xc0000005
异常地址:0x01ca4008
读取:0x00650094
故障模式:sqlceme35.dll
偏移量:0x00004008在 NativeMethods.GetKeyInfo(IntPtr pTx, String pwszBaseTable, IntPtr PrgDbKeyInfo, Int32 cDbKeyInfo, IntPtr pError) 在 SqlCeDataReader.FillMetaData(SqlCeCommand 命令)
在 SqlCeCommand.InitializeDataReader(SqlCeDataReader 读取器,Int32 resultType)
在 SqlCeCommand.ExecuteCommand(CommandBehavior 行为、String 方法、ResultSetOptions 选项)
在 SqlCeCommand.ExecuteDbDataReader(CommandBehavior 行为)
在 DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior 行为)
在 DbDataAdapter.FillInternal(DataSet 数据集、DataTable[] 数据表、Int32 startRecord、Int32 maxRecords、String srcTable、IDbCommand 命令、CommandBehavior 行为)
在 DbDataAdapter.Fill(DataTable[] 数据表,Int32 startRecord,Int32 maxRecords,IDbCommand 命令,CommandBehavior 行为)
在 DbDataAdapter.Fill(DataTable 数据表)
在 DALBase.ExecuteDataTable(String commandText)
在 PersonelTypeDAL.GetAll()
在 PersonelTypeBLL.GetAll()
在 Form1.RefreshGrid()
在 Form1.Form1_Load(Object sender, EventArgs e)
在 Form.OnLoad(EventArgs e)
在 Form._SetVisibleNotify(Boolean fVis)
在 Control.set_Visible(布尔值)
在 Application.Run(Form frm)
在 Program.Main()
什么是问题?我该如何解决?
问候
【问题讨论】:
-
您检查过 ExecutingAssembly .... 返回的值是否正确?
标签: c# exception sql-server-ce windows-ce