ASP.NETでUTF-8BOM付きテキストファイルをダウンロードさせる方法
ASP.NETでUTF-8BOM付きテキストファイルをダウンロードさせる方法
Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Disposition", "attachment; filename=Sample.txt"); //BOMを送信(ココが今回のポイント) byte[] bom = System.Text.Encoding.UTF8.GetPreamble(); Response.BinaryWrite(bom); //本文を送信 string text = "サンプルテキスト"; Response.BinaryWrite(Encoding.UTF8.GetBytes(text)); Response.End();
どんな状況で、こんなものが必要になることがあるかというと、
ASP.NETでクライアントにテキストファイルをダウンロードさせる場合、
クライアントのOSがWindowsであれば、
Shift-JISのファイルをダウンロードさせれば、OS標準のエディタで開けますが、
同じファイルをMacで開こうとすると、
OS標準のエディタでは、Shift-JISを開けるように設定しないと開けません。
じゃあ、UTF-8であれば開くのでは?と思ってエンコードだけをUTF-8(BOMなし)にしても、
設定変更しないと開けません。
そこで、UTF-8BOM付きであれば、WindowsでもMacでもOS標準のエディタで
特別な設定なしに開けます。(古いOSを除く。)
で、BOMってどうやって付けるの?ってことで今回の内容です。
Entity FrameworkでTransactionScopeを使用する際にMS-DTCへの昇格を防止する方法
Entity Frameworkを使用したプログラムで、TransactionScope内で2つ以上のクエリを実行した場合、何もしなければMS-DTCが使用されます。
しかし、単一のDBしか使用しないプログラムを作成していて、分散トランザクションが不要の場合、MS-DTCを使用するとオーバーヘッドが生じたり、デプロイするマシンの設定変更が必要になったりするため、不用意にMS-DTCへの昇格を防ぎたいことがあります。
そんな場合は以下のように、クエリを実行する前にオブジェクトコンテキストのDB接続を開くと、MS-DTCを使用せずにLCTで処理されるため、ローカルトランザクションと同様の仕組みで処理されます。
//選択して更新する場合 using (NORTHWNDEntities context = new NORTHWNDEntities()) { using(TransactionScope ts = new TransactionScope()) { //DB接続を開く(ココが今回のポイント) context.Connection.Open(); //選択(ProductIDが1のデータを取得) var query = from t in context.Products where t.ProductID == 1 select t; var product = query.First(); //更新(UnitsInStockを99に更新) product.UnitsInStock = 99; context.SaveChanges(); ts.Complete(); } }
【補足】DBがSQL Server 2008の場合は、上記と同様の条件下であれば、対応を入れなくてもMS-DTCへ昇格しません。
SQL Serverのスキーマから簡易テーブル設計書を作成するSQL
SQL Serverのスキーマから簡易テーブル設計書を作成するSQLです。
Management Studioで出力対象のDBに対して下記SQLを発行してください。
あとは、クエリ結果をExcelにでもコピペして加筆、整形してください。
SELECT C.TABLE_NAME AS TableName, C.ORDINAL_POSITION AS OrdinalPosition, CASE WHEN T1.COLUMN_NAME IS NULL THEN 0 ELSE 1 END AS IsPK, C.COLUMN_NAME AS ColumnName, C.DATA_TYPE AS DataType, CASE C.CHARACTER_MAXIMUM_LENGTH WHEN -1 THEN 'MAX' WHEN NULL THEN '' ELSE ISNULL(CONVERT(VARCHAR(10), C.CHARACTER_MAXIMUM_LENGTH), '') END AS MaximumLength, CASE WHEN C.IS_NULLABLE = 'NO' THEN 0 ELSE 1 END AS IsNullable, COLUMNPROPERTY(OBJECT_ID(QUOTENAME(C.TABLE_SCHEMA) + '.' + QUOTENAME(C.TABLE_NAME)), C.COLUMN_NAME, 'IsIdentity') AS IsIdentity, ISNULL(C.COLUMN_DEFAULT, '') AS ColumnDefault FROM INFORMATION_SCHEMA.COLUMNS AS C LEFT OUTER JOIN( SELECT K.TABLE_NAME, K.COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS K INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS T ON K.TABLE_NAME = T.TABLE_NAME AND K.CONSTRAINT_NAME = T.CONSTRAINT_NAME WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' ) AS T1 ON C.TABLE_NAME = T1.TABLE_NAME AND C.COLUMN_NAME = T1.COLUMN_NAME ORDER BY C.TABLE_NAME, C.ORDINAL_POSITION
(2010/04/29 修正)
もっと細かい情報を出力したい場合は上記SQLと同じような感じで、各種ビュー(下記URL参照)の情報をゴニョゴニョすれば抽出できます。
http://msdn.microsoft.com/ja-jp/library/ms186778.aspx
「使って覚える Visual Studio 2008」単体テスト
http://www.microsoft.com/japan/msdn/vstudio/2008/tech/howto/unittest/
Visual Studio 2008 を使用した単体テストを、キャプチャ付でとてもわかりやすくまとめられています。
とても短いのでさらっと読めます。
初心者の方も、NUnitを使用している方も読んでみることをお勧めします。
LINQ to Entitiesのサポート非対象のメソッド
LINQ to SQL のノリで LINQ to Entities を使用すると
サポート対象メソッドが異なるので、注意しましょう。
http://msdn.microsoft.com/ja-jp/library/bb738550.aspx
では、LINQ to Entities を使用していて非対象のメソッドが必要な場合、回避するにはどうするのがベストなのだろうか?
- DB側にビューを作る?(しょうもないビューがたくさん出来そう。)
- 非対象のメソッドを避けてクエリを作成する?(これですべて回避できるかな?できても開発効率が落ちる?)
- 該当部分だけ LINQ to SQL を使う?(エンティティをLINQ to Entitiesと別に作る?そもそもLINQ to SQLで対応できない場合もある?)
- SQLCommandで直接SQLを投げる?(これならどうにでもできるけど…。構文エラーとかタイプセーフとかどうする?)
…
- (V2でサポートされることを祈る?)
SharePoint Designer 2007 が無償ダウンロード化
Microsoft Office SharePoint Designer 2007 が無償ダウンロード可能になってました。
http://www.microsoft.com/japan/sharepoint/letter/SPD_20090401_01.mspx
知らなかった…。
どうやら、Expression Webへシフトしていくようですね。