0

スマートデバイスがあり、このデバイスの OS は Windows CE 5 です。このデバイスで動作する ac# スマート デバイス アプリケーション プログラムを作成したいと考えています。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()メソッドは 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
ExceptionAddress: 0x01ca4008
読み取り: 0x00650094
フォールト モード: sqlceme35.dll
オフセット: 0x00004008

NativeMethods.GetKeyInfo (IntPtr pTx、文字列 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[] 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(フォーム frm)
でProgram.Main()

問題は何ですか?どうすれば解決できますか?

よろしく

4

1 に答える 1

1

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

于 2013-06-03T07:54:59.133 に答える