2010年8月12日木曜日

データベース操作ソース

2010年8月12日

using System;
using System.Data;
using System.Data.OleDb;

class OleDbWrapper : IDisposable {

/// コネクション
OleDbConnection _connection;
/// トランザクション
OleDbTransaction _transaction;
bool _disposed;

///
/// コンストラクタ
///

/// 接続文字列
public OleDbWrapper(string connectString) {
_connection = new OleDbConnection(connectString);
}

///
/// リソースを解放します。
///

///
private void Dispose(bool disposing) {

if (_disposed == false) {
if (disposing) {
//
}
_disposed = true;
}

if (_transaction != null) {
_transaction.Dispose();
_transaction = null;
}

if (_connection != null) {
this.Close();
_connection.Dispose();
_connection = null;
}
}

///
/// リソースを解放します。
///

public void Dispose() {
this.Dispose(true);
GC.SuppressFinalize(this);
}

///
/// トランザクションを開始します。
///

public OleDbTransaction BeginTransaction() {

try {
_transaction = _connection.BeginTransaction();
} catch (Exception) {
throw;
}
return _transaction;
}

///
/// データベースへの接続を閉じます。
///

public void Close() {
try {
if (_connection != null &&
_connection.State == ConnectionState.Open) {
_connection.Close();
}
} catch (Exception) {
throw;
}
}

///
/// トランザクション処理をコミットします。
///

public void Commit() {
try {
if (_transaction != null) {
_transaction.Commit();
}
} catch (Exception) {
throw;
}
}

///
/// 接続に対して SQL ステートメントを実行し、影響を受けた行数を返します。
///

/// OleDbCommand オブジェクト
/// 影響を受けた行数
public int ExecNonQuery(OleDbCommand command) {

int ret = 0;
try {
command.Connection = _connection;
if (_transaction != null) {
command.Transaction = _transaction;
}
ret = command.ExecuteNonQuery();
} catch (Exception) {
throw;
}
return ret;
}

///
/// クエリを実行し、そのクエリが返す結果セットの最初の行にある最初の列を返します。
///

/// OleDbCommand オブジェクト
/// 結果セットの最初の行の最初の列
public Object ExecScaler(OleDbCommand command) {

Object ret = null;
command.Connection = _connection;
try {
if (_transaction != null) {
command.Transaction = _transaction;
}
ret = command.ExecuteScalar();
} catch (Exception) {
throw;
}
return ret;
}

///
/// データテーブル取得処理
///

/// OleDbCommand オブジェクト
/// DataTableオブジェクト
///
/// パラメータに渡されたコマンドを実行し、データテーブルを取得します。
///

public DataTable GetDataTable(OleDbCommand command) {

DataTable ret = null;
try {
command.Connection = _connection;
if (_transaction != null) {
command.Transaction = _transaction;
}
OleDbDataAdapter adapter = new OleDbDataAdapter(command);
OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);
ret = new DataTable();
adapter.Fill(ret);

} catch (Exception) {
ret = null;
throw;
}
return ret;
}

///
/// データベース接続を開きます。
///

public void Open() {
try {
_connection.Open();
} catch (Exception) {
throw;
}
}

///
/// トランザクション処理をロールバックします。
///

public void Rollback() {

try {
if (_transaction != null) {
_transaction.Rollback();
}
} catch (Exception) {
throw;
}
}

///
/// データテーブル更新処理
///

/// 更新対象となるデータテーブル
/// OleDbCommand オブジェクト
/// 更新に成功した行数
public int Update(DataTable source, OleDbCommand command) {

int ret = 0;
try {
command.Connection = _connection;
if (_transaction != null) {
command.Transaction = _transaction;
}
OleDbDataAdapter adapter = new OleDbDataAdapter(command);
OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);
ret = adapter.Update(source);

} catch (Exception) {
throw;
}
return ret;
}
}

2010年8月11日水曜日

SQLに要注意

