ADO

출처 : http://q.hatena.ne.jp/1259456311

 

 

ADO と ADO.NET による Excel ファイルを読み込むサンプルを用意してみました。

Excel ファイルは以下の形式を想定しています。

ブック名:[book1.xls] / シート名:[Sheet1]

A B
1 key value
2 項目1 値1
3 項目2 値2
4 項目3 値3

ADO も ADO.NET も「Jet OLE DB プロバイダ」と「データベースの種類」を接続文字列にて指定することで、Excel ファイルにアクセスすることが可能です。

<接続文字列の例>
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Book1.xls;Extended Properties="Excel 8.0;HDR=YES;" 
<ADO 概要>
[アプリケーション]
   |
  [ADO]         … ADODB.Connection
   |
  [OLE DB]
   |
[OLE DB Provider] … Microsoft.Jet.OLEDB.4.0
   |
 [ISAM ドライバ] … Extended Properties="Excel 8.0;HDR=YES;"
   |
 [Excel ファイル] … Data Source=C:\book1.xls
<ADO.NET 概要>
[.NET アプリケーション]
   |
  [ADO.NET]
   |
[.NET Framework Data Provider for OLE DB] … OleDbConnection
   |
  [OLE DB]
   |
[OLE DB Provider] … Provider=Microsoft.Jet.OLEDB.4.0
   |
 [ISAM ドライバ] … Extended Properties="Excel 8.0;HDR=YES;"
   |
 [Excel ファイル] … Data Source=C:\book1.xls
<データベースの種類>
Excel 5.0 … Excel 5.0 および 7.0 (95) 形式
Excel 8.0 … Excel 8.0 (97), 9.0(2000), 10.0(2002) 形式

まず、はじめは WSH(VBScript)+ ADO のサンプルです。

' File : AdoExcelTest.vbs
' Usage : CScript //Nologo AdoExcelTest.vbs [Enter]
Option Explicit

Call Main()

Sub Main()
    Dim cn
    Set cn = CreateObject("ADODB.Connection")

    Dim strFileName
    Dim strCon
    strFileName = "C:\home\edu\hatena\gontakun_55\1259456311\book1.xls"
    strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFileName & ";Extended Properties=""Excel 8.0;HDR=YES"""
    cn.Open strCon

    Dim rs
    Set rs = cn.Execute("SELECT * FROM [Sheet1$]")

    While Not rs.BOF And Not rs.EOF
        WScript.Echo "key = [" & rs(0) & "], value = [" & rs(1) & "]"
        rs.MoveNext
    Wend

    rs.Close
    cn.Close
End Sub
<実行結果>
key = [項目1], value = [値1]
key = [項目2], value = [値2]
key = [項目3], value = [値3]

次に、VC++2008(C++) + ADO のサンプルです。

// File : AdoExcelTest.cpp
// Compile : cl AdoExcelTest.cpp [Enter]
// Usage : AdoExcelTest.exe [Enter]
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <comdef.h>

int main( int argc, char* argv[] )
{
    CoInitialize(NULL);

    _ConnectionPtr cn("ADODB.Connection");

    _bstr_t strFileName;
    _bstr_t strCon;
    strFileName = "C:\\home\\edu\\hatena\\gontakun_55\\1259456311\\book1.xls";
    strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strFileName + ";Extended Properties=\"Excel 8.0;HDR=YES\"";
    
    cn->Open( strCon, "", "", adConnectUnspecified );

    _RecordsetPtr rs("ADODB.Recordset");
    rs = cn->Execute( "SELECT * FROM [Sheet1$]", NULL, 0 );
    
    while ( !rs->GetBOF() && !rs->GetEndOfFile() )
    {
        printf( "key = [%s], value = [%s]\n", 
            (LPCTSTR)(_bstr_t)rs->Fields->Item[0L]->Value,
            (LPCTSTR)(_bstr_t)rs->Fields->Item[1L]->Value );
        rs->MoveNext();
    }
    rs->Close();
    cn->Close();
    
    CoUninitialize();

    return 0;
}

