.NET開発のTipsなぐりがき!

.NET開発のTipsになりそうな情報をとりあえずなぐりがきしようかなと。 (検証は全てVisualStudio2005環境。コードはC#。VB.NETはそのうち。)

Tipsへのアクセスは、目次か、右上の検索からどうぞ。
また.NET開発でわからないことは、C#,VB.NETラウンジで質問して下さい。 Powered by

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


ブログランキングに参加してます!→

環境に関する情報を取得

現在の環境に関する情報を取得するには、Environmentクラスを使用します。

Console.WriteLine("NetBIOS名:" + Environment.MachineName);
Console.WriteLine("OSのバージョン:" + Environment.OSVersion);
Console.WriteLine("システムディレクトリ:" + Environment.SystemDirectory);
Console.WriteLine("CLRのバージョン:" + Environment.Version);
Console.WriteLine("改行:" + Environment.NewLine);

出力:
NetBIOS名:DELL
OSのバージョン:Microsoft Windows NT 5.1.2600 Service Pack 2
システムディレクトリ:C:\WINDOWS\system32
CLRのバージョン:2.0.50727.42
改行:


FC2 Management


ブログランキングに参加してます!→

テーマ:プログラミング - ジャンル:コンピュータ - .NET開発の質問は:C#,VB.NETラウンジ

フォームを閉じる

フォームを閉じるには、Form#Close()メソッドを使用します。
また、必要のなくなった時点でDispose()で破棄します。
モードレスダイアログの場合は、Close()メソッドの時点で破棄されているのでDispose()は必要ありません。

// モーダル
Form1 form = new Form1();
form.ShowDialog();
form.Dispose();

// モードレス
Form1 form = new Form1();
form.Show();
form.Close();

モードレスのフォームを破棄ではなく、非表示にするだけの場合は
Close()ではなく、Hide()メソッドを呼びます。

外部からではなく内部から閉じる場合は、閉じるフォームのコードに以下を記述します。

// 自分自身を閉じる
this.Close();

・関連記事
フォームで閉じたボタンを判定

ブログランキングに参加してます!→

テーマ:プログラミング - ジャンル:コンピュータ - .NET開発の質問は:C#,VB.NETラウンジ

フォームの初期処理/終了処理

フォームが初めて表示される直前に、Loadイベントが発生します。
フォームを表示する前に初期処理を行いたい場合には、Loadイベント時の処理を追加します。

フォームデザイナからフォーム、あるいはフォームのプロパティのLoadイベントをダブルクリックすると
初期処理のメソッド名を追加できます。

private void Form1_Load(object sender, EventArgs e)
{
  // 初期処理
}

フォーム終了時にはFormClosingイベント,FormClosedイベントが発生します。
(.NET 2.0からはClosingイベント、Closedイベントではなく上記イベントを使用します)

また、Application#Exit()で終了した場合には、FormClosingイベント,FormClosedイベントは
発生しないので注意が必要です。

(※).NET Framework version 2.0新機能

ブログランキングに参加してます!→

Oracle Data Provider for .NET (ODP.NET) でデータベースアクセス(パラメータ)

Oracle Data Provider for .NET (ODP.NET) を使用して、動的なパラメータのある
データベースアクセスを行うにはOracleParameterクラスを使用します。

ODP.NETを使用する場合は、バインドするパラメータを名前で指定するか
位置で指定するかをBindByNameで指定します。
名前で指定するには、BindByNameをtrueにします。

using (OracleConnection con = new OracleConnection())
{
  con.ConnectionString = "User Id=scott; Password=tiger; Data Source=oracle";
  con.Open();

  try
  {
    // Commandオブジェクト生成
    using (OracleCommand cmd = con.CreateCommand())
    {
      // クエリ文字列
      cmd.CommandText = "select column1, column2 from test where column2 = :column2 and column1 = :column1";

      // バインド・メソッドを指定(名前指定パラメータ)
      cmd.BindByName = true;

      // パラメータの生成(プレイスホルダを名前で指定)
      OracleParameter para1 = new OracleParameter();
      para1.ParameterName = "column1";
      para1.Value = "103";
      cmd.Parameters.Add(para1);

      OracleParameter para2 = new OracleParameter();
      para2.ParameterName = "column2";
      para2.Value = "test";
      cmd.Parameters.Add(para2);

      // クエリの実行
      using (OracleDataReader reader = cmd.ExecuteReader())
      {
        while (reader.Read())
        {
          // カラム名
          Console.WriteLine(reader["column1"]);
          Console.WriteLine(reader["column2"]);
        }
      }
    }
  }
  finally
  {
    if (con != null)
    {
      con.Close();
    }
  }
}

位置で指定する場合は、クエリで指定したパラメータと、OracleParameterオブジェクト
の追加順を同じにする必要があります。
この場合は、プレイスホルダと、OracleParameterの名前が一致している必要はありません。
ちなみに、こちらがデフォルトになっていてBindByNameを指定しなければ位置指定になります。

// クエリ文字列
cmd.CommandText = "select column1, column2 from test where column1 = :param and column2 = :param";

// パラメータの生成(プレイスホルダを順番で指定)
OracleParameter para1 = new OracleParameter();
para1.Value = "103";
cmd.Parameters.Add(para1);

OracleParameter para2 = new OracleParameter();
para2.Value = "test";
cmd.Parameters.Add(para2);

パラメータの型は、設定された値から推測されますが、明示的に指定する場合は、OracleParameter.DbTypeにOracleDbType列挙体を指定します。

・関連記事
Oracle Data Provider for .NET (ODP.NET) でデータベースアクセス
汎用的なコードでデータベースアクセス(パラメータ))

