ODBC、OLEDB、ADO

歴史

ODBC → OLEDB → ADO
という進化

新しい技術は過去の技術を内包している
内部的には古い技術を用いている
odbc_oledb_ado

ODBC

Open Database Connectivity
DB接続用コンポーネント
・ SQLServer
・ Oracle
等のDBMSだけでなく、
・ MicrosoftACCESS
・ CSV
等へも共通の記述で接続できる。
各リソースにおけるODBCドライバは各ベンダーが開発したものを公開している。
データベース等をインストールすると自動でODBCドライバーがインストールされる場合も多い
Java系:JDBC
MS系:ODBC

ODBCデータソースアドミニストレータ

Windowsの場合、ODBCドライバーをデータソースとして登録し、プログラムから参照できる
ODBCデータソースアドミニストレータは32bit/64bitがあり、
それぞれ32bit/64bitのODBCドライバーを登録する。
なおODBCドライバーを利用するアプリケーションの32bit/64bitに合わせたドライバー及びデータソース登録が必要

odbc1
「システムDSN」タブで登録を行う。
odbc2

接続文字列

データソース登録時(ODBCドライバーは必要)
Dsn=(登録名);
UID=myuser;
PWD=mypass;
データソース未登録時(ODBCドライバーは必要)
Driver={~};
UID=myuser;
PWD=mypass;

OLEDB

DB接続用コンポーネント
COM
ODBCの後続技術
ODBC同様、各リソースにおけるソフトウェアは各ベンダーが開発したものを公開している。

OLEDBではプロバイダと呼ばれるサービスとしてデータを仲介する
DBMS
↑↓
プロパイダ
↑↓
クライアント
OLEDB利用時の接続文字列
Provider=~;
Data Source=MyServer;
User ID=myuser;
Password=mypass

ADO

ActiveX Data Objects
データベースアクセスの為のソフトウェアコンポーネント
「OLE DB」をActiveXコントロールの形で使用できる
VB、VBA、VBScript、他言語から共通の方法でDBへアクセスできる

VB6とVSSを連動させる方法

VB6とVSSのインストールを行ったアカウントが異なる場合、
VB6からチェックアウト等の処理が行えないという現象が発生する。
以下、対処方法。

「VisualBasic」を終了
コマンドプロンプトにて「REGSVR32.exe」を実行。
↓ (1)~(3)のDLLをレジストリに登録する。
(1)VBSCC.dll
(場所: ~\Microsoft Visual Studio\VB98 )
(2)SSSCC.dll
(場所: ~\Microsoft Visual \Common\VSS\Win32 またはVSSインストールフォルダ等)
(3)SSAPI.dll
(場所: ~\Microsoft Visual Studio\Common\VSS\Win32 またはVSSインストールフォルダ等)
実行例 REGSVR32.EXE C:\Microsoft Visual Studio\VB98\VBSCC.DLL

C:\WINDOWS\VBADDIN.ini
の内容を書き換え(または追加)
VBSCC=0

VBSCC=3

VB6でマウスホイールによるスクロールを有効にする方法

Microsoft公式サイトからVB6MouseWheel.EXE パッケージをダウンロード

(1)VB6MouseWheel.EXE を適当な場所に解凍(例 C:\VB6MouseWheel\)

(2)コマンドプロンプトにてレジストリ登録
regsvr32 C:\VB6MouseWheel\VB6IDEMouseWheelAddin.dll

(3)VB6設定
・VB6.0を起動。
・[アドイン] →[アドイン マネージャ] →「MouseWheel Fix」を選択
・[ロード/アンロード]、[起動時にロード]にチェック
・[OK] で完了

縦横比を維持したままウィンドウサイズを変更する方法

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

// ウィンドウサイズ変更イベント
protected override void WndProc(ref System.Windows.Forms.Message m)
{
  this.AspectRatioSizeWndProc(ref m, 4 / 3, true);
  base.WndProc(ref m);
}

private struct WmRect
{
  public int Left;
  public int Top;
  public int Right;
  public int Bottom;
  
  public static implicit operator Rectangle(WmRect r)
  {
    return new Rectangle(r.Left, r.Top, r.Right – r.Left, r.Bottom – r.Top);
  }
  
  public static implicit operator WmRect(Rectangle r)
  {
    return new WmRect
    {
      Top = r.Top,
      Bottom = r.Bottom,
      Left = r.Left,
      Right = r.Right
    };
  }
  
  public override string ToString()
  {
    return string.Format(
      ”Left {0}, Top {1}, Right {2}, Bottom {3}”,
      this.Left.ToString(),
      this.Top.ToString(),
      this.Right.ToString(),
      this.Bottom.ToString());
  }
}

public enum WmSz
{
  Left = 1,
  Right = 2,
  Top = 3,
  Bottom = 6,
  
  TopLeft = Top + Left,
  TopRight = Top + Right,
  BottomLeft = Bottom + Left,
  BottomRight = Bottom + Right,
}

///

/// ウィンドウ・プロシージャ内で呼び出すことで、
/// マウスでウィンドウの縁をドラッグしてフォームのサイズを変更したときに、
/// ウィンドウサイズが指定したアスペクト比を維持するようになる。
///

