C# Excel 연결해 DB처럼 쓰기

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data;
using System.Data.OleDb;


namespace ExcelDB
{
    public partial class Form1 : Form
    {
        string fileName;
        public Form1()
        {
            InitializeComponent();
            fileName = "data.xls";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source ="
            + fileName +  "; Extended Properties = Excel 8.0;";
            OleDbConnection oleCon = new OleDbConnection(ConnectionString);

            oleCon.Open();
            string qry = "SELECT * FROM [책목록$]";
            OleDbDataAdapter oleOda = new OleDbDataAdapter(qry, oleCon);

            DataTable exDataTable = new DataTable();
            oleOda.Fill(exDataTable);
            oleCon.Close();
            dataGridView1.DataSource = exDataTable;
        }
    }
}

-----------------------------
excel
------------

도서명저자가격출판사
차마시는여자조은아15000네시간
우리나라 조경수 이야기이광만25000이비락
건축의 형태공간 규범FRANCIS D.K24000국제
마음의 소리조석10000코리아하우스
책목록시트에 있음..
버튼 클릭하면 위 내용이 데이터그리드뷰에 보임.

by 지나가는행인1 | 2011/05/16 15:30 | 프로그래밍 | 트랙백 | 덧글(3)

c# 엑셀열기

using System.Data.OleDb;
추가
dataSet,GridView 추가

OpenFileDialog openFileDlg = null;
            OleDbConnection conn = null;
            OleDbCommand cmd = null;
            OleDbDataAdapter dapt = null;
            DataTable worksheets = null;

            string connectionString = null;
            string commandString = null;

            connectionString = String.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0;",fileName);
            conn = new OleDbConnection(connectionString);
            conn.Open();

            worksheets = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
            commandString = String.Format("SELECT * FROM [{0}]", worksheets.Rows[0]["TABLE_NAME"]);
            cmd = new OleDbCommand(commandString, conn);
            dapt = new OleDbDataAdapter(cmd);

            dapt.Fill(dataSet1);
            conn.Close();
            dataGridView1.DataSource = dataSet1.Tables[0];

by 지나가는행인1 | 2011/04/29 09:26 | 프로그래밍 | 트랙백

유저 메시지

유저 메시지 추가방법

(만든 다이얼로그 어플리케이션의 CTestDlg라고 가정한다.)

CtestDlg.h

#progma once 밑부분에 다음을 추가한다

--------------------------------------------------

#define MY_MESSAGE (WM_USER+1)

l  다른 메시지도 등록할려면 MY_MESSAGE +1 부분을 변경한다.

