リード開発メモ

大阪のソフトウェア会社です。 技術的な事柄についてのメモとしてブログを始めます。

2013年11月

SQL Server トランザクションログを小さくする

SQL Server のデータベースは、mdf ファイルと ldf ファイルから成っている。ldf ファイルはトランザクションログであり、肥大している場合は、サイズを小さくすることができる。

SQL Server Management Studio (ssms) を使って、トランザクションログのサイズを小さくする手順は以下のとおり。

1. SSMS で、対象となるデータベースで右クリックし、[タスク] - [圧縮] - [ファイル] とたどり、[ファイルの圧縮]ダイアログを開く。
2. [データベース ファイルおよびファイル グループ]の[ファイルの種類]で[ログ]を選ぶ。
3. [圧縮アクション]で[未使用領域の解放前にページを再構成する]を選び、[圧縮先のファイル]に圧縮後の目標サイズを入力する。ただし希望通りになるとは限らない。
4. [OK]ボタンを押す。
sqlserver-log-compress3

これでldf ファイルのサイズは小さくなる。ただし、実行中のトランザクションがあったりすると目標通りのサイズにならない場合もあるようだ。

以上。

SQL Server で CSV ファイルからインポートする

Microsoft SQL Server Management Studio (ssms)を使って CSV ファイルからインポートするのに、手間取ったのでその時のメモ。

インポートする対象となるデータベースで右クリックし、[タスク] - [データのインポート]をクリック。すると「SQL Server インポートおよびエクスポート ウィザード」が起動する。
ssms-csv-import1

[次へ]を押し、[データソースの選択]で[フラット ファイル ソース]を選ぶ。すると、ファイルを選択できるようになるので、[参照]ボタンを押して、データ元となる CSV ファイルを選ぶ。ここで、CSVファイルの1行目が列名の場合は、[先頭データ行を列名として使用する]にチェックを入れておく。
ssms-csv-import2

次に気をつけるポイントは[マッピングの詳細]だが、もしテーブルに IDENTITY 属性を持った項目がある場合は、ここで以下のように [ID 挿入を許可する]にチェックを入れる必要がある。
ssms-csv-import4

また、以下のようなエラーが出るテーブルがあった。
- 実行しています (エラー)
メッセージ
エラー 0xc02020a1: データ フロー タスク 1: データ変換に失敗しました。列 "町域名カナ" のデータ変換から、状態値 4 と状態を示すテキスト "テキストが切り捨てられたか、または対象になるコード ページで 1 つ以上の文字が一致しませんでした。" が返されました。
 (SQL Server インポートおよびエクスポート ウィザード)
 
エラー 0xc020902a: データ フロー タスク 1: "出力列 "町域名カナ" (26)" が切り捨ての発生により失敗しました。"出力列 "町域名カナ" (26)" の切り捨て行の処理により、切り捨てによる失敗が示されます。ここに示されたコンポーネントのオブジェクトで切り捨てエラーが発生しました。
 (SQL Server インポートおよびエクスポート ウィザード)
 
エラー 0xc0202092: データ フロー タスク 1: データ行 0 で、ファイル "C:\work\BB\xxxxxxxx\郵便番号M.rpt" の処理中にエラーが発生しました。
 (SQL Server インポートおよびエクスポート ウィザード)
 
エラー 0xc0047038: データ フロー タスク 1: SSIS エラー コード DTS_E_PRIMEOUTPUTFAILED。コンポーネント "変換元 - 郵便番号M_rpt" (1) の PrimeOutput メソッドからエラー コード 0xC0202092 が返されました。パイプライン エンジンが PrimeOutput() を呼び出したときに、このコンポーネントからエラー コードが返されました。このエラー コードの意味はコンポーネントで定義されていますが、これは致命的なエラーであるため、パイプラインの実行は停止されました。このエラーの前に、エラーの詳細が記載されたエラー メッセージが報告されている可能性があります。
 (SQL Server インポートおよびエクスポート ウィザード)

このケースでは[データソースの選択]のところで[詳細設定]をクリックし、問題となっている列の[OutputColumnWidth] を大きくしておく必要があるようだ。
以上。

PetaPoco を使ってみる(その8)

PetaPoco の main branch は複合キー(複数の項目で主キーを形成する)に対応していないようだ。

まず、T4 Template による POCO の自動生成を行うと、POCO に PrimaryKey 属性が付加されるが、主キーのうちの最初の項目しか認識されない。そして、PetaPoco.cs 内の各処理も複合キーに対応していないようだ。