ブログランキングに参加してます!→

テーマ:プログラミング - ジャンル:コンピュータ - .NET開発の質問は:C#,VB.NETラウンジ

Oracle Data Provider for .NET (ODP.NET) でデータベースアクセス

Oracle Data Provider for .NET (ODP.NET) を使用して、データベースアクセスするには、
まず「http://otn.oracle.co.jp" target="_blank">OTNからODP.NETをダウンロードしてきてインストールします。
(注意)ADO.NET 2.0で使用するには対応するODP.NETをインストールする必要があります。(10.2.0.2.20以降)

また、参照の追加で%ORACLE_HOME%/odp.net/bin/2.x以下のOracle.DataAccess.dllを追加します。

using Oracle.DataAccess.Client;
...

using (OracleConnection con = new OracleConnection())
{
  con.ConnectionString = "User Id=scott; Password=tiger; Data Source=oracle";
  con.Open();

  try
  {
    // Commandオブジェクト生成
    using (OracleCommand cmd = con.CreateCommand())
    {
      cmd.CommandText = "select column1, column2 from test where column1 = '101'";

      // クエリの実行
      using (OracleDataReader reader = cmd.ExecuteReader())
      {
        while (reader.Read())
        {
          Console.WriteLine(reader["column1"]);
          Console.WriteLine(reader["column2"]);
        }
      }
    }
  }
  finally
  {
    if (con != null)
    {
      con.Close();
    }
  }
}

(※).NET Framework version 2.0新機能

・関連記事
汎用的なコードでデータベースアクセス
汎用的なコードでデータベースアクセス(一部、データプロバイダ固有処理)
Oracle Data Provider for .NET (ODP.NET) でデータベースアクセス(パラメータ)

ブログランキングに参加してます!→

テーマ:プログラミング - ジャンル:コンピュータ - .NET開発の質問は:C#,VB.NETラウンジ

汎用的なコードでデータベースアクセス(一部、データプロバイダ固有処理)

汎用的なクラスを使用していても、データプロバイダ固有の処理を呼びたい場合もあります。
この場合は、固有の処理を呼ぶ箇所だけそのクラスにキャストしてやることで
そのデータプロバイダ固有の処理を呼ぶことができます。

