출처 : 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번이라는 포트(길)만 열어준 거기 때문에 그 길을 통해서 공유기로 들어가야 하거든요.



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



출처 : http://ccami.tistory.com/tag/iptime공유기설정

 

WOL이란? 

Wake On Lan의 약자로 랜 케이블을 통해 컴퓨터를 키는 방법이에요.


데스크탑에는 항상 LAN케이블이 꼽혀 있으니까 컴퓨터는 대기를 하게 되고, 

랜 케이블로 컴퓨터를 키라는 신호를 보내게 되면 컴퓨터가 켜지는 방식~!


요즘 나오는 컴퓨터는 왠만하면 메인보드에서 다 지원을 해주고요~


공유기를 사용한다는 전제 하에, 

그리고 IPTIME 공유기를 기준으로 작성됩니다.



시작하기전에, CMOS로 들어가 봅니다.

메인보드마다 CMOS모양은 다르기 때문에...

LAN관련된 메뉴로 가서, 랜이 항상 Enable되 있도록 설정을 해 주고,

전원 관련된 곳이 있으면, 절전 관련 항목은 꺼 주시는 것이 좋습니다.

(절전 관련 항목이 켜있으면, 랜이 대기상태가 되지를 않아서 랜을 통한 신호를 받지 못해요)



윈도우로 들어온 후,

제어판 - 하드웨어 및 소리 - 장치관리자 - 네트워크 어댑터 - 속성

까지 갑니다.






제 네트워크 카드(랜카드)는 메인보드에 내장 되어 있는 것으로

흔한 Realtek PCIe GBE Family Controller 이고요, 드라이버는 윈도우 설치될 시 자동으로 설치되었습니다.





위에 CMOS설정에서 말했던 것 처럼 절전 관련 항목은 모두 비활성화 해야 합니다.


- Energy Efficient Ethernet : 사용안함

- Gigabit 자동 비활성화 (절전) : 사용안함

- Wake on Magic Packet : 사용

- Wake on pattern match : 사용

- 웨이크 온 랜 종료 : 사용

- 절전형 이더넷 : 사용안함


으로 설정을 해줍니다.

그냥, 전원관련 부분은 전부 비활성화 해주고, 

WOL 관련 항목은 모두 사용으로 해준다 생각하시면 되겠습니다.



이제 공유기 설정을 해야 겠죠?


인터넷익스플로러 (크롬 등) 을 킵니다.

공유기 환경설정으로 들어갑니다.

(기본주소 : 192.168.0.1)


관리도구 로 들어갑니다.



메뉴를 보면

고급설정 - 특수기능 - WOL 기능으로 들어가면

'위에 현재 접속된 PC의 MAC 주소로 설정' 이라는 항목이 있어요.

자동으로 접속한 컴퓨터의 MAC 주소를 검색하여 추가를 해주는 아주 편리한 기능!

눌러 주시면 자동으로 뜨고, PC설명을 넣어줍니다.

추가하면 아래 목록에 추가가 되고요~



이제

컴퓨터를 끕니다.



같은 네트워크에 있는 다른 컴퓨터에 가서 공유기 환경설정 페이지로 접속해요.

무선이건, 유선이건 상관 없어요.

스마트폰으로 무선랜을 연결해서 접속해도 상관 없어요.

(기본주소 : 192.168.0.1)


같은 페이지로 가서 (고급설정 - 특수기능 - WOL 기능) 

아까 설정한 컴퓨터 체크박스에 체크를 하고, 위에 PC켜기 버튼을 클릭하면 

아까 설정한 컴퓨터가 켜지는 것을 볼 수 있을거에요~





주의할 점은 컴퓨터가 비 정상적으로 종료 되었을 시

(전원버튼을 눌러 강제로 종료 했거나 전원 코드를 뽑았다거나)

하면 WOL이 작동을 안하구요,

컴퓨터, 공유기는 항상 전원이 연결 되어 있어야 겠죠!?




그러나, 같은 네트워크 에서만 가능하다면 WOL이 의미가 없겠죠...?

WOL을 활용 하려면, 집 밖에서 스마트폰 혹은 인터넷이 연결된 외부의 컴퓨터에서

집에있는 내 컴퓨터를 켜서 원격 데스크톱을 이용해 내 컴퓨터에 접속하여

어디서나 내 컴퓨터를 사용할 수 있는 환경!!!

을 만들고자 하는게 목적입니다.


외부에서 접속을 하려면 DDNS라는 것을 설정해 주어야 하는데요,

역시 IPTIME에서는 지원을 해주고 있습니다.

DDNS에 관해서는 Part 3. 외부에서 WOL을 이용하여 컴퓨터를 키는 방법

에서 언급 하도록 하겠습니다~




 

+ Recent posts