実行結果は1番目と同じです。


そして、最後に、VC++2008(C++/CLI) + ADO.NET のサンプルです。

// File : AdoExcelDotNet.cpp
// Compile : cl AdoExcelDotNet.cpp /clr [Enter]
// Usage : AdoExcelDotNet.exe [Enter]

#using <mscorlib.dll>
#using <System.dll>
#using <System.Data.dll>

using namespace System;
using namespace System::Data;
using namespace System::Data::OleDb;

int main( array<System::String ^> ^args )
{
    OleDbConnection^ con = gcnew OleDbConnection();

    String^ strFileName = gcnew String("C:\\home\\edu\\hatena\\gontakun_55\\1259456311\\book1.xls");
    String^ strCon = gcnew String("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strFileName + ";Extended Properties=\"Excel 8.0;HDR=YES;\"");
    con->ConnectionString = strCon;
    con->Open();

    OleDbCommand^ cmd = gcnew OleDbCommand("SELECT * FROM [Sheet1$]", con );
    OleDbDataReader^ reader = cmd->ExecuteReader();

    while ( reader->Read() )
    {
        Console::WriteLine("key = [{0}], value = [{1}]", reader["key"], reader["value"] );
    }

    reader->Close();
    con->Close();

    return 0;
}

これも実行結果は1番目と同じです。


なお、サンプルコードを簡略化する為にエラー処理(try ~ catch 等)は、省略してあります。

実際にコーディングする場合は、必要に応じてエラー処理を追加してください。


また、今回の ADO / ADO.NET での使用例は、Excel のデータが「表形式」(テーブル形式)であることが前提です。

データが非定型の場合は、Excel オートメーション(Excel.exe をリモート操作する方法)を使用する必要があります。

Add Star
id:gontakun_55

詳しい説明付きで大変参考になりました。

動作出来るようになり、大変感謝致します。

また、複数のサンプルまでご用意頂き、大変ありがとうございます。

今後の参考にさせて頂きます。

ありがとうございました。

 

* WINVER
Using the Windows Headers
http://msdn.microsoft.com/en-us/library/aa383745(VS.85).aspx
_WIN32_WINNT ,WINVER
Windows 8    = 0x0602 (_WIN32_WINNT_WIN8 )
Windows 7    = 0x0601 (_WIN32_WINNT_WIN7 )
Windows Server 2008 = 0x0600
Windows Vista        = 0x0600
Windows Server 2003 with SP1, Windows XP with SP2    = 0x0502
Windows Server 2003, Windows XP    = 0x0501
Windows 2000    = 0x0500



* _MSC_VER
Visual Studio Version ( msc_ver )
https://en.wikipedia.org/wiki/Microsoft_Visual_Studio#Version_history
VC 4.0 (1995) = 1000
VC 5.0 (1997) = 1100
VC 6.0 (1998) = 1200  <----
VC 7.0 (2002) = 1300
VC 7.1 (2003) = 1310
VC 8.0 (2005) = 1400
VC 9.0 (2008) = 1500
VC 10.0 (2010) = 1600  - msvcr100.dll
VC 11.0 (2012) = 1700

아쉽게도 VisualStudio2012버전 부터는 Macro IDE기능을 사용할 수 없게 됐다.

개인적으로 Doxygen용 자동주석 매크로기능을 위해 활용하고 있었는데

VS2012부터 보이지 않아 어디에 숨겼는지 한참을 찾았다.

결국 구글링을 해보니 MS에서 의도적으로 뺀거라고 한다. 전체 VS유저중 사용률이 1%미만 이라나.

Macro외에도 tool 전체의 Performance향상을 위해 몇몇 IDE기능을 줄였다고 한다.

http://social.msdn.microsoft.com/Forums/vstudio/en-US/d8410838-085b-4647-8c42-e31b669c9f11/macros-in-visual-studio-11-developer-preview

 