using System.Configuration;
using System.Data.Common;
using Oracle.DataAccess.Client;
...

ConnectionStringSettings setting = System.Configuration.ConfigurationManager.ConnectionStrings["OracleTest2"];
DbProviderFactory factory = DbProviderFactories.GetFactory(setting.ProviderName);

using (DbConnection con = factory.CreateConnection())
{
  con.ConnectionString = setting.ConnectionString;
  con.Open();

  try
  {
    using (DbCommand cmd = con.CreateCommand())
    {
      // コマンドオブジェクトをOracleCommandにキャスト
      OracleCommand oracleCmd = (OracleCommand)cmd;
      // 名前指定パラメータを有効
      oracleCmd.BindByName = true;

      // アクセス処理
    }
  }
  finally
  {
    if (con != null)
    {
      con.Close();
    }
  }
}

(※).NET Framework version 2.0新機能

ブログランキングに参加してます!→

汎用的なコードでデータベースアクセス(パラメータ)

汎用的なコードで、動的なパラメータのあるデータベースアクセスを行うにはDbParameterクラスを使用します。
実行するクエリのパラメータ部にはプレイスホルダを指定しておきます。
このフォーマットは、汎用的なクラスであるDbParameterを使用しても以下のようにOracleとSQL Server
で切り替える必要があります。

Oracleの場合「:パラメータ名」(コロンを指定)
SQL Serverの場合「@パラメータ名」(アットマークを指定)

using System.Configuration;
using System.Data.Common;
...

ConnectionStringSettings setting = System.Configuration.ConfigurationManager.ConnectionStrings["OracleTest"];
DbProviderFactory factory = DbProviderFactories.GetFactory(setting.ProviderName);

using (DbConnection con = factory.CreateConnection())
{
  con.ConnectionString = setting.ConnectionString;
  con.Open();

  try
  {
    using (DbCommand cmd = con.CreateCommand())
    {
      // クエリ文字列(プレイスホルダ指定)
      cmd.CommandText = "select column1, column2 from test where column1 = :column1 and column2 = :column2";

      // パラメータの生成
      DbParameter para1 = cmd.CreateParameter();
      para1.ParameterName = "column1";
      para1.Value = "103";
      cmd.Parameters.Add(para1);

      DbParameter para2= cmd.CreateParameter();
      para2.ParameterName = "column2";
      para2.Value = "test";
      cmd.Parameters.Add(para2);

      using (DbDataReader reader = cmd.ExecuteReader())
      {
        while (reader.Read())
        {
          Console.WriteLine(reader["column1"]);
          Console.WriteLine(reader["column2"]);
        }
      }
    }
  }
  finally
  {
    if (con != null)
    {
      con.Close();
    }
  }
}

出力:
103
test


パラメータの型は、設定された値から推測されますが、明示的に指定する場合は、DbParameter.DbTypeを指定します。

(※).NET Framework version 2.0新機能

ブログランキングに参加してます!→

テーマ:プログラミング - ジャンル:コンピュータ - .NET開発の質問は:C#,VB.NETラウンジ

汎用的なコードでトランザクション処理

汎用的なコードで、トランザクション処理を行うにはDbTransactionクラスを使用します。
正常に終了した場合は、Commit()、例外発生時はRollback()メソッドを呼びます。

using System.Configuration;
using System.Data.Common;
using System.Data;
...

ConnectionStringSettings setting = System.Configuration.ConfigurationManager.ConnectionStrings["OracleTest"];
DbProviderFactory factory = DbProviderFactories.GetFactory(setting.ProviderName);