( MY_MESSAGE2(USER+2)

Public : 부분에 메시지가 호출될 시 불릴 함수의 원형을 만든다

LRESULT afx_msg OnMyMessageHandler(WPARAM wParam,LPARAM lParam);

*추후 추가시 함수이름만 변경한다. 반환값이나 인자는 변경하지 않는다

 

CtestDlg.cpp에서

BEGIN_MESSAGE_MAP END_MESSAGE_MAP()사이에 다음과 같이 추가한다.

-----------------------------------------------------------

ON_MESSAGE(MY_MESSAGE,&Ctest1Dlg::OnMyMessageHandler)

l  앞에서 선언한 define과 함수의 이름이 들어가야 한다.

함수를 구현한다

LRESULT Ctest1Dlg::OnMyMessageHandler(WPARAM wParam,LPARAM lParam)

{

구현내용.

        return 0;

}

 

메시지 호출은

PostMessage(MY_MESSAGE);

이런식으로 하면된다.

by 지나가는행인1 | 2011/04/27 10:49 | 프로그래밍 | 트랙백

server client network

--sever
// socket_server.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//

#include "stdafx.h"
#include <stdio.h>
#include <winsock2.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#pragma comment(lib, "ws2_32.lib")

#define PORT 900

char buffer[9] ;
void makeStr(char* p);
int _tmain(int argc, _TCHAR* argv[])
{
 int c_socket, s_socket;  
 SOCKADDR_IN saddr, caddr;
 int len, n;
 
 //윈속 초기화부
 WSADATA wsa;
 if(WSAStartup(MAKEWORD(2,2),&wsa) != 0)
    {
  return -1;
 }
  
 //소켓 생성부분
 s_socket = socket(PF_INET, SOCK_STREAM, 0);
 
 //구조체 초기화 및 연결 요청을 수신할 주소 설정
 memset(&saddr, 0, sizeof(saddr)); 
 saddr.sin_addr.s_addr = htonl(INADDR_ANY) /- 모든 연결 요청에 대해 서버 응용 프로그램에서 처리한다는 의미 *-;
 saddr.sin_family = AF_INET;
 saddr.sin_port = htons(PORT);
 
 

 //소켓을 포트에 연결하기
 if(bind(s_socket, (struct sockaddr*)&saddr, sizeof(saddr))==1)
 {
  printf("Can not Bind\n");
  return -1;
 }

 //커널에게 개통을 요청
 if(listen(s_socket, 5) == -1)
 {
  printf("listen Fail\n");
  return -1;
 }
 
 while(1)
 {
  len = sizeof(caddr);
  c_socket = accept(s_socket, (struct sockaddr*) &caddr, &len); /- 연결 요청 수신부분 *-

  printf("Connected Client\n");
  while(1)
  {  
   strcpy(buffer,""); 
   makeStr(buffer);
   n= strlen(buffer);
   printf("send %s \n",buffer);
   send(c_socket, buffer, n, 0);  
   Sleep(1000);
  }
 }

 closesocket(s_socket);
 return 0;
}


void makeStr(char* p)
{
 int code;
 int start;
 char data[9];
 
 srand(time(NULL));
    code = rand()%2;
 start = rand()%5;
 switch(code)
 {
 case 0:
  strcpy(data,"H1BF");
  break;
 case 1:
  strcpy(data,"H2BF");
  break;
 }
 switch(start)
 {
 case 0:
  strcat(data,"1111");
  break;
 case 1:
  strcat(data,"1112");
  break;
 case 2:
  strcat(data,"1113");
  break;
 case 3:
  strcat(data,"1114");
  break;
 case 4:
  strcat(data,"1115");
  break;
 case 5:
  strcat(data,"1116");
  break;
 }
 //data[9]=NULL;
 strcpy(p,data);

}

-----------------------------
--client-------------

// socket_client.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//

#include "stdafx.h"
#include <stdio.h>
#include <winsock2.h>
#include <string.h>

#pragma comment(lib, "ws2_32.lib")

#define PORT 900
#define IPADDR "127.0.0.1"

char rcvBuffer[BUFSIZ];

int _tmain(int argc, _TCHAR* argv[])
{
 int c_socket;
 SOCKADDR_IN caddr;
 int len, n;
 
 //윈속 초기화부
 WSADATA wsa;
 if(WSAStartup(MAKEWORD(2,2),&wsa) != 0)
    {
  return -1;
 }
  
 //소켓 생성부분
 c_socket = socket(PF_INET, SOCK_STREAM, 0);
 
 //구조체 초기화 및 연결 요청을 수신할 주소 설정
 memset(&caddr, 0, sizeof(caddr)); 
 caddr.sin_addr.s_addr = inet_addr(IPADDR) /- inet_addr(IP주소) *-;
 caddr.sin_family = AF_INET;
 caddr.sin_port = htons(PORT);
 
 if(connect(c_socket, (struct sockaddr *)&caddr, sizeof(caddr))==-1)
 {
  printf("Can not connect\n");
  closesocket(c_socket);
  return -1;
 }
while(1)
{
 if((n = recv(c_socket, rcvBuffer, sizeof(rcvBuffer), 0)) < 0)
 {
  return -1;
 }
if(strlen(rcvBuffer)!=0)
{
 rcvBuffer[n] = '\0';
 printf("received Data : %s\n", rcvBuffer);
 }
}
 closesocket(c_socket);
 
 return 0;
}
------------------------

by 지나가는행인1 | 2011/04/11 10:59 | 프로그래밍 | 트랙백 | 덧글(1)

전투라이브러리

압축된 파일을 폴더에 풀고, hBtBattle.txt 파일을 엽니다.

전투를 불러오고 싶은 스크립트를 열고 hBtBattle.txt파일의 내용을 복사해옵니다

(//초기화 세팅부터~~ loadsnr hBtBattleStart.txt까지 복사해 붙여넣습니다)

세팅을 하고 싶은 값을 //여기부터 ~//여기사이에 기본데이타값을 세팅하세요 부분에 설정해 넣습니다.)

ex) set hBtPName = 무적철가방2

set hBtPATK = 200

* 각 사용되는 변수는 3장 기본설정을 참조해 주십시오

* 변수값 확인방법

변수이름에는 대체적으로 다음과 같은 패턴이 있습니다.

hBt - 이 라이브러리에 공통으로 쓰이는 변수에 붙은 명칭

P - 플레이어 관련 변수

E - 적 관련 변수

ATK - 공격력관련변수

Name - 이름 관련 변수

이런 패턴으로 변수명이 조합되어 있습니다

ex) 적의 이름 = hBtEName