암튼 자동 주석같은 매크로 기능은 플러그인 프로젝트를 통해 계속 이용할 수 있다. :)

 

1. Visual Studio 추가기능 프로젝트 생성

적당한 이름으로 생성해 준다.

2. 확장 기능을 개발할 언어를 선택해준다. (난 C# 으로)

3. 메뉴에 확장기능 항목이 추가되도록 한다. (우리가 만든 확장기능은 도구 메뉴에서 확인가능하다.)

이후에는 계속 다음을 눌러 프로젝트가 생성되도록 한다.

 

4. Connect.cs파일에서 Exec함수를 찾고 아래 내용을 추가한다.

Exec라는 함수이름 대로 우리가 개발한 확장기능을 나중에 VS에서 사용할때 호출되는 함수다. (사진 클릭해서 원본으로 보기)

 

5. 컴파일이 성공하면 종료 후 다시 실행한다.

적당한 프로젝트 하나를 연 후 소스코드의 적당한 위치에 커서를 위치 시키고 "도구" 메뉴에 우리가 추가한 플러그인을 실행한다.

Doxygen 주석이 추가된걸 확인할 수 있다.

 

6. 매번 메뉴를 클릭하는건 귀찮으니 우리가 개발한 확장기능에 단축키를 할당할 수 도 있다.

도구 - 옵션 - 키보드 선택 후 comment(프로젝트 이름)로 검색하면 개발한 확장기능이 검색된다.

선택 후 "바로 가기 키 누르기"에서 적당한 단측키를 할당해준다.(Ctrl + `은 개인적으로 사용하지 않는 키라서 이걸로 정했음)

확인을 누르고 닫은 후 앞으로는 메뉴 대신 위에서 할당한 단축키를 사용하면 된다.

 

7. 확장기능 배포

내가 만든 확장기능은 dll형태로 일반 프로젝트와 동일하게 프로젝트 폴더(Debug나 Release)에 생성된다.

VS에 설치되는 폴더는 C:\Users\jung\Documents\Visual Studio 2012\Addins 이며 FunctionComment - For Testing.AddIn

이라는 파일명으로 위자드가 자동 생성해준 것을 볼수 있다.

파일을 메모장으로 열어보면 <Assembly> 항목에 우리가 만든 dll위치가 들어가 있는것을 볼수 있는데

원하는 위치에 dll을 설치하고 이 경로만 바꿔주면 된다.

 

 

 

 추가한 소스

public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
  {
   handled = false;
   if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
   {
    if(commandName == "Doxgen2012.Connect.Doxgen2012")
    {
                    EnvDTE.TextSelection textSelection = (EnvDTE.TextSelection)_applicationObject.ActiveWindow.Selection;
                    textSelection.Insert("//-----------------------------------------------------------------------------------//");
                    textSelection.NewLine();
                    textSelection.Insert("//");
                    textSelection.NewLine();
                    textSelection.Insert("// @brief     :  ");
                    textSelection.NewLine();
                    textSelection.Insert("// @param     :  ");
                    textSelection.NewLine();
                    textSelection.Insert("// @return    :  ");
                    textSelection.NewLine();
                    textSelection.Insert("// @author    :  ");
                    textSelection.Insert(System.Environment.UserName);
                    textSelection.NewLine();
                    textSelection.Insert("// @date      :  ");
                    textSelection.Insert(System.DateTime.Now.ToLongDateString());
                    textSelection.Insert("  ");
                    textSelection.Insert(System.DateTime.Now.ToLongTimeString());
                    textSelection.NewLine();
                    textSelection.Insert("//");
                    textSelection.NewLine();
                    textSelection.Insert("//-----------------------------------------------------------------------------------//");

     handled = true;
     return;
    }
   }
  }
  private DTE2 _applicationObject;
  private AddIn _addInInstance;
 } 

 

 

 

 참고 : http://www.dzone.com/articles/missing-macros-visual-studio

 

출처 : http://ccami.tistory.com/19

 

DDNS 설정하는 방법이에요.

ipTIME 공유기를 기준으로 설명하는 것이니, 참고하세요~



ipTIME에서는 기본적으로 DDNS를 제공하고 있어요.

DDNS란? 1) 유동IP를 사용하는 컴퓨터들의 경우에도 쉽게 DNS를 사용 할 수 있도록 해주는 것이에요.

2) IP를 외우기 힘드니까 쉽게 주소로 해서 외우기 쉽게 하려는 목적이에요.


쉽게말해, 공유기도 하나의 컴퓨터인데 외부에서 공유기를 찾아오는 주소를 설정해 주는 거에요.


예를들어, 네이버 홈페이지를 들어갈때 www.naver.com 으로 주소창에 치면 이동을 하는데

네이버 홈페이지의 IP인 220.95.233.171 를 주소창에 쳐도 네이버에 접속이 가능하게 되어 있는데 이게 DNS의 역할이에요. 저 IP를 일일히 외워서 사용하기엔 외울 숫자가 너무 많잖아요?


이와같이, 공유기에도 IP가 들어가는데 그 IP에 주소를 할당해서 외부에서 접속하기 쉽게 해주기 위한 목적이에요.

네이버같이 큰 업체는 고정 IP를 사용하지만, 일반 가정집에서는 유동 IP를 사용하기 때문에

자꾸 바뀌는 IP를 위해 DDNS (Dynamic DNS)를 설정해 주는 거구요.






외부에서 공유기에 접속을 하려면 일단 포트를 열어 줘야 하는데,


먼저 공유기 설정창 (기본설정 : 192.168.0.1)으로 가서 환경설정을 열어요.



고급설정 - 보안기능 - 공유기 접속관리로 가서 원격 관리 포트 사용에서 포트를 설정해 주어요.

저 숫자는 아무 숫자나 상관이 없고 여기선 1233으로 하도록 하겠습니다.

간혹 인터넷 업체에서 특정 범위의 포트를 막아놓는 경우도 있으므로 주의해 주세요.





고급설정 - 특수기능 - DDNS 설정 으로 가서 이제 등록을 합니다.

설명에 나와있듯이 호스트이름은 접속할 주소를 설정하는 곳이에요.

설정할 주소.iptime.org 이런 식으로 설정 해줘야 하구요.

한번 설정하면 바꾸려면 ipTIME에다가 문의 해야하니까 신중하게 결정하도록 해요.

사용자 계정(이메일 주소)과 암호는 본인이 설정해 주세요.




추가를 하면 등록중이라고 나오다가 곧 정상 등록이 되었다고 나와요.

혹시 다른 사람과 주소가 중복이 된다 하면 삭제하고 다시 등록해 보세요.


한 주소당 메일주소는 하나씩 되더라구요.

나중에 주소를 바꾸고 싶을때는 ipTIME 고객센터에 전화해서 메일주소를 알려주고 주소를 삭제해달라 해야해요. 안그러면 새 주소가 등록이 안되요.



이렇게 하면 DDNS 등록은 끝 ! 쉽죠...?


 





이제 접속을 해볼 차례에요.


자신의 컴퓨터에서 공유기 환경설정에 들어갈 때 192.168.0.1로 해서 들어간 것을

외부에서도 그대로 들어갈 수 있는데요.


내부 네트워크에서는 설정한 주소.iptime.org만 해도 접속이 가능한데

외부 네트워크에서는 포트번호도 같이 쳐줘야 해요.

설정한 주소.iptime.org:1233 이런식으로요.


많은 포트(길) 중에 1233번이라는 포트(길)만 열어준 거기 때문에 그 길을 통해서 공유기로 들어가야 하거든요.



이제 아무데서나 인터넷만 연결이 되 있으면 집에있는 공유기에 접속을 할 수 있어요 !



+ Recent posts