using (DbConnection con = factory.CreateConnection())
{
  con.ConnectionString = setting.ConnectionString;
  con.Open();

  using (DbTransaction tran = con.BeginTransaction(IsolationLevel.Serializable))
  {
    try
    {
      using (DbCommand cmd = con.CreateCommand())
      {
        // トランザクションオブジェクトのセット
        cmd.Transaction = tran;

        cmd.CommandText = "insert into test(column1,column2) values('103','test')";
        int rows = cmd.ExecuteNonQuery();
      }

      // コミット
      tran.Commit();
    }
    catch
    {
      // 例外が発生した場合はロールバック
      tran.Rollback();
    }
    finally
    {
      if (con != null)
      {
        con.Close();
      }
    }
  }
}

(※).NET Framework version 2.0新機能

ブログランキングに参加してます!→

テーマ:プログラミング - ジャンル:コンピュータ - .NET開発の質問は:C#,VB.NETラウンジ

汎用的なコードで接続型データベースアクセス(DML)

汎用的なコードで、接続型データベースアクセス(DML-追加,更新,削除)を行うにはDbCommand#ExecuteNonQuery()メソッドを使用します。
戻り値には、実行したクエリで影響を受けた行数が返ってきます。

using System.Configuration;
using System.Data.Common;
...

ConnectionStringSettings setting = System.Configuration.ConfigurationManager.ConnectionStrings["OracleTest"];
DbProviderFactory factory = DbProviderFactories.GetFactory(setting.ProviderName);

using (DbConnection con = factory.CreateConnection())
{
  con.ConnectionString = setting.ConnectionString;
  con.Open();

  try
  {
    // Commandオブジェクト生成
    using (DbCommand cmd = con.CreateCommand())
    {
      cmd.CommandText = "insert into test(column1,column2) values('103','test')";

      // クエリの実行
      int rows = cmd.ExecuteNonQuery();
    }
  }
  finally
  {
    if (con != null)
    {
      con.Close();
    }
  }
}

例文は、Insert文ですが、Update文、Delete文の場合も同様です。

(※).NET Framework version 2.0新機能

・関連記事
汎用的なコードで接続型データベースアクセス(データ検索)
汎用的なコードでデータベースアクセス

ブログランキングに参加してます!→

テーマ:プログラミング - ジャンル:コンピュータ - .NET開発の質問は:C#,VB.NETラウンジ

汎用的なコードで接続型データベースアクセス(データ検索)

汎用的なコードで、接続型データベースアクセス(データ検索)を行うにはDbDataReaderクラスを使用します。

using System.Configuration;
using System.Data.Common;
...

ConnectionStringSettings setting = System.Configuration.ConfigurationManager.ConnectionStrings["OracleTest"];
DbProviderFactory factory = DbProviderFactories.GetFactory(setting.ProviderName);

using (DbConnection con = factory.CreateConnection())
{
  con.ConnectionString = setting.ConnectionString;
  con.Open();

  try
  {
    // Commandオブジェクト生成
    using (DbCommand cmd = con.CreateCommand())
    {
      cmd.CommandText = "select column1, column2 from test where column1 = '101'";

      // クエリの実行
      using (DbDataReader reader = cmd.ExecuteReader())
      {
        while (reader.Read())
        {
          // カラム名
          Console.WriteLine(reader["column1"]);
          Console.WriteLine(reader["column2"]);
          // 0 から始まる序数
          Console.WriteLine(reader.GetString(0));
          Console.WriteLine(reader.GetString(1));
        }
      }
    }
  }
  finally
  {
    if (con != null)
    {
      con.Close();
    }
  }
}

出力:

DbDataReader#Read()メソッドでカーソルを進めて、カラム名を指定してインデクサでアクセスするか、
序数でカーソルのレコードのデータにアクセスします。
DbDataReaderには、各種の型用にメソッドが用意されていますが、(GetDecimal(),GetChar()等)
実装プロバイダによってはサポートされていない場合は、NotSupportedExceptionが発生するので
注意が必要です。

(※).NET Framework version 2.0新機能

・関連記事
汎用的なコードでデータベースアクセス

ブログランキングに参加してます!→

テーマ:プログラミング - ジャンル:コンピュータ - .NET開発の質問は:C#,VB.NETラウンジ

次のページ

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。