したがって、PetaPoco の main branch を使っている場合で、複合キーを持つテーブルに対して Updateメソッドや Delete メソッドを使うと、意図しない結果になってしまう。しょうがなく SQL を実行することになる。

実は、 複合キーに対応した PetaPoco の派生が Github にあがっている。
https://github.com/schotime/petapoco

この branch では、ほかに Version 属性などにも対応しているようだ。

しかし、この branch に付属の T4 Tempalate でも、複合キーに対応していないようなので、自分で T4 Tempalate を書き換える必要がある。
その際は、次のように PrimaryKey 属性にカンマ区切りで主キーの項目名が並ぶようにする。
[TableName("銀行口座M")]
[PrimaryKey("支部コード,地区コード", autoIncrement=false)]
[ExplicitColumns]
public partial class PPRow_銀行口座M : PPDB.Record  
{
	[Column] public string 支部コード { get; set; }
	[Column] public string 地区コード { get; set; }
	[Column] public string 銀行名 { get; set; }
	[Column] public string 銀行支店名 { get; set; }
	[Column] public DateTime? 登録日時 { get; set; }
	[Column] public DateTime? 変更日時 { get; set; }
}

以上。

PetaPoco を使ってみる(その7)

前回は、PetaPoco 付属の T4 Template で Poco を自動生成した。
PetaPoco を使ってみる(その6)

ただ、できあがった cs ファイル(デフォルトでは Database.cs)の中を見てみると、空白行がえらく多く、不恰好である。

この原因は T4 Template のファイルの改行コードが LF になっているためのようだ。以下のファイルを改行コード CR+LF で保存しなおしておくと具合がよくなる。
  ・Database.tt
  ・PetaPoco.Core.ttinclude
  ・PetaPoco.Generator.ttinclude

以上。

PetaPoco を使ってみる(その6)

PetaPoco には、データベースから Poco を自動的に生成するための T4 Template が付属している。今回はそれを使ってみる。

https://github.com/toptensoftware/petapoco
上から PetaPoco をダウンロードすると、Models フォルダの下に Generated フォルダがあり、その中に以下の4ファイルがある。
  ・Database.cs
  ・Database.tt
  ・PetaPoco.Core.ttinclude
  ・PetaPoco.Generator.ttinclude

これらのファイルのうち下の3つをプロジェクトに追加して、Visual Studio から使用するのだが、今回は分かりやすいように新規プロジェクトでやってみる。

1. C# のクラスライブラリの新規プロジェクトを作成する。

2. アプリケーション設定ファイル App.config をプロジェクトに追加し、データベースへの接続文字列を追加する。たとえば接続文字列名 PPTest で追加すると、以下のようになる。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
        <add name="PPTest" providerName="System.Data.SqlClient" connectionString="Data Source=localhost\SQLEXP2012; Initial Catalog=PPDB; User ID=sa; Password=sa; " />
    </connectionStrings>
</configuration>


3. 参照設定の追加で System.Configuration を追加する。上記の接続文字列を読み込むのに必要となるようだ。

4. ダウンロードした PetaPoco のファイルのうち、以下をプロジェクトに追加する。
  ・PetaPoco.cs
  ・Database.tt
  ・PetaPoco.Core.ttinclude
  ・PetaPoco.Generator.ttinclude

5. 追加した Database.tt を開き、冒頭の ConnectionStringName に、App.config に追加した接続文字列名を指定する。ここでは上で指定した PPTest を設定する。
また、必要に応じて Settings とコメントのある部分を編集する。ここでは Namespace と ClassPrefix を指定してみた。
    // Settings
    ConnectionStringName = "SHK";            // Uses last connection string in config if not specified
    Namespace = "PPTest.PPDatabase";
    RepoName = "";
    GenerateOperations = true;
    GeneratePocos = true;
    GenerateCommon = true;
    ClassPrefix = "PPRow_";
    ClassSuffix = "";
    TrackModifiedColumns = false;

6. ここまで設定したら、Visual Studio のソリューションエクスプローラーの Database.tt の上で右クリックし、「カスタム ツールの実行」を選ぶ。そうすると、Database.cs が生成され、その中に Poco が生成されている。

以上だが、そのままやると以下のような警告が出てしまう。
C# 2.0 と C# 3.5 のコンパイラはサポートされなくなりました。テンプレートは、指定された 'v3.5' ではなく、常にバージョン 4 のコンパイラでコンパイルされます。

警告が嫌な場合は、PetaPoco.Core.ttinclude の1行目にある以下の "C#v3.5" を "C#" と編集するといい。
<#@ template language="C#v3.5" hostspecific="True" #>

以上。

アクセスカウンター
  • 今日:
  • 昨日:
  • 累計: