インタフェースベースでADO.NET

MySQLとConnector/NetのおかげでADO.NETで手軽に遊べるようになったので、色々弄ってます。普段、Oracle使っているといってもPro*C/C++で動的SQLなのでODBCやらADO.NETやらは、あまり詳しくなかったり。(^^;

ここんとこ、日記で挙げていたコードはMySQLベッタリだったので、MySQL依存部分をなくしてみることに。まずは、接続クラス名や接続文字列を構成ファイルに追い出します。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="ConnectionClass" 
      value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data" />
    <add key="ConnectionString" 
      value="Data Source=localhost;Database=mydb;User Id=user;Password=pass;" />
  </appSettings>
</configuration>

で、インタフェースに対して操作を行う。

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

class Program {
  static IDbConnection GetConnection() {
    // 接続クラス名
    string cls = ConfigurationSettings.AppSettings["ConnectionClass"];
    // 接続文字列
    string str = ConfigurationSettings.AppSettings["ConnectionString"];
    return Activator.CreateInstance(Type.GetType(cls), new object{str}) as IDbConnection;
  }

  static void Main(string args) {
    if (args.Length < 0)
      return;

    // 引数からSQLを取得
    string sql = args[0];
    IDbConnection conn = null;

    try {
      conn = GetConnection();
      IDbCommand cmd = conn.CreateCommand();
      cmd.CommandText = sql;

      conn.Open();
      IDataReader r = cmd.ExecuteReader();
      while (r.Read()) {
        Console.WriteLine(r[0]);
      }
      r.Close();
    }
    catch (Exception e) {
      Console.WriteLine(e.Message);
    }
    finally {
      if (conn != null) {
        conn.Close();
        conn = null;
      }
    }
  }
}

SQL構文の違いとかあるので、まんま他のデータベースへ移行ってわけにはいかないけど。