2010年8月11日
1.外部結合
Oracleでは(+)を使い、SQL2005以前は*=、=*を使いますが、SQL2005以後はサポートしませんので、INNER、LEFT、RIGHT、FULLしかサポートしない。
2.decode
Oracleではdecodeを使いますが、SQL Serverrではサポートしません、代わりにCASEを使う。
例:
SELECT
CompanyInfo.CompanyId,
CompanyInfo.CompanyName,
Contract.ContractContents,
CASE WHEN ChargeInfo.CompanyId IS NULL THEN '未記入' ELSE '担当者情報' END AS ChargeFlg
FROM CompanyInfo INNER JOIN
Contract ON CompanyInfo.ContractId = Contract.ContractId
LEFT JOIN
ChargeInfo ON CompanyInfo.CompanyId = ChargeInfo.CompanyId
WHERE (CompanyInfo.Del IS NULL) OR
(CompanyInfo.Del <> 1)

3.SQL Server 2005 からは、TOP 句の 件数指定部分にパラメータが使えます
DECLARE @cnt INT
SET @cnt = 2

SELECT TOP (@cnt) [No] FROM (
SELECT 1 AS [No]
UNION SELECT 2
UNION SELECT 3
UNION SELECT 4
UNION SELECT 5
) AS [TMP]

開発際に要注意点

2010年8月11日
1.Formの派生クラスでLoadイベントを使わずにOnLoadイベントをOverrideする

class
MyForm : System.Windows.Forms.Form {
    private void MyForm_Load(object sender, EventArgs e) {
// DoSomething
}
}
ではなく
class MyForm : System.Windows.Forms.Form {
protected override void OnLoad(EventArgs e) {
base.OnLoad(e);

// DoSomething
}
}
これにはいくつかの理由があって、

1. .NETのクラスライブラリのガイドラインにそうしろと書いてある。
2. イベントは基本的に外部に知らせるためのものであり、内部で使うものではない。
3. OnLoadメソッドがLoadイベントに登録されたイベントハンドラを呼び出している。

2.is演算子の否定
if (!(obj is MyObject))

3.画面レイアウトを動的変えたいのは、複数のパネルを使って、実行際にパネル、コントロール
の表示、非表示を変えて達成できる。
パネルの最前面、後ろにするのは:
panel.SendToBack();
panel.BringToFront();
4.Windowsフォームサイズの固定
this.FormBorderStyle=FixedDialog;
MaximumSize、MinimumSizeプロパティの組み合わせて制御できる。

5.コントロールにツールチップを表示する(ToolTip)
参照URL

6.datagridviewのcurrentCellを常に[0,0]にする
gvData.CurrentCell = gvData[0, 0];

7.System.Nullable構造体は.NET 2.0から追加された構造体です

これは、intなどのnullを受け入れる事が出来ない型に対して

nullを許容させるために使用します。

int? id;

値がnullの場合にデフォルト値を割り当てること出来るようになっています。

int realId = id ?? -1;

8.Linq to SQL

・LINQ to SQL データモデルの作成(.dbml)

・データベースからエンティティクラスを作成

・遅延ローディング

・ストアドプロシジャーの使用

・データ更新

LdsBusinessDataContext db = new LdsBusinessDataContext();
int? nullmaxId = (from info in db.ChargeInfo
           select info.CompanyId).Max();
int maxId = nullmaxId ?? 0;
CompanyInfo companyInfo = new CompanyInfo();
companyInfo.CompanyId = maxId + 1;
companyInfo.CompanyName = txtCompanyName.Text;
companyInfo.ContractId = int.Parse(cmbCompanyStatus.SelectedValue.ToString());
db.CompanyInfo.InsertOnSubmit(companyInfo);
db.SubmitChanges();

参照URL

9.TextBoxに数字しか入力できないようにする

・さらにバックスペース文字も許可するには

・IMEのオン、クリップボードからの貼り付けを防ぐ

