0

次の解決策を探しています。

WPF アプリケーションの参照 (読み取り専用) データを含む、埋め込みリソースとして使用される SQL サーバー コンパクト エディション ファイル (.sdf) への適切な形式の接続文字列を見つけます。

注:出力ディレクトリ設定で「埋め込みリソース」と「コピーしない」に設定された [ビルド アクション]の操作ワードに注意してください。これは、ファイルがスタンドアロン エンティティとしてターゲット コンピューターに物理的にコピーされるのではなく、アプリの実行可能ファイルに埋め込まれていることを意味します。

ここまで、単純なコード スニペットを使用して、埋め込みリソースから .sdf ファイルを取得できるソリューションをテストしました (リスト 1)。

リスト 1。

    Assembly _execAssembly = Assembly.GetExecutingAssembly();

    // helper snippet to find out all available embedded resource names
    string[] _resources = _execAssembly.GetManifestResourceNames();

    //.sdf included in IO.Stream

    System.IO.Stream _stream 
= Assembly.GetExecutingAssembly().GetManifestResourceStream("MyAssemblyName.App_Data.MyDB.sdf");

... _streamオブジェクトを .sdfに変換しDataSet/TableAdapter、 またはSystem.Data.SqlServerCeオブジェクトを使用してこのファイルに接続するには、残りのコードが必要です。SqlCeConnectionSqlCeCommandSqlCeDataReader次のサンプル コード スニペット (リスト 2) に示すように:

リスト 2。

#region private: Get DataTable using SqlCeDataReader
/// <summary>
/// Get DataTable using SqlCeDataReader
/// </summary>
/// <param name="strConn">string</param>
/// <param name="strSQL">string</param>
/// <returns>DataTable</returns>
private static DataTable GetDataTableFromFileCeReader(string strConn, string strSQL)
{
    try
    {
        using (SqlCeConnection _connSqlCe = new SqlCeConnection(strConn))
        {
            using (SqlCeCommand _commandSqlCe = new SqlCeCommand())
            {
                _commandSqlCe.CommandType = CommandType.Text;
                _commandSqlCe.Connection = _connSqlCe;
                _commandSqlCe.CommandText = strSQL;
                _connSqlCe.Open();

                using (SqlCeDataReader _drSqlCe = _commandSqlCe.ExecuteReader()) {
                    DataTable _dt = new DataTable();
                    _dt.Load(_drSqlCe);
                    _connSqlCe.Close();
                    return _dt;
                }
            }
        }
    }
    catch { throw; }
}
#endregion

ありがとうございます。

4

1 に答える 1

1

これは、SQL Server Compact Toolbox で使用するコードです。

private static string CreateStore()
    {
        var factory = System.Data.Common.DbProviderFactories.GetFactory(Resources.SqlCompact35InvariantName);
        string fileName = GetSdfName();
        string connString = string.Format("Data Source={0};", fileName);
        bool created = false;
        if (!File.Exists(fileName))
        {
            using (Stream stream = new MemoryStream(Resources.SqlCe35AddinStore))
            {
                // Create a FileStream object to write a stream to a file 
                using (FileStream fileStream = File.Create(fileName, (int)stream.Length))
                {
                    // Fill the bytes[] array with the stream data 
                    byte[] bytesInStream = new byte[stream.Length];
                    stream.Read(bytesInStream, 0, (int)bytesInStream.Length);
                    // Use FileStream object to write to the specified file 
                    fileStream.Write(bytesInStream, 0, bytesInStream.Length);
                    created = true;
                }
            }
        }

        using (var conn = factory.CreateConnection())
        {
            if (created)
            {
                conn.ConnectionString = connString;
                conn.Open();
                using (var cmd = factory.CreateCommand())
                {
                    cmd.Connection = conn;
                    cmd.CommandText = "CREATE TABLE Databases (Id INT IDENTITY, Source nvarchar(2048) NOT NULL, FileName nvarchar(512) NOT NULL, CeVersion int NOT NULL)";
                    cmd.ExecuteNonQuery();
                }
            }
        }
        return connString;
    }

    private static string GetSdfName()
    {
        string fileName = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "SqlCe35AddinStore.sdf");
        return fileName;
    }
于 2013-06-27T08:08:25.250 に答える