플레이어의 속도 = hBtPSPD

*체력과 마법력은 3자리를 넘게 되면 글자 배치 때문에 화면이 이상해보일수도 있습니다만

작동에는 지장이 없습니다. 3자리를 넘게 하고 싶다면

라이브러리를 수정하셔서 쓰셔야 합니다.




win.txt 와 lose.txt에 전투가 끝나고 불릴 스크립트를 넣어서 처리 하십시오

* 이 전투 라이브러리에는 순수하게 전투에 관한 것만 처리하였습니다.

경험치를 사용하고 싶으시면 전투 시작 전에 hBtEXP 변수에 값을 정해놓고

win.txt파일을 불러올 때 그 값을 더하는 방식으로 처리하시기 바랍니다.




* 전투를 다시 하고 싶을 때는 hBtReset.txt를 불러오시고 사용하십시오.

<p>[파일:1]</p><p>[파일:2]</p>
Ex가 붙은것은 예제입니다. 안붙은 것은 라이브러리 입니다.
그림파일을 바꾸고 싶으면 그림파일을 불러와 같은 크리고 다시 그리시면 됩니다
ProjectBattle.zip
ProjectBattleEx.zip

by 지나가는행인1 | 2009/03/08 10:41 | VNAP강의 | 트랙백 | 덧글(2)

타이틀cg 노가다

CharSel.zip
전에 강의 올린 아이템알고리즘을 이용해서 만드는 방법인데요

이 방법의 단점은 CG노가다가 필요하다는 점입니다.

뭐 특별한것은 아니고

캐릭터1,2,3 이 있다고 할때

1번캐릭터를 1

2번 => 2

3번 =>4로 주고

초기에 변수를 세팅해서

ifflag A가 성립하면 변수에 1더하구

B가 성립하면 2더하구

C가 성립하면 4를 더해

숫자에 맞는 CG를 출력한다는 점입니다.

ifflag를 한번씩만 체크해주면 되니 조금 노가다 정도가 줄어든다는 점입니다.

----------------------------

init setting = 0 이렇게 세팅하구

 

ifflag A 5
ifflag B 7
ifflag C 9
goto 12
set setting+=1
goto 2
set setting+=2
goto 3
set setting+=4
goto 4
writevariable setting
loadsnr title1.txt

//이런식으로 변수값조정

if (setting = 7 ) 10
if (setting = 6 ) 12
if (setting = 5 ) 14
if (setting = 4 ) 16
if (setting = 3 ) 18
if (setting = 2 ) 20
if (setting = 1 ) 22
cg 0.png
loadsnr main.txt
cg 7.png
goto 9
cg 6.png
goto 9
cg 5.png
goto 9
cg 4.png
goto 9
cg 3.png
goto 9
cg 2.png
goto 9
cg 1.png
goto 9
//이런식으로 CG출력

하는 방식입니다

------------------------------

*물론 코딩하기 쉽게 파일을 나눠서 했습니다.

*알고리즘은 아이템알고리즘 강의를 참조하세요. 저말고도 다른분이 올려놓은 것도 있으니 참조하세요.

*플레그가 다 세워져서 다시해보고 싶으 실때는 cfg파일을 지우면됩니다.

*생각하신게 이게 아니면 ...죄송할따름.

자세한것은 첨부파일을 보시면서 소스를 분석해 보세요.

 

라고 작성했었음.

by 지나가는행인1 | 2009/02/12 20:23 | VNAP강의 | 트랙백

라이브러리화

일단 라이브러리화의 예제는 libraryEx.zip 파일을 다운받아 주세요.

이 파일은

scenario.txt function.txt addy.txt initvalue.txt reset.txt

파일로 구성되 있습니다.

function.txt addy.txt initvalue.txt reset.txt

이 4개의 파일은 한 묶음 이므로 같이 다녀야하고

