前回FPDFの話をしましたが、本家のサイトにmbfpdfがありました。


http://www.fpdf.org/phorum/read.php?f=1&i=7977&t=7977

この「Japanese Support」の一番下のリンク


解凍したフォルダ内のファイル、フォントフォルダを前回解凍したfpdfのフォルダにコピーします。

PHPで印刷(PHPでPDF出力)


で、次のコードは前回同様、実行ファイルと同階層にfpdfフォルダがある場合を想定してます。


-- code ------------------


<?php

/*
require('fpdf/japanese.php');

$pdf=new PDF_Japanese();
$pdf->AddSJISFont();

*/

require('fpdf/mbfpdf.php');

$pdf=new MBFPDF();
$pdf->AddMBFont(GOTHIC ,'SJIS');

$pdf->Open();
$pdf->AddPage();
$pdf->SetFont('SJIS','',9);
$pdf->Text(10, 10, "PHPでPDFを出力するテスト");

$pdf->Output();
?>


-------------------------


PHPとPDFが全角と半角で表示されているはずです。


注意としてはrequireを関数内で行わない事。


基本は関数の外で行うのかもしれませんが、仕様上どうしても関数内でのみ利用したかったので、関数内で呼び出したら・・・その中でglobal宣言+globalを使われてたので、エンコードが認識できず動かなかったからです。



プログラミングPHP 第2版/Rasmus Lerdorf
¥3,990
Amazon.co.jp


今回は前回行を追加したので、追加した行を全部マルッと取得します。


-- code ---------------


/*

テーブル名がTests

カラムが

TestID (インクリメント)

Memo varchar(2000)

InputDate datetime

*/

using (SqlConnection conn = new SqlConnection("Data Source=(local);Initial Catalog=MySample;Integrated Security=True")) {
try {
SqlCommand com = new SqlCommand();
com.CommandText = "SELECT * FROM Tests";
com.Connection = conn;

SqlDataAdapter adapter = new SqlDataAdapter();

adapter.SelectCommand = com;

DataSet ds = new DataSet();

adapter.Fill(ds, "Tests");

foreach(DataRow row in ds.Tables["Tests"].Rows){

Console.WriteLine("[{0}]\r\n{1}\r\n", dr["InputDate"], dr["Memo"]);

}
}
catch (Exception ex) {
Console.WriteLine(ex);
}
}


----------------------



タイトルにもあるインメモリは、簡単に言うとメモリ内でデータベースを構築することです。


データベースはDataSet型です。


DataSetはDataTableを保持し、DataTableはDataRowを保持します。


DataRowがデータベースの行に相当します。


SqlDataAdapterでDataSet内に指定したSQLで自動でDataTableを作成してます。


後は、一行づつ呼び出して、日付とメモを出力してます。


ちなみに、ConnectionをOpenしていないですが・・・SqlDataAdapterのFill内でOpenしていない場合は自動でOpenからCloseまでをやってくれます。


ただし、Fillを2回も3回も呼び出す場合は、都度OpenとCloseを繰り返すので最初にOpenをしておくとオーバヘッドを減らすことができます。


DataTableの定義は、もちろんコードで書くこともできますが、Fillメソッドが自動で生成してくれてます。


Visual Studioを利用すればドラッグ&ドロップで簡単なデータベース操作はできてしまいますが。。。


ソースでもそんなに労せずデータベース操作ができてしまいます。


追加の方法は・・・



-- code --------------

/*

テーブル名がTests

カラムが

TestID (インクリメント)

Memo varchar(2000)

InputDate datetime

*/

using (SqlConnection conn = new SqlConnection("Data Source=(local);Initial Catalog=MySample;Integrated Security=True")) {
try {
SqlCommand com = new SqlCommand();
com.CommandText = "INSERT INTO Test (Memo,InputDate) VALUES(@Memo,getdate())";
com.Parameters.AddWithValue("@Memo", "メモです。");
com.Connection = conn;
conn.Open();
com.ExecuteNonQuery();
}
catch (Exception ex) {
Console.WriteLine(ex);
}
}


---------------------


これだけです。


usingでインスタンスの生存範囲を決めます。

(Integrated SecrurityでWindows認証を使ってます)


SQL文をSqlCommandオブジェクトにセットします。


パラメータ(SQL文内で@で始まってるとこ)の値をセットします。


どこのDBにSQL文を送るかセットします。


DBとの接続を開始します。


実行します。


try句でくくってるんで何かしらのエラーがでたらcatch句内に飛んで、エラーメッセージをコンソールに出力します。

他に出力したい場合はココを変更。


using句を抜けてSqlConnectionは自動的に破棄されます。デストラクタでClose処理を自動でやるので、明示的にDBとの接続を閉じなくても問題ない。


気になる人はSQLServerの管理ツールで確認してみましょう。