参照URL

10.データセットにパラメータの設定

参照URL

11.複数のパネル中のコンテナのタブ順を動的設定するには

・パネルでもタブ順を設定する必要ある

・コンテナのタブ順を設定する(TabIndex)

12.注意すべきコントロール
・MaskedTextBox
・DateTimePicker
・MonthCalendar
・NumermicUpDown
・WebBrowser
・RichTextBox
・SplitContainer
・TableLayoutPanel


2010年8月10日火曜日

Microsoft Visual Studio 2008 要注意

2010年8月10日
1.SQLサーバ2005とVS2008の組み合わせで、データベースにアクセスしようとするとエラーが発生してしまい。
エラー:ファイルまたはアセンブリ'Microsoft.SqlServer.ManageMent.Sdk.Sfc, Version=10.0.0.0,・・・'またはその依存関係の1つが読み込めませんでした。指定されたファイルが見つかりません。
解決策:VS2008がSQL Server2008のコンポーネントを使っているので、SQL2008をインストールしないと動かないと。
ダウンロードURL
・Microsoft SQL Server2008 管理オブジェクト
・Microsoft SQL Server2008 Native Client
・Microsoft SQL Server2008 システムCLR型
そして、Visual Studio2008でデータソースを作成しようとすると'Microsoft.VisualStdio.DataDesign.SyncDesigner'エラーが発生し、
解決策:
①SQL Srever 2008 Expresswith Advanced Services のインストール
②Visual Studio2008の再インストール(基本はSQL Serverのバージョン関係なく動くはず。)
原因:SQL Server 2008 関連のアンインストールの際に、Visual Stuido 2008 が必要とするアセンブリが一部損失したのかもしれません
2.接続文字列セキュリティ
・Windows認証の使用(お勧め)
Integrated Security=true/SSPI;
・Persist Security Info=false;->接続を開いた後、そうした情報が破棄される。

2010年8月6日金曜日

Tools紹介

2010年8月6日

1.Tera Term(さくらレンタルサーバ)
Windows向けのターミナルソフト。telnetやsshでネットワーク上の別のコンピュータに接続して操作したり、RS-232C端子などに接続した装置とCOMポートを介して通信することができる。現在はオープンソースとして公開されている。
使い方:crontab -e/-l

2.FFFTP(さくらレンタルサーバ)
とはFTP(ファイル転送)を行うためのツールです。
※現在も高頻度で新バージョンが発表されているFileZillaWinSCPなどのクライアントソフトウェアに乗り換えることが奨めです。

3.Oracle Database SQL Developer(11gでは一緒に搭載する)
Oracle SQL Developerでは、データベース・オブジェクトの参照、作成、編集と削除、SQL文およびスクリプトの実行、PL/SQLコードの編集とデバッグ、データの操作とエクスポート、レポートの表示と作成を行うことができます。
MySQL、Microsoft SQL Server、Microsoft Accessなど、特定の(Oracle以外の)サード・パーティ・データベースのスキーマに接続して、これらのデータベースのメタデータおよびデータを 表示できます。また、サード・パーティ・データベースをOracleに移行できます。

4.Common SQL Environment(CSE)
Oracle、PostgreSQL、MySQLではネイティブに接続することが出来ます。
又、ODBCが利用可能なデータベースはODBC経由で接続することが可能です。

Linuxシステム管理者

2010年8月6日
  1. crontabコマンド:シェルを定期的または指定日時に実行する(backup.sh)
参照URL

.NETマルチスレッドプ

2010年8月6日

1:スレッドの実行と同期
  • 競合状態
  • Monitor.Enter・Monitor.Exitメソッド
  • lock・SyncLockステートメント
  • 静的メソッドの同期
  • ロック専用のオブジェクト
  • MethodImplOptions.Synchronized
  • デッドロック
参照URL

2:マルチスレッド プロシージャのパラメーターと戻り値
参照URL