4개의 파일은 손대 필요없이 파일자체를 폴더에 복사해 넣으셔서 사용하시면 됩니다.

 

이 라이브러리 기능은 화면에 특정 위치에 문장을 찍어주는 것입니다.

제작자의 의견(?)을 따라 '라이브러리화예제 ' 줄여서 '예제' 라고 부르겠습니다.

 

scenario.txt 에 있는 내용을 사용자가 필요한 곳에 복사해서 사용하시면 됩니다.

사용법은 다음과 같습니다.

-------------------------------------------------

funcsnr initvalue.txt

window off
set string = 출력을 원하는 문장 넣기

funcsnr function.txt

window on 

-----------------------------------------------

이 부분을 넣고 문장을 넣으면 화면에 출력이 됩니다.

공백은 'ㄱ' 한자 1의 유니코드 공백( )을 사용해야 합니다.

linesize 란 변수값을 변경해 줄간격을 조정할 수 있습니다.

posx,posy 값을 조정해 출력 위치를 조정할 수 있습니다.

폰트값은 변수값을 인식못하므로 사용자가 따로 지정해야 합니다.

funcsnr initvalue.txt 이부분은 '한번'만 실행해야 합니다.

초기화하고자 하면 

funcsnr reset.txt 을 실행하면 초기화시켜줍니다.

 
libraryEx.zip


ㅋㅋㅋㅋㅋㅋㅋㅋ
완전히 프로그래밍 하는 기분.
학교에서 배운것 잘써먹는 구나!ㅋㅋㅋㅋㅋㅋㅋ
ㅋㅋㅋㅋ

by 지나가는행인1 | 2008/06/13 17:16 | VNAP강의 | 트랙백

회상씬.-노가다심함

회상씬 설명입니다.

물론 노가다성이 짙습니다.

예제는 2종류로 준비했습니다.

1. 변수 사용

2. funcsnr 사용입니다.

원리는 똑같습니다.

--------------------------------------------------------

회상신메뉴 -> 회상 시나리오 로드

-> 회상신메뉴에서 온녀석이면 회상신메뉴로 아니면 그냥진행

-------------------------------------------------------

체크방식이 2가지 입니다. 변수로 체크하는것과

funcsnr로 체크하는 방법입니다.

1 변수로 체크를 할시

장점:변수값을 이용하여 스위치 케이스문 비스무리하게 작성가능. 불러오는곳 조정이 쉽다.

      변수값으로 미묘한( ?) 조정이 가능하다

단점:시나리오 시작전에 모든 변수를 초기화하고 관리해야한다. 빼먹으면 오류남.

2.funcsnr

장점:간략하게 작성가능(스크립트 수는 비슷하지만 변수노가다를 안해도 됨)

단점:정밀한 제어 불가능과 잘못된사용으로 엉뚱한곳으로 튈염려가 있음.

 

예제를 다운받아보시면 더 쉬울것입니다

varfunc가 변수

funcsnr이 funcnsr을 이용한 회상씬입니다.

 

ps 메뉴스크립트에서는 변수를 가지고 노는것이 안되기 때문에 부득이하게 세팅용 스크립트가 필요합니다. 물론 funcsnr도 동일한 이유로 세팅용 스크립트가 필요합니다.

그래서 노가다성이 짙음.

 varfunc.zip
funcsnr.zip

by 지나가는행인1 | 2007/12/04 13:58 | VNAP강의 | 트랙백

플래그 메뉴 나누기

플래그 메뉴 분기 입니다.

회상씬은 조금 복잡함으로 나중에 따로 만들어, 강의를 올리도록 하겠습니다.

일단 플래그를 사용하여 메뉴를 분기하는 방법입니다.

전에 설명에서는 누구를 공략해야만 누구를 볼수있다~

란 설명으로 플래그를 사용해라 라고 말했습니다만.

이렇게도 사용할 수있다는 점을 보여줄려구.

예제를 작성했습니다. 메뉴를 분기하는 것이지요.

대부분 잘 아시겠지만. 질문이 들어왔으니 여기서 설명을 잠시하면

-----------------------------------------------

플래그가 있으면 -> 새로운 버튼이 있는 메뉴 호출

플래그가 없으면 -> 그냥 메뉴 호출

----------------------------------------------

이 되겠습니다.