/// サイズが変更されるウィンドウ /// ウィンドウ・プロシージャに渡されたWindowsメッセージ /// ウィンドウサイズのアスペクト比(幅/高さ) /// クライアント領域のアスペクト比を一定に保つようにする場合はtrue。
/// falseを指定すると、ウィンドウの境界線やタイトルバーも含めたウィンドウ全体のサイズのアスペクト比を保つようにする。>
public static void AspectRatioSizeWndProc(this Form form, ref Message m, float aspect, bool clientSize)
{
  const int WM_SIZING = 0x214;
  
  if (m.Msg == WM_SIZING)
  {
    if (aspect > 0f)
    {
      //画面上での、ウィンドウの上下左右の座標
      WmRect rc = (WmRect)Marshal.PtrToStructure(m.LParam, typeof(WmRect));
      WmSz res = (WmSz)m.WParam.ToInt32();
      
      switch (res)
      {
        case WmSz.Left:
        case WmSz.Right:
          {
            int w = rc.Right – rc.Left;
            int h;
            if (clientSize)
            {
              Size borders = Size.Subtract(form.Size, form.ClientSize);
              
              w -= borders.Width;
              h = (int)(w / aspect) + borders.Height;
            }
            else
            {
              h = (int)(w / aspect);
            }
            
            rc.Bottom = rc.Top + h;
            Marshal.StructureToPtr(rc, m.LParam, true);
            
            break;
          }
        case WmSz.Top:
        case WmSz.Bottom:
          {
            int h = rc.Bottom – rc.Top;
            int w;
            
            if (clientSize)
            {
              Size borders = Size.Subtract(form.Size, form.ClientSize);
              h -= borders.Height;
              w = (int)(h * aspect) + borders.Width;
            }
            else
            {
              w = (int)(h * aspect);
            }
            rc.Right = rc.Left + w;
            break;
          }
        case WmSz.TopLeft:
        case WmSz.TopRight:
          {
            int recW = rc.Right – rc.Left;
            int recH = rc.Bottom – rc.Top;
            int w, h;
            
            if (clientSize)
            {
              Size borders = Size.Subtract(form.Size, form.ClientSize);
              recW -= borders.Width;
              recH -= borders.Height;
              
              w = (int)(recH * aspect) + borders.Width;
              h = (int)(recW / aspect) + borders.Height;
            }
            else
            {
              w = (int)(recH * aspect);
              h = (int)(recW / aspect);
            }
            
            int dh = recW * recW + h * h;
            int dw = recH * recH + w * w;
            
            if (dh > dw)
            {
              rc.Top = rc.Bottom – h;
            }
            else
            {
              if (res == WmSz.TopLeft)
              {
                rc.Left = rc.Right – w;
              }
              else if (res == WmSz.TopRight)
              {
                rc.Right = rc.Left + w;
              }
            }
            
            break;
          }
        
        case WmSz.BottomLeft:
        case WmSz.BottomRight:
          {
            int recW = rc.Right – rc.Left;
            int recH = rc.Bottom – rc.Top;
            
            int w, h;
            
            if (clientSize)
            {
              Size borders = Size.Subtract(form.Size, form.ClientSize);
              recW -= borders.Width;
              recH -= borders.Height;
              
              w = (int)(recH * aspect) + borders.Width;
              h = (int)(recW / aspect) + borders.Height;
            }
            else
            {
              w = (int)(recH * aspect);
              h = (int)(recW / aspect);
            }
            
            int dh = recW * recW + h * h;
            int dw = recH * recH + w * w;
            
            if (dh > dw)
            {
              rc.Bottom = rc.Top + h;
            }
            else
            {
              if (res == WmSz.BottomLeft)
              {
                rc.Left = rc.Right – w;
              }
              else if (res == WmSz.BottomRight)
              {
                rc.Right = rc.Left + w;
              }
            }
            break;
          }
        default:
          break;
      }
      Marshal.StructureToPtr(rc, m.LParam, true);
    }
  }
}

.NETで作成したDLLをVB6から呼び出す方法

用語解説

COMオブジェクト
COMコンポーネント=ActiveX
アセンブリ
.NetFrameworkで作成されたオブジェクト
GUID
GlobalUniqueIdentifier
世界中で一意な識別子。
MACアドレス等。
単にGUIDと呼ぶ場合は、WindowsにおけるオブジェクトのクラスIDを指す。

コーディング(.Net側)

DLLとしてコンパイル(ビルド)する。⇒test.dll
using System.Runtime.InteropServices;
namespace nsFromVB6
{
  [ComVisible(true)]
  public interface INmcTagger
  {
    string ReturnMessage();
  }
  [ClassInterface(ClassInterfaceType.None)]
  public class clsFromVB6 : INmcTagger
  {
    public string ReturnMessage()
    {
      return @"VB6からの呼びだし成功";
    }
  }
}

.Net側設定

(1) [プロジェクト]-[XXX のプロパティ]-[アプリケーション]タブの[アセンブリ情報]
アセンブリを COM 参照可能にする」にチェックを入れておく
(2) ビルドにてプラットフォームのターゲットを「x86」とする。
(3) ビルドにて「COM相互運用機能の登録」にチェックをつける。
(4) ビルドにて署名を作成する

COM登録

RegAsm.exeを実行
※COMとして利用できる様にレジストリに登録する
コマンドプロンプトにて.NetFrameworkのインストールフォルダのRegAsm.exeを実行
(例) cd C:\Windows\Microsoft.NET\Framework\v4.0.30319
regasm test.dll /tlb /codebase

※/codebaseを行う為には署名を作成しておくことが必要

VB6からの参照設定

VB6から利用する為にはタイプライブラリ(クラスの型情報ファイル)が必要
※署名を作成している場合は自動で作成されるので不要
コマンドプロンプトにて
tlbexp test.dll
例:C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\tlbexp.exe
※test.tlbが作成される
設定後、VB6の「参照設定」からtest.tlb を読み込む。

コーディング(VB6)

Private Sub Form_Load()
  Call CallDotNet
End Sub
Private Sub CallDotNet()
  On Error GoTo Err_Trap
  
  Dim obj As clsFromVB6
  Set obj = New clsFromVB6
  Call MsgBox( obj.ReturnMessage )
  
  Exit Sub
Err_Trap:
  MsgBox (Err.Description)
End Sub