ifflag MENU1 menuroad.txt
menu menu.txt

대략 이렇게 되겠지요.

MENU1이 세워져있으면 다른 메뉴를 호출하기위한 스크립트 로드

아니면 그냥 메뉴호출

이 되겠습니다.

예제를 다운 받으시고

실행해보시면 알기쉬울겁니다.

플래그를 지우실려면 cfg 파일을 지우시면 플래그가 사라집니다.
flag.zip

라고 여기에다가도 올리기. ㅋ

by 지나가는행인1 | 2007/12/04 13:15 | VNAP강의 | 트랙백

브이냅강좌 - 아이템 합성

*아이템 합성에 대한 내용입니다.

이것은 앞쪽에 나왔던 아이템알고리즘을 기반으로 하고있습니다.

 

네 안녕하세요. 아이템합성에 관한 것입니다.

물론 앞에 아이템 알고리즘을 기반으로 구현한겁니다.

 

소스라기보다는 개념 비슷한 문제이기때문에

간단한 설명과 짧은 예시로 설명을 할테니 양해를 바랍니다.

 

강의의 포인트

1.아이템마다 번호를준다.(합성될 아이템번호를 잘생각해서 배정한다.)

2. 합성된 아이템은 번호에 맞춰서 계산한다.

 

위의 2가지가 포인트입니다.

 

자 그럼 예와 함께 설명을 해볼까요

 

우선 자신이 임의로 아이템 번호를 정합니다.

정하는방법은 2^N번째 순으로 정합니다.(N은 0,1,2,3..)

  수학아님.즉 1,2,4,8,16,32,64.128,.....

예를 들면

1 = 사과  2 = 우유 4 = 바나나 8 = 딸기 16=레몬 32=사이다.......

그리고 합성된 아이템은  각 숫자의 합으로 줍니다.

예를 들면 사과 + 우유의 경우

사과(1)+우유(2) =사과우유(3)

이런식으로 줍니다.

 그렇게 주어지면 전체 아이템 리스트가 작성되겠죠.

1 = 사과  2 = 우유 3=사과우유 4 = 바나나 6=바나나 우유 8 = 딸기 10 =딸기우유

16=레몬 32=사이다  ..... 48 = 레몬사이다............

(소스가 아니라 종이나 기타 메모장같은곳에 작성하면서 만드시는 겁니다.

이 부분은 스크립트가 아닙니다. 주의!!)

 

이 아이템 리스트를 기반으로

아이템리스트 스크립트와 합성 소스를 작성하는 겁니다.

합성 소스는 다음과 같은 형식으로 진행됩니다.

 

1.합성할아이템을 선택받습니다.

  작성자의 편의에 따라 변수로 받던지 선택문으로 받던지 재량에 맡깁니다.

2.합성할 아이템의 숫자를 더해 그 숫자가 아이템리스트에 있으면 합성성공

  없으면 실패한것입니다.

 

예) 딸기(8)+우유(2)=딸기우유(10) 10번이 존재함으로 합성성공

레본(16)+사과(1)=???(17) 17번이 존재하지않으므로 합성실패

 

위의 사항으로 진행을 하면 됩니다.

이를 중복을 최대한 없애기 위해 funcsnr 과 return 명령어를 사용합니다.

(아이템 리스트 검사할때 아이템 리스트 스크립트를 불러들어 체크

 리스트에 있으면 그 아이템을 출력 해주고 바로 리턴,

없으면 실패하는 스크립트를 호출하거나 실패를 출력해주고 리턴)

 

물론 숫자를 주는것을 조절해서 3개이상도 가능합니다만

제일처음 숫자배정할때 신경을 써야겠죠.

 

ps 설마 예제가 그렇다고 음식만 합성되는것 아니냐? 라는 딴지거는분은 없겠죠.

ps2 이해가 안되시면 아이템알고리즘 정독을 해주세요.

ps3 제가 후반부(?)에 강의했던 내용은 전부다

 브이냅 게시판에 있는 모든 앞부분 강의를 이용한 것일뿐입니다.

 앞강의를 잘 살펴보시면 좋은 내용이 많습니다. 질문하시기전 앞부분의 강의를 검색해 주세요.

by 지나가는행인1 | 2007/11/13 23:43 | VNAP강의 | 트랙백 | 덧글(3)

◀ 이전 페이지          다음 페이지 ▶