내 블로그 목록

레이블이 PC인 게시물을 표시합니다. 모든 게시물 표시
레이블이 PC인 게시물을 표시합니다. 모든 게시물 표시

수요일, 11월 04, 2009

윈도7 호환성이 걱정된다?

필자는 티맥스 OS가 시연 발표를 할 때 제 시간에, 제대로 나오기 힘들 것이며, 지금과 같은 형태로 개발을 했을 때 정식 버전이 발표된다고 할 지라도 베타 수준의 품질에 머물 것이라고 얘기한 적이 있다.

일반인들을 대상으로 하는 베타 테스트는 엄두도 내지 못하고, 하드웨어 업체엔 쌤플도 드리밀 지 못하는 것을 보고 그런 추측을 했었다. 그런데도 불구하고 국산이라는 이유하나만으로 사용자들은 흐뭇하고 ... 필요 이상의 점수를 주는 것 같다. 또한 윈도7과 같이 꽤나 쓸만하게 만들어진 운영체제도 내놓자 마자 호환성 부족 어쩌고 하는 식의 기사로 매도하는 것 같아 좀 우스워 보인다. 그 기사에서 문제가 된 것은 한글2002인데 이것은 마이크로소프트사가 아니라 한글과컴퓨터에서 패치판을 내놔야 한다. 한글2002뿐만 아니라 한글 2007도 윈도7 베타판에서 문제가 된 적이 있다. 이것도 마이크로소프트의 잘못이라기 보다는 아래아한글 배포판의 문제였다.(ms의 특정 파일을 옛 판으로 바꿔버림)

분명 하위 프로그램에 대해 호환성이 서비스팩에 해결될 것이라는 기대는 버리는 것이 좋다. 대부분 OS 자체의 문제라기 보다는 프로그램 자체의 문제니까 말이다.

우리 솔직히 말해 보자!

윈도7 ...  XP와도 비교도 되지 않는 걸작이다. 호환성 나쁘지 않다.

필자는 아동보호와 계정 간 프라이버시 등에 대해서도 꽤나 높은 점수를 주었다.

딱~하나 맘에 안드는 치명적인 것이 있다면, 비싼 가격일 뿐이다. 그래서 사람들은 티맥스가 잘 되길 바라는 것이다.

알집 논란과 EGG 포맷

알집의 마케팅 방법에 대해 사용자들의 불만이 쏟아지고 있다. 마치 마이크로 소프트를 성토하는 것 같다.

원망자들의 주장은 쓸 수 없게 만들어 놓았다는 것이다. 일부 인정하지만, 마케팅 방법으로서는 나쁘지 않다고 생각한다. 불법복사를 용인한 예전의 MS처럼 말이다.

그리고 또한 alz에 대한 알고리즘도 여태껏 공개하지 않았다는 것 ... 이것도 또한가지 이유이다. (지금은 공개)

어찌되었건, 알시리즈는 개인에게 무료이며, 사용자에게는 선택의 여지를 남겨두었다. 하지만 대부분의 경우 사용자들은 알아 둘 것이 있다. 알집으로 zip으로 압축하면 다수의 표준을 지키는 것이지만, alz로 압축을 하면 민폐일뿐만 아니라, 스스로에게도 좋지 않은 결과가 온다는 것을 ...

알집을 사용한 이점
- 많은 포맷을 지원한다.
- 개인사용자는 무료로 쓸 수 있다는 것은 분명한 장점이다.

알집을 사용할 때 주의점
XP에서 zip은 기본 압축 포맷으로 제공을 한다. 문제는 알집으로 alz로 압축할 때 상대방이 알집을 사용하지 않는다면 민폐가 된다는 점이다. 예를 들어, 알집이 없는 사용자라면 다운을 받아 풀고서 그것을 다시 삭제를 하는 불법을 저질러야 한다. 내가 만약 기업의 인사담당자라면, alz로 보내온 파일은 받지 않을 것이다. doc나 hwp 하나로만 보내는 것도 참을 수 있지만, 이것은 참기 힘들다. 왜냐하면, MS-word에서 hwp 포맷을 지원을 하며, 아래아한글에서도 doc 파일 포맷을 지원하기 때문이다. 하지만 alz는 위의 이유로 그렇지 않다.

내가 만약 인사담당자라면 분명 alz는 그냥 삭제해버릴 것이며, 실제로 이런 사례를 주위에서도 많이 보았고, 내 자신도 많은 경험이 있다. 이것은 거의 기본 상식 수준인데, 이러한 상식조차도 모른다면 마우스만 클릭할 줄 아는 준컴맹 수준이라는 것을 자랑하고 다는 것이다. 그런 인재를 반길 기업은 많지 않다.

EGG 포맷
alz의 한계이던, 아니면 어떤 문제이건 간에 egg 포맷이 나왔고, 포맷의 명세서를 공개한 것은 반길만하다. 이제 어느 정도 경쟁력이 생겼으니 당연한 절차이다. 또한 유니코드와 플래폼에서 자유롭다니 반길만 하다. 다만, 좀 더 빨리 이런 결정을 내렸더라면 훨씬 더 좋았을 것이다. 이런 결정으로 사용자들의 불만이 좀 누그러질 수 있을 것이다. 안랩이 V3zip을 굳이 만든 이유도 거기에 있었을 것이다.

확장자에 대한 자주적인 주권을 행사하는 것도 당연한 이치겠지만, 사용자들의 불만이었던 좀 더 개방적인 정책을 이제라도 시행을 했다는 것이 다행한 일이다.


수요일, 10월 14, 2009

mmgear USB 사운드카드 mm usc-100 드라이버

꽤나 괜찮은 평을 받고서도 결국 시장의 외면 또는 포화로 인해 문을 닫고 말았다. 따라서 드라이버 조차도 구하기 힘들다.


mmgear USB 사운드카드 mm usc-100은 sonix sound station을 사용하는데, 본사의 홈페이지에서도 구하기 힘들다.

mmgear external 5.1ch USB sound card

mmgear USB mm usc-100 드라이버 다운로드
download mmgear USB mm usc-100 driver


The site closed ... and it's really hard to find driver from anywhere!

일요일, 9월 06, 2009

포토샵 저리가라! photoscape

일반 PC 이용자들에게 가장 부담스러운 것이 무엇일까요? 바로 불법복제에 대한 공포입니다.

그 중 가장 비싸고 용량도 부담스러운 것이 바로 photoshop입니다. 그럼에도 불구하고 좀 처럼 포토샵과 결별하지 못하는 가장 큰 이유는 바로 편리한 단축키 이용과 축소 시 이미지 화질 저하에 대한 처리능력이 가장 뛰어나기 때문이었습니다.

물론 공짜로 쓸 수 있는 것 중에 포토샵과 비견할 프로그램이 없는 것은 아닙니다. 김프가 대표적인 프로그램인데요. 낯선 UI와 불편한 단축키 지원, 이미지를 축소할 때 심한 품질저하 등으로 계속 깔았다가 지운 적이 한두번이 아닙니다. 물론 대안이 없을 때는 가장 좋은 프로그램이지요. 최신 판은 UI도 많이 개선되어 많이 좋아졌습니다.


어떻게 보면, 김프는 과분한 프로그램이라고 할 수 있습니다. 벡트 그래픽을 지원하여 일러스트와 포토샵을 합친 기능까지 제공을 하니까요. 그럼에도 불구하고 많이 사용하지 않는 것은 새로운 것에 대한 낯설움 때문이 아닌가 생각됩니다.

인터넷 환경과 PC 환경 그리고 용량이 부담스럽지도 않으면서, 왠만한 기능은 제공되는 프로그램은 없을까? 3년 전 필자가 회사에서 포토샵을 대체할 프로그램을 끙끙이면서 선택한 것이 바로 이 photscape란 (놀랍게도 ) 국산 프로그램입니다.
이것만으로도 대부분의 인터넷 그래픽 작업이 가능하다.

대략적인 기능은 위의 그림에서 보는 것과 같습니다. 화면캡춰에 사진보정 기능, 그리고 사진 여러 개를 하나의 틀에 배치하는 것 등은 무료 이용자로서 황송하기까지 합니다. 물론 기본적으로 레이어가 지원되지 않기 때문에 전문적인 편집까지는 힘들지만, 그럼에도 불구하고 일반 이용자들에게 인터넷 환경에서 쉽게 사용할 수 있는 거의 모든 기능을 지원하기 때문에 일반 이용자들의 포토샵이라고 불려도 될 정도로 막강합니다. 기능을 나열하자면,

-사진뷰어: 폴더의 사진을 한눈에 보기, 슬라이드쇼

 -사진편집: 크기조절, 밝기조절, 색상조절, 역광보정, 액자, 말풍선, 모자이크, 글쓰기, 그림 그리기, 자르기, 필터, 적목보정, 뽀샤시

 -일괄편집: 여러 장을 한번에 변환하는 일괄처리

디카로 찍은 사진을 한꺼번에 필터를 적용해 변환하거나 크기를 줄일 수 있다.


 -페이지: 여러장을 템플릿 한장으로 만들기

여러개의 사진을 하나의 틀에 템플릿에 맞춰 배치할 수 있다.


 -이어붙이기: 아래로, 옆으로, 바둑판으로 여러장을 한장으로 이어 붙이기

 -GIF애니메이션: 움직이는 GIF 사진으로 만들기

 -인쇄: 증명사진,명함사진,여권사진이나 썸네일 인쇄

 -사진분할: 한장의 사진을 여러장으로 분할

 -화면캡쳐: 화면을 캡쳐해서 편집,저장하는 기능

 -색상검출: 사진이나 웹상의 화면을 확대해서 색상을 알아내는 색상검출 기능

 -이름변환: 사진이름 일괄변환

 -RAW변환: RAW 파일을 JPG 파일로 일괄변환

 -종이: 줄노트,모눈종이,오선지,달력 출력

 -얼굴검색: 인터넷에서 동일하거나 비슷한 얼굴을 검색

 -사진북마크: 사진전문 즐겨찾기



더욱 더 감동적인 것은 집, 회사, 학교, 학원 모두에서 무료라는 것이지요.

단점은 전문적인 뷰어로 하기에는 속도가 떨어지고, 레이어가 지원되지 않는다는 것 정도입니다.

금요일, 9월 04, 2009

CKEditor 3.0로 이름을 바꾼 FCKEditor 2.5

http://ckeditor.com/

다양한 스킨을 지원합니다.

 

그 외의 지원 사항으로는 다국어를 지원하며, 한글도 지원합니다. 하지만, 폰트까지 지원하는 것은 아닙니다.

 

FCKEditor도 2.6.4.1(2009년 7월 6일)까지는 지원을 하며, FCKeditor.Net: ASP.Net도 2008년 7월 26일자판을 지원합니다. 그 이전 버전은 보안상의 취약이 발견되어 급히 패치된 판입니다.


참고: http://ww0jeff.egloos.com/4181960

주민번호 앞자리에서 뒷자리로 자동이동

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<script language="javascript">
function moveNext(varControl, varNext)
{
if(varControl.value.length == varControl.maxLength)
{
varNext.focus();
varNext.select();
}
}
</script>
</HEAD>
<body>
<form>

<input type="text" name="jumin1" size="6" Maxlength="6" OnKeyUp="moveNext(this, jumin2);">
<input type="text" name="jumin2" size="7" Maxlength="7" OnKeyUp="moveNext(this, jumin1);">
</form>
</body>
</html>

DB에 빈값이 들어오다니 ...

 
디비에 저장할 때 사용자 입력값에 대해 앞뒤공백을 없애는 trim(전송값) 을 주로 사용한다. 이는 사용자의 실수나 장난으로 공백을 넣는 것을 막자는 의도로 이렇게 할 때의 문제점으로 사용자가 장난으로 공백만 입력하면......

처리페이지에서 trim으로 앞뒤공백을 제거하게되면 결국 " " 에서 "" 으로 되어 아무것도 들어있지 않은 빈값이 되고 만다

유명한 상용사이트에서도 이런 일이 있는데 이는 게시판을 우습게 만들고 만다

이를 방지하고자 한다면 처리페이지에서 trim후 중요한 몇가지 값을 ""인지 점검하는 if문을 사용하면 되겟지만 그보다는 클라이언트 측에서 자바스크립트 입력값 체크함수에서 막아주는 게 훨씬 효율적이다 안그래도 서버는 바쁘니까....


//공백이 하나든 둘이든 공백만 입력하면 첫번째 문자가 공백이 분명할 것이다 따라서
//다음과 같이 첫번째 문자가 공백인지를 체크하면 된다
//물론 공백을 먼저 넣고 다른 문자를 입력할 사용자에겐 미안하지만


var vN = document.regform.Name.value;

if (vN == "" || vN.substring(vN,1) ==' ')
{
alert("이름을 입력하지 않았거나 공백으로 시작했습니다.\n");
document.regform.Name.focus();
return false;
}

출처: http://www.dragoneye.co.kr/column/boardupdate01.asp?table=table11&page=1&mid=33

Validation 체크

주민번호, NULL 값, email 등 최고의 Validation Check

 

http://maniacamp.com/bbs/viewforum.php?f=6

 

http://myhome.hanafos.com/~laintt13/validate/validate_howto.htm

 

http://myhome.hanafos.com/~laintt13/validate/validate_test.htm

 

http://laintt.net/v04/jslib/validate/0_2_0/

[JavaScript] try ... catch ... 사용하기

..

Java와 같이 JavaScript에서도 try, catch 를 쓸수 있더군요..

 

(그런데...NE, IE간의 약간의 문법적 차이가 있어서, 주로 사용하는 IE 5.0으 경우를 듭니다)

 

사용법은..

 

try {

   // 문장....

  

} catch (e){

   alert (e);

}

 

이렇다.

 

catch는 try내에서 에러가 발생하였을때, 모든 에러를 잡아낸다..

잡힌 에러의 타입은 throw로 던진 에러의 타입이 되는데, 잘못된 변수등이나 시스템 에러의 경우

Error 라는 객체로 넘겨지게 된다.

 

Error는 속성으로 number와 description를 제공하는데, 이는 에러코드와 설명을 의미한다..

만일

 

try{

   windowsss.open();

} catch (e){

   alert ("code:" + e.number +",설명:" + e.description);

}

 

와 같이 window를 실수로 windowsss로 오타를 입력했을때, 발생되는 에러이다.

 

try{

  throw "hello world";

} catch (e){

  alert (e);

}

와 같은 코드에서는, 경고창에서 "hello world"를 볼수 있다.

 

그런데, catch문 내에서 잡혀진 에러에 따라 처리를 따로 하고 싶다면 다음과 같은 코드를 이용할 수 있다.

 

 if (e instanceof Error){

    alert ("시스템에러:" + e.description);

 } else if (typeof(e) == "string"){

    alert ("문자열에러:" + e);

 } else {

     alert (e);

 }

 

참고

http://www.webreference.com/js/column38/index.html

Javascript 주민등록번호로 성, 연령(성인-아동-유아) 체크하기

  첨부파일 (1)
 
 
위와 같이 주민번호로 나이, 성별, 연령대를 분리해 내는 소스입니다.
2000년 대 이후의 아이들에 대해서도 체크됩니다.
 
이해를 돕기 위해 주민등록번호 자체를 검증하는 것과 자질구레한 것들은 일단 뺐습니다.
------------------------------------------------------------------------------------
-- 유아(INFANT) : 24개월까지(2살)
-- 아동(CHILD) : 2살~12살
-- 성인(ADULT) :  13살 이상
------------------------------------------------------------------------------------
* 상기 구분은 국제항공예약과 호텔 예약에 대한 표준에 따른 분류법입니다.  
 ------------------------------------소스------------------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> 주민등록번호로 구분하기 </TITLE>
 </HEAD>
 <BODY>
  <!--입력한 주민번호로 나이와 성별을 알아보는 스크립트 시작-->
<SCRIPT language="JavaScript">
<!--주민번호 스크립트 끝-->
Now = new Date();    //현재 연도를 구함
NowYear = Now.getFullYear(); //나이를 구하는 함수 시작
function getAge()    
{        
var jfm = document.jumin_form
var j1=jfm.jumin1.value; //앞 6자리에 입력한 값을 j1 에 대입
var j2=jfm.jumin2.value; //뒤 7자리에 입력한 값을 j2 에 대입
var n1=j1.substr(0,2);      //앞 6자리에 입력한 값중 앞에서 두글자를 n1 에 대입
var n2=j2.substr(0,1);      //뒤 7자리에 입력한 값중 맨앞의 글자를 n2 에 대입( 1~4)
 if((n2==1)||(n2==2)){     //뒤 첫째값이 1, 2일 경우(1900년대에 출생한 남녀)
 jfm.age.value=(NowYear-(1900 + Number(n1)));
 }
 if ((n2==3)||(n2==4)){     //뒤 첫째값이 3, 4일 경우
 jfm.age.value=(NowYear-(2000 + Number(n1)));
 }
 if ((n2==1)||(n2==3)){     //뒤 7자리에 입력한 값중 맨앞의 수가 1이나 2일 경우(남자)
 jfm.sex.value="남성";
 }
 if ((n2==2)||(n2==4)){     //뒤 7자리에 입력한 값중 맨앞의 수가 3이나 4일 경우(여자)
 jfm.sex.value="여성";
 }
 if (document.jumin_form.age.value <=  2 ){     // 유아 24개월까지
 jfm.age_class.value="유아";
 }
 if (jfm.age.value >  2 || jfm.age.value <=  12 ){     // 아동
 jfm.age_class.value="아동";
 }
 if (jfm.age.value >  12 ){     // 성인-12세 이상
 jfm.age_class.value="성인";
 }
}
//-->
</script>
<!--입력한 주민번호로 나이와 성별을 알아보는 스크립트 끝-->
<!--아래와 같이 폼 태그를 구성하세요-->
<form method="get" name="jumin_form">
주민등록번호 입력:
<input type="text" maxlength="6" name="jumin1" size="7">-
<input type="text" maxlength="7" name="jumin2" size="8">
<input name="send" type="button" value="나이 알아보기" onClick="getAge()"><br>
<HR>
당신은 <input type="text" name="age" value="" size="3">살의
<input type="text" name="sex" value="" size="3">
<input type="text" name="age_class" value="" size="3"> 입니다.
</form>
<!--폼구성 설정 끝-->
</BODY>
</HTML>

3개월 달력

간단하면서도 잘 만들어진 3개월 달력입니다.

아래의 스크립트를 BODY 사이에 넣으시면 됩니다.

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

/*
3개월 달력 스크립트 - Ada Shimar (adashimar@chalktv.com)
다음 싸이트에서 찾을 수 있습니다 : http://www.javascriptkit.com/
*/

// 달력의 bgcolor를 설정
var bg="#FFFFE1"

// font size 설정
var fs=2

var flg = 0;
//var fs = 1;
M = new Array("1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월");
D = new Array("일","월","화","수","목","금","토");
function getBgn() {
pdy = new Date();        // 오늘
pmo = pdy.getMonth();    // 금월
pyr = pdy.getYear();     // 금년
if (pyr < 2000)    // Y2K Fix, Isaac Powell
pyr = pyr + 1900; //
yr = yr1 = (pmo==0?pyr-1:pyr); // 전년도
mo = (pmo==0?11:pmo-1);  // 전월
bgn = new Date(M[mo]+" 1,"+yr1); // Date에 할당
document.write('<TABLE BORDER=0><TR><TD VALIGN=TOP>');
Calendar();           // 마지막 달을 화면에 출력
document.write('</TD><TD VALIGN=TOP>');
yr = pyr;                // 금년
mo = pmo;                // 금월
bgn = new Date(M[mo]+" 1,"+yr); // date에 할당
Calendar();           // 이번 달을 화면에 출력
document.write('</TD><TD VALIGN=TOP>');
yr = (pmo==11?pyr+1:pyr); // 다음 달의 년도
mo = (pmo==11?0:pmo+1);   // 다음 달
bgn = new Date(M[mo]+" 1,"+yr); // date에 할당
Calendar();           // 다음 달을 화면에 출력
document.write('</TD></TR></TABLE>'); // 종료
}
function Calendar(){
dy = bgn.getDay();
yr = eval(yr);
d = "312831303130313130313031";
if (yr / 4 == Math.floor(yr / 4)) {
d = d.substring(0, 2) + "29" + d.substring(4, d.length);
}
pos = (mo * 2);
ld = eval(d.substring(pos, pos + 2));
document.write("<TABLE BORDER=1"
+ " BGCOLOR='" + bg
+ "'><TR><TD ALIGN=CENTER COLSPAN=7>"
+ "<FONT SIZE=" + fs + ">" + M[mo] + " " + yr
+ "</FONT></TD></TR><TR><TR>");
for (var i = 0;i < 7;i ++) {
document.write("<TD ALIGN=CENTER>"
+"<FONT SIZE="+fs+">" + D[i] + "</FONT></TD>");
}
document.write("</TR><TR>");
ctr = 0;
for (var i = 0;i < 7; i++){
if (i < dy) {
document.write("<TD ALIGN=CENTER>"
+"<FONT SIZE=" + fs + "> </FONT>"
+"</TD>");
}
else {
ctr++;
document.write("<TD ALIGN=CENTER>"
+ "<FONT SIZE=" + fs + ">" + ctr + "</FONT>"
+ "</TD>");
   }
}
document.write("</TR><TR>");
while (ctr < ld) {
for (var i = 0;i < 7; i++){
ctr++;
if (ctr > ld){
document.write("<TD ALIGN=CENTER>"
+ " </TD>");
}
else {
document.write("<TD ALIGN=CENTER>"
+ "<FONT SIZE=" + fs + ">" + ctr + "</FONT>"
+ "</TD>");
   }
}
document.write("</TR><TR>");
}
document.write("</TR></TABLE>");
}

</SCRIPT>

<CENTER>
<P><B>JavaScript 3개월 달력</B>
<SCRIPT LANGUAGE="JavaScript">

getBgn();

</SCRIPT>
</CENTER>

<p align="center"><font face="arial" size="-2">This free script provided by</font><br>
<font face="arial, helvetica" size="-2"><a href="http://javascriptkit.com">JavaScript Kit</a></font></p>

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

출처 : http://www.javascriptkit.com/script/script2/quartercalendar.shtml

처녀,총각 SQL 입문

여자 프로그래머의 신랑감 찾기

SELECT 키큰놈,잘생긴놈,MAX(돈많은놈)
FROM 총각
WHERE 키 > 175 AND 나이 < 30
ORDER BY 돈많은놈 DESC;

 

남자 프로그래머의 신랑감 찾기

SELECT 키크고,예쁘고,MAX(돈많은)
FROM 처녀
WHERE 키 > 168 AND 체형='날씬' AND 나이 < 28
ORDER BY 돈많은 DESC;

SELECT HEIGHT,GOODLOOKING,MAX(RICH)
FROM NOTMARRIED
WHERE HEIGHT > 175 AND AGE < 30
ORDER BY RICH ASC;

 

--댓글---------------------------------------------------

어눌한

2003/10/30 18:42

답글 | 삭제 | 신고

키 큰놈이랑 잘생긴놈이랑 그룹으로 묶어 줘야 할것 같은데..ㅡㅡa 

  • 2003/11/06 19:40

    답글 | 수정 | 삭제

    흠 그것까지 원한다면 .. 정말 도적X ... 노처녀로 늙어야 하겠지요 .... ^^; 

  • 2004/06/30 17:37

    답글 | 삭제 | 신고

  • group by 가 빠졌네요..ㅋㅋㅋ

  • [오라클] 세그먼트 확인

    세그먼트 정보 확인
    -----------------------------------------
    col segment_name format a12
    col tablespace_name format a14

    select segment_name, tablespace_name, segment_ID, FILE_ID
    from dba_rollback_segs

     

    MS SQL Server 2000의 TOP과 Oracle의 ROWNUM을 이용한 갯수제한

    오라클 DB를 위한 솔루션

    TOP 키워드는 ANSI SQL standard 가 이니다. 그래서 오라클에서는 지원하지 않는다. 하지만 다행스럽게도 우리는 오라클 stored procedure에 대하여서도 동일한 솔루션을 얻을수 있다. 오라클에서는 가상컬럼인 ROWNUM을 지원한다. 오라클로부터 조회된 각각의 ROW들에는 조회된 순서대로 ROW number가 assign 된다. (첫번째 row에대하여 1부터 시작한다.) 우리는 ROWNUM을 사용해서 퀴리로부터 가져올 row수를 제한할 수 있다.

    예를 들어, stored procedure로부터 첫 11개 row를 가져오고 싶으면, 오라클에서는 아래와같은 코드를 사용해서 가져온다.

    SELECT * FROM MyTable WHERE ROWNUM < 11;

    page navigation 을 구현하기 위해 Oracle stored procedure로 primary key값을 전달한다.

    Select *
    From tbl_SiteList
    Where siteID > @SiteID and ROWNUM < 11
    Order by siteID

    Oracle OLEDB driver로부터 오라클 스토어드프로시져를 access할때의 제한사항을 명심해야한다. ADO 2.1의 Oracle OLEDB provider 는 오라클 Stored procedure로부터 REF 커서타입을 리턴하지 못한다. 데이터를 가져오기 위해서는 PL/SQL 테이블을 선언해야만 한다. 그러나 ADO 2.5에서는 REF CURSOR 타입을 리턴할수 있다. 다음의 코드는 오라클 package와 procedure를 생성하는 예제이다.

    CREATE OR REPLACE PACKAGE PageNavi AS
    TYPE Nav_cursor IS REF CURSOR ;
    Procedure Prc_Forward (SiteID IN NUMBER, Rtn_cursor IN OUT Nav_cursor);
    END curspkg_join;
    /

    CREATE OR REPLACE PACKAGE BODY PageNavi AS
    Procedure Prc_Forward (SiteID IN NUMBER, Rtn_cursor IN OUT Nav_cursor)
    IS
    local_cursor Nav_cursor;
    BEGIN
    IF SiteID <> 0
    THEN
    OPEN local_cursor FOR
    Select *
    from tbl_SiteList
    where siteID > SiteID and ROWNUM < 11
    order by siteID;
    END IF;
    Rtn_cursor := local_cursor;
    END Prc_Forward;
    END PageNavi;
    /

    위 코드는 SiteID 의 조건에 해당하는 레코드셋을 리턴할 것이다. 레코드의 갯수는 ROWNUM 에 의해 걸러진다. 그러면 이제 ADO 2.5를 통해서 package를 부를수 있고, 결과를 ASP page에 보여줄 수 있다.

    MYSQL에서는 limit로 이러한 것을 지원한다.
    select * from table_01 where secret=0 order by hit desc limit 10; 

    MySQL TIP

    1. Backup & Restore
    1.1 Backup
    1.2 Restore
    1.2.1 Bulk Load

    2. image upload
    3. CREATE TABLE 구문 보기
    4. 한번 쿼리로 여러 개 컬럼 UPDATE 하기
    5. 설치 후 계정 정리하기
    6. 주민번호로 연령별 통계 구하기
    select (substring(substring(now(),1,4)-concat(ceiling(substring(ResRegNum2,1,1)/2)+18,substring(ResRegNum1,1,2)),1,1)*10) as age,count(ID) from member group by age;

    1. 단원은 데이터베이스 마이그레이션의 핵심 사항만을 정리한 것이다.
    기초적인 문법은 생략을 한다.

    1.1 Backup
    1.1.1 탭으로 분리된 데이터 만들기(Export with tab separated data)
    mysql> select * into outfile '/tmp/babo.txt' from info_dong;
    데이터베이스에서 자료만 뽑아서 사용할 때가 많다. 특히 마이그레이션할 때는 필수적이라고도 할 수 있다. 위의 방법은 간단하게 탭으로 분리된 데이터를 만드는 구문이다.

    이렇게 하면 필요한 컬럼만 뽑아서 탭으로 분리된 데이터로만 저장이 된다. Mysqldump와 같이 테이블 스키마가 포함되어 있는 스크립트를 전부 저장할 필요도 없이 데이터만 저장하여 다른 DB에서 이용할 수 있게 한다.

    1.2 Restore
    1.2.1 Bulk Load
    구문
    LOAD DATA INFILE ‘파일명’
    [REPLACE | IGNORE]
    INTO TALE tbl_name
    [FIELDS
    [TERMINATED BY ‘\t’] 또는 [TERMINATED BY ‘,’]
    [ENCLOSED BY ‘”’];
    ]
    1.2.2 Tab으로 분리된 데이터 올리기
    Mysql>load data infile “c:/mysql/book1.txt” replace into table dept teminated by ‘\t’;
    unique 컬럼에 중복된 열이 있을 때는 replace를 하면 덮어쓰고, ignore를 하면 무시된다.

    1.2.3 comma(,)로 분리된 데이터 올리기
    Mysql>load data infile “c:/mysql/book1.txt” into table dept teminated by ‘,’;

    1.2.4 기타 문장부호가 들어간 데이터 올리기
    “강민주”,”3”
    “강병기”,”34”
    “이지연”,”31”
    과 같은 형식으로 되어 있다면
    Mysql> load data infile “c:/mysql/book1.txt” into table dept
    FIELDS teminated by ‘,’ ENCLOSED BY’”’;

    1.2.5 필드인 맨 처음 라인을 제외하고 입력할 때
    Mysql> load data infile “c:/mysql/book1.txt” into table dept
    FIELDS teminated by ‘,’ ENCLOSED BY’”’;
    IGNORE 1 LINES;
    2. 그림 올리기
    CREATE TABLE images (
    id NOT NULL auto_increment primary key,
    image blob,
    description varchar(200)
    );
    02.jpg란 파일을 올려보자 ….
    Mysql>INSERT INTO TABLE(image,description) VALUES(LOAD_FILE(‘02.jpg’), “2번”);
    이 파일을 수정하려면
    Mysql>UPDATE images set image=LOAD_FILE(“/tmp/picture”) where id=1;

    3. CREATE TABLE 구문 보기
    info_device란 테이블이 존재하면
    Mysql>show create table check\G

    4. 한번 쿼리로 여러 개 컬럼 UPDATE 하기
    dept란 테이블이 존재한다면
    Mysql>desc dept;
    Field Type Null Key Default Extra
    --------- ----------- ------ ------ ------- ------
    dept_no int(11) PRI 0
    dept_name varchar(10)
    zipcode varchar(7)
    address varchar(30)
    local_no char(3)
    tel1 int(11) 0
    tel2 varchar(4)

    Mysql>select * from dept;
    dept_no dept_name zipcode address local_no tel1 tel2
    ------- --------- ------- ----------------------- -------- ------ ------
    10 관리부 135-240 123-45번지 우리빌딩 3층 02 504 5185
    20 전산부 135-240 123-45번지 우리빌딩 4층 02 576 0186
    30 영업부 135-240 123-45번지 우리빌딩 1층 02 678 1234
    40 생산부 150-040 17가 12번지 (주)우리 02 553 4980

    20번의 전산부를 15번으로 수정하고 부서명, 우편번호도 수정을 해준다.

    잘못된 결과를 되돌림하기 위해 트랜잭션을 걸어준다.
    Mysql>start transaction;
    Mysql>update dept set
    dept_no =’15’,
    dept_name=’전산실’,
    zipcode=’145-150’
    where dept_no=20;

    Mysql>select * from dept;
    dept_no dept_name zipcode address local_no tel1 tel2
    ------- --------- ------- ----------------------- -------- ------ ------
    10 관리부 135-240 123-45번지 우리빌딩 3층 02 504 5185
    15 전산부 145-150 123-45번지 우리빌딩 4층 02 576 0186
    30 영업부 135-240 123-45번지 우리빌딩 1층 02 678 1234
    40 생산부 150-040 17가 12번지 (주)우리 02 553 4980

    이상이 없으면 commit; 하고 이상이 있으면 rollback;을 해준다.

    5. 설치 후 계정 정리하기
    Mysql>use Mysql;
    Mysql>show tables;
    area
    columns_priv
    db
    func
    host
    tables_priv
    user

    계정 정보는 user 안에 들어가 있다.

    Database changed
    Mysql>update user set password=password(‘pppp’) where user=’root’;
    Mysql>delete from user where user=’ ‘;
    Mysql>delete from user where user=’‘;
    Mysql>flush privileges;


    6. 업그레이드
    Mysql은 비교적 잦은 판올림이 되어 종종 업데이터 해주어야 하는 경우가 있다. 우선
    ⓐ mysql/data 디렉토리를 다른 곳에 통째로 복사해 둔다.
    ⓑ 실행 창에서 –-remove 옵션을 사용해 서버를 삭제한다. 검은 화면이 보였다가 사라진다.


    ⓒ [제어판]-[프로그램 추가/삭제]에서 “MySQL server”를 선택하고 제거한다.


    ⓓ 윈도우를 재부팅한다.
    설치 디렉토리인 c:\mysql 디렉토리를 삭제하고 c:\WINNT\my.ini 도 삭제를 한다음 재부팅한다.


    재설치
    1. Mysql 설치
    2. 설치 후 작업
    3. 환경설정
    아래의 winmysqladmin.exe를 실행한다.

    my.ini Setup에서 language= 부분을 수정하고 왼쪽의 Save Medification을 클릭한다.
    이 작업을 마치면 C:\Windows(또는 WINNT) my.ini가 생성된다.(LINUX에서는 my.conf) 또한 서비스에 가서 확인해 보면 Mysql이 시작됨으로 설정되어 있음을 알 수 있다.


    패스워드를 가지지 않으면 권한이 제한되므로 이제는 계정에 접속을 해서 패스워드를 변경해 줄 일만 남았다.

    4. 계정변경
    c:\Inetpub\mysql\bin>mysql -uroot –p
    Enter password:
    Welcome to the MySQL monitor. Commands end with ; or \g.
    Your MySQL connection id is 3 to server version: 4.1.0-alpha-max-nt
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
    mysql> use mysql # 데이터베이스 선택
    Database changed
    mysql> UPDATE user SET password=PASSWORD('alswn')
    -> WHERE user='root';
    Query OK, 2 rows affected (0.02 sec)
    Rows matched: 2 Changed: 2 Warnings: 0

    mysql> flush privileges; # 환경갱신
    Query OK, 0 rows affected (0.00 sec)
    mysql> quit # 재접속을 위한 빠져나가기
    Bye
    c:\Inetpub\mysql\bin>mysql -uroot –p
    Enter password: *****
    Welcome to the MySQL monitor. Commands end with ; or \g.
    Your MySQL connection id is 4 to server version: 4.1.0-alpha-max-nt

    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
    mysql> use mysql
    Database changed
    mysql> show tables;

    6 rows in set (0.00 sec)

    mysql> SELECT host,user,password
    -> FROM user
    -> WHERE user='root';
    +-----------+------+---------------+
    | host . | user | password |
    +-----------+------+----------------+
    | localhost . | root | 4d6c7dd77f752921 |
    | % ...| root | 4d6c7dd77f752921 |
    +-----------+------+----------------+
    2 rows in set (0.01 sec)

    mysql>


    6. 주민번호로 연령별 통계 구하기
    SELECT (substring(substring(now(),1,4)-concat(ceiling(substring(ResRegNum2,1,1)/2) + 18,substring(ResRegNum1,1,2)),1,1)*10) AS age,count(ID)
    FROM member
    GROUP BY age;

    ResRegNum1 주민번호 첫 6자리
    ResRegNum2 주민번호 두 7자리

    ceiling(substring(ResRegNum2,1,1)/2)+18
    이 부분에서 먼저 주민번호 7자리 중에서 첫번째 1자리를 가져 옵니다. 이게 1900년에 태어났는지 그 이후에 태어 낫는지 알수 있는 키가 되기 때문이죠.그리고 그걸 2로 나눈 몫을 무조건 올려주면 정수가 나오는데 이거 에다가 18 을 더해 주면 몇년도에 태어 났는지 알수가 있게 되는겁니다..한번 자기 주민번호 가지고 계산 해보시길...
    substring(ResRegNum1,1,2)
    이걸로 이제 나머지 년도를 구해서 concat로 더해 주면 정말 그 사람이 태어난 년도가 나오게 되겠죠...여기까진 태어난 년도 계산이고...
    substring(now(),1,4)
    이건 지금 년도 얻어오고 아까 그년도를 뺀다음에 다시 앞의 글자 하나 가져 와서 10을 곱하면 비로소 연령대가 나오게 되는겁니다

    ADO 객체 속성과 메소드

    출처 : http://www.dragoneye.co.kr/lecture/asp/ado2.asp

     

    ADO객체활용에 들어가기 전에 ADO객체에 대해 전반적인 것을 살펴보자.
    앞으로 Connection,Command,Recordset객체를 주로 이용하게 되는데 객체들의 이름만 보면 담당하는 기능이 다를 것 같은데 실제 이들 객체는 모두 SQL명명을 실행하고 그 결과를 가져올 수 있다.

    아래는 이들 객체의 메소드와 속성을 살펴보고자 중요한 것만 정리한 것이다. 바쁘더라도 BOLD체만은 뭣에 쓰는 것인지 살펴봐야 한다.


    Connection 객체

    1. 데이타소스에 연결하기 위해 사용하지만 연결로 끝나는 것이 아니라 SQL명령을 실행한다. Select문일 경우 그 결과로 레코드셋을 가져올 수 있다

    2. 서로다른 SQL문을 여러번 실행할 경우 한번 생성된 Connection객체를 넘겨주는 것이 더 효율적이다.

    *입력(Insert쿼리), 수정(Update쿼리), 삭제(Delete쿼리), 조회(Select쿼리)에 사용.

    속성과 메소드
    1) 연결및 실행  
    ConnectionString 데이타소스연결시 필요한 정보
    Open 데이타소스에 연결을 한다
    Close 기존 열린 연결을 종료한다
    Execute SQL문,저장프로시저를 실행한다
    2) 트랜잭션  
    Attributes 기존 트랜잭션의 종료후 새 트랜잭션의 시작여부 제어 메서드
    BeginTrans 새 트랜잭션 시작
    CommitTrans 수정내용을 저장하고 트랜잭션 종료
    RollbackTrans 수정내용을 취소하고 트랜잭션 종료
    3) 기타  
    CommandTimeout 명령을 시도한 다음 지연시간(초단위) 기본값은 30초
    ConnectionTimeout 연결을 시도한 다음 지연시간(초단위) 기본값은 30초
    Mode 읽기 또는 읽기-쓰기 등 연결의 허용 범위
    Provider 연결의 제공자
    DefaultDatabase 접속하려는 D/B가 여럿일 경우 기본으로 하는 D/B 지정
    Version 사용하고 있는 ADO의 버전

    Command 객체
    이 객체만 이용하여 연결,명령을 수행할 수 있다 .기초에서는 생략한다.
    나중에 중급수준에서 저장프로시저를 사용할 때 한번 다뤄보기 바란다.
    저장프로시저의 사용에 편리한 parameter 속성이 있다.
    Properties과 Method
    1) 속성(Properties)  
    ActiveConnection Command객체에서 사용하는 Connection객체
    CommandText 실행될 명령어를 나타내는 택스트(SQL/저장프로시저)
    CommandTimeout 실행될 명령어를 위한 대기시간(초단위) 기본값은 30초
    CommandType CommandText에 넣은 명령타입 지정
    CommandTimeout 실행될 명령어를 위한 대기시간(초단위) 기본값은 30초
    Prepared 명령어를 실행하기 전에 준비하거나 컴파일 여부를 지정
    2) 메소드(Method)  
    Execute CommandText에 넣은 명령을 실행
    CreateParameters Parameters컬렉션에 새로운 Parameters객체 생성

    Recordset 객체

    1. ASP에서 데이타베이스를 다루는 대부분을 차지하는 것이 Recordset객체이며,이는 SQL문 실행결과 생성된 레코드셋을 다루는 객체이다.

    2. 레코드셋은 table형태이며 실제 data를 다룰 때는 레코드 단위로 처리하게 되며,

    3. 레코드 단위 처리를 위해 객체 내부적으로 '레코드포인트'라는 개념을 갖고 있어 이 포인트를 이동하면서 모든 레코드를 읽을 수 있는 것이다.

    속성과 메소드
    1) 열기.닫기 메소드  
    Open 레코드셋 열기
    Close 레코드셋 닫기
    2) 생성.삭제,수정  
    AddNew 기존 트랜잭션의 종료후 새 트랜잭션의 시작여부 제어 메서드
    Delete 새 트랜잭션 시작
    Update 수정내용을 저장하고 트랜잭션 종료
    3) 이동 메소드  
    Move 특정레코드로 이동
    MoveFirst 처음 레코드로 이동
    MoveLast 마지막 레코드로 이동
    MovePrevious 이전 레코드로 이동
    MoveNext 다음 레코드로 이동
    3) 프로퍼티  
    AbsolutePage 현재 레코드가 있는 페이지
    AbsolutePosition 현재 레코드의 순서 위치
    ActiveConnection 현재 레코드셋이 사용하고 잇는 Connection객체
    BOF 레코드셋의 시작, 현재 레코드위치가 이 위치이면 True
    EOF 레코드셋의 끝, 현재 레코드위치가 이 위치이면 True
    CursorType 레코드셋을 열 때 사용할 커서의 종류
    LockType 편집중 Lock타입을 지정
    PageSize 한페이지에 나타낼 레코드의 수를 지정
    PageCount 레코드셋에 있는 데이타의 페이지 수
    RecordCount 레코드셋에 있는 레코드의 수


    * 먼저 Connection객체와 recordset객체를 익히도록...

    * 레코드셋(Recordset)이란?

    레코드셋은 데이타 저장소로 물리적 DB의 table에 있는 자료를 직접 엑세스하는게 아니라 쿼리의 결과로 나온 메모리상의 가상테이블이라고 할 수 있는 이 레코드셋에 접근하여 자료를 다루는 것이다. 당연히 이 레코드셋에 담겨있지 않으면 접근할 수 없다.

    CursorType 및 상수

    출처 : http://www.dragoneye.co.kr/lecture/asp/ado3.asp

    앞에 나온 속성 중에서 CursorType 및 상수에 대해 알아본다


    앞에서 레코드셋 즉, 데이타를 다루는 단위가 레코드라고 했다. 그러면 무엇으로 현재레코드를 알 수 있을까? 바로 레코드포인트라는 것이 있어서 항상 현재레코드를 가리키도록 되어 있다. 우리는 이 레코드포인트를 이동하면서 필요한 데이타 작업을 할 수 있다. 이때 레코드포인트를 이동시켜 주는 것이 Cursor이다. 윈도우나 워드에서 화면/메뉴를 이동할 때 쓰는 Cursor와 비슷하다.

    이는 레코드셋을 열기 전에 지정되어야 하며 4가지가 있다. 지정하지 않으면 ForwardOnly(0)이 지정된다.

    * 적용방법 : 보통은 생략하든지 adOpenForwardOnly를 사용하면 되고 목록보기에서는 페이지관련 속성(pagesize,pagecount,absolutepage)을 사용할 수 있는 adOpenKeyset, adOpenStatic 을 사용하면 된다.


    커서타입 상수 값 내 용
    adOpenForwardOnly 0 디폴트 타입,읽기만 가능,가장 빠르다,전방향이동만 가능
    순서대로 한번씩 참조할 경우 편리하다
    adOpenKeyset 1 읽기/쓰기 가능,양방향 이동 가능, 다른 사용자 추가,삭제는 볼 수 없다
    adOpenDynamic 2 읽기/쓰기 가능,모든 이동 가능,다른 사용자 추가,삭제,수정을 볼 수 있다,성능상 많은 부담이 있다
    adOpenStatic 3 읽기/쓰기 가능,양방향 이동 가능, 본인외 다른 레코드셋 추가,삭제는 볼 수 없다

    사.용.방.법
    1. 상수값을 사용하는 방법  

    Set Rs=Server.CreateObject("ADODB.Recordset")
    ConnString= "Provider=Microsoft .Jet.OLEDB.4.0;Data Source=d:/test/member.mdb;"
    SQL="Selcect* from 테이블이름"
    Rs.Open SQL, ConnString, 3

    또는

    Set Rs=Server.CreateObject("ADODB.Recordset")
    CursorType=3
    ConnString= "Provider=Microsoft .Jet.OLEDB.4.0;Data Source=d:/test/member.mdb;"
    SQL="Selcect* from 테이블이름"
    Rs.Open SQL, ConnString


    2. 상수를 사용하는 방법
    ADO상수를 사용하려면 (즉,adOpenForwardOnly와 같이) 상수를 정의해둔 상수화일을 Server Side Include로 adovbs.inc화일을 포함하여야 한다

    <!-- #include file="폴더\adovbs.inc" -->
    ..............
    Set Rs=Server.CreateObject("ADODB.Recordset")
    ConnString= "Provider=Microsoft .Jet.OLEDB.4.0;Data Source=d:/test/member.mdb;"
    SQL="Selcect* from 테이블이름"
    Rs.Open SQL, ConnString, adOpenStatic

    또는

    <!-- #include file="common\adovbs.inc" -->
    .............
    Set Rs=Server.CreateObject("ADODB.Recordset")
    CursorType="adOpenStatic"
    ConnString= "Provider=Microsoft .Jet.OLEDB.4.0;Data Source=d:/test/member.mdb;"
    SQL="Selcect* from 테이블이름"
    Rs.Open SQL, ConnString



    *만약 레코드셋 객체를 통해 수정/삭제/등록을 하고자 하면 반드시 레코드셋에 대한 락 수준을 지정을 해야한다.(ADO연습 데이타 등록 부분 - 레코드셋 객체를 통한 데이타 등록 참고)

    락타입 상수 값 내 용
    adLockReadOnly 1 읽기전용(수정불가)
    adLockPessimistic 2 레코드단위, 편집 시작 순간부터
    adLockOptimistic 3 레코드 단위, update 메서드 순간
    adLockBatchOptimistic 4 배치갱신모드 요구


    ADO에서 사용하는 상수는 이외에도 많이 있다. 이 상수값들은 파일하나로 정의되었으며 위치는 c:\program files\common files\system\ado아래에 있다.

    사용을 위해 웹사이트(가상디렉토리)내에 폴더를 만들어 복사해서 두고 쓰면 된다.


    ADO 사용을 위한 준비 (ODBC/OLEDB)

    출처 : http://www.dragoneye.co.kr/lecture/asp/ado4.asp

    ADO가 데이타베이스를 다루는 객체라는 것은 앞에서 설명드렸으니까 이 데이타베이스를 다루려면 데이타소스에 연결해야한다.

    연결방법으로는 ODBC와 OLEDB 중에 선택해야 한다. ODBC는 다시 DSN 설정과 비설정으로 나눠지므로 선택의 폭은 총 3가지인데 나머지는 대략 살펴보고 OLEDB는 자세히 살펴보기 바란다.

    연결에 필요한 정보를 살펴보면

    1) 어떤 연결단자를 사용할 것인지(앞에서 ODBC와 OLEDB가 있다고 했음)
    2) 어떤 종류의 데이타베이스이며,
    3) 위치가 어디인지,
    4) ID와 비밀번호는 무엇인지가 필요하다

    결국 사용자가 asp문서를 클릭한다는 것은 asp문서속에 프로그래머가 준비해준 디비에 들어가는 정보(열쇠)를 갖고 준비해준 쿼리를 실행시켜 asp문서의 결과를 보는 셈이다.


    (1) 연결단자로 ODBC를 사용하면서 DSN을 설정하여 연결하는 방법
    제어판->(win2000경우 관리도구)-> 데이타원본 -> 시스템DSN 에서 [추가]를 선택하여 DSN을 추가한다 제대로 설정이 되었다면 이 DSN(Data Source Name)이 데이타 베이스의 종류,이름, 위치 정보를 가지게 된다.

    이렇게 DSN이 설정되면 앞으로 이 Name(DSN)을 사용해서 데이타베이스에 연결하게 된다 *물론 Access의 경우는 ID와 비밀번호가 없다.

    *이때 준 Name을 잘 기억해야겠다 . 소스중에 적어 주어야 하므로...

    Connection,Recordset객체는 뒤에서 다룰 것이므로 연결문자만 참조하기 바란다.
     
    *데이타베이스가 TestDB이고, DSN설정에서 별칭을 Test라고 했다면

    Access/SQL의 경우

    1) Connection 객체에서
    Set DbCon=Server.CreateObject("ADODB.Connection")
    DbCon.open "DSN=Test;UID=;PWD=;"

    2) Recordset 객체에서
    Set Rs=Server.CreateObject("ADODB.Recordset")
    SQL="Select * from 테이블이름"
    Rs.open SQL, "DSN=Test;UID=;PWD=;"

    *SQL Server경우는 User ID와 Password의 값을 넣어준다
    *물론 Access의 경우는 DSN뿐이므로 "Test"로 단축가능하다. 다른 데이타베이스를 사용할 경우 및 코드를 일목요연하게 하려면 변수를 사용할 수 있다.

    1)Connection 객체에서 (변수에 두고 사용)
    Set DbCon=Server.CreateObject("ADODB.Connection")
    ConnString= "DSN=Test;UID=;PWD=;"
    DbCon.open ConnString

    2)Recordset 객체에서 (변수에 두고 사용)
    Set Rs=Server.CreateObject("ADODB.Recordset")
    ConnString= "DSN=Test;UID=;PWD=;"
    SQL="Select * from 테이블이름"
    Rs.open SQL, ConnString


     
    (2) 연결단자로 ODBC를 사용하면서 DSN을 설정하지 않고 연결하는 방법

    *DSN에 설정에 사용했던 정보들을 연결문자열에 그대로 사용한다

    Access의 경우

    1) Connection 객체에서 (변수에 두고 사용)
    Set DbCon=Server.CreateObject("ADODB.Connection")
    ConnString= "Driver={Microsoft Access Driver (*.mdb)};DBQ=d:/test/TestDB.mdb;"
    DbCon.open ConnString

    2) Recordset 객체에서 (변수에 두고 사용)
    Set Rs=Server.CreateObject("ADODB.Recordset")
    ConnString= "Driver={Microsoft Access Driver (*.mdb)};DBQ=d:/test/TestDB.mdb;"
    SQL="Select * from 테이블이름"
    Rs.open SQL, ConnString

      *위에서 ODBC드라이브이름으로 Access Driver를 ,Access D/B의 경로와 이름을 지정해 주었다

    SQL Server의 경우

    1) Connection 객체에서 (변수에 두고 사용)
    Set DbCon=Server.CreateObject("ADODB.Connection")
    ConnString= "Driver={SQL Server};Server=SON;Database=TestDB;UID=sa;PWD=;"
    DbCon.open ConnString

    2) Recordset 객체에서 (변수에 두고 사용)
    Set Rs=Server.CreateObject("ADODB.Recordset")
    ConnString= "Driver={SQL Server};Server=SON;Database=TestDB;UID=sa;PWD=;"
    SQL="Select * from 테이블이름"
    Rs.open SQL, ConnString

    * M/S SQL Server의 경우 SQL 서버이름(여기서는 SON)과 D/B이름(여기서는 TestDB)과 User ID(여기서는 표준사용자 sa)와 Password를 지정하였다
     


    (3) 연결단자로 OLEDB를 사용하는 경우- 권장합니다

    * OLEDB는 연결문자열을 사용한다

    Access의 경우

    1) Connection 객체에서
    Set DbCon=Server.CreateObject("ADODB.Connection")
    ConnString= "Provider=Microsoft .Jet.OLEDB.4.0;Data Source=d:/test/TestDB.mdb;"
    DbCon.open ConnString

    2) Recordset 객체에서
    Set Rs=Server.CreateObject("ADODB.Recordset")
    ConnString= "Provider=Microsoft .Jet.OLEDB.4.0;Data Source=d:/test/TestDB.mdb;"
    SQL="Select * from 테이블이름"
    Rs.open SQL, ConnString

    *위에서 OLEDB제공자로 Microsoft.Jet.OLEDB.4.0을 지정하였고 D/B경로 및 이름 을 지정하였다

    SQL Server의 경우

    1) Connection 객체에서 (변수에 두고 사용)
    Set DbCon=Server.CreateObject("ADODB.Connection")
    ConnString= "Provider=SQLOLEDB;Data Source=SON;Initial Catalog=TestDB;User ID=sa;Password=;"
    DbCon.open ConnString

    2) Recordset 객체에서 (변수에 두고 사용)
    Set Rs=Server.CreateObject("ADODB.Recordset")
    ConnString= "Provider=SQLOLEDB;Data Source=SON;Initial Catalog=TestDB;User ID=sa;Password=;"
    SQL="Select * from 테이블이름"
    Rs.open SQL, ConnString

    *위에서 OLEDB제공자로 SQLOLEDB를 지정하였고 SQL서버이름(SON)과 D/B이름 및 USer ID와 Password를 지정하였다


    ASP에서 주로 사용하는 데이타베이스인 Access 및 SQL Server는 ODBC 및OLEDB 모두 이용할 수 있다. ODBC를 익힌 다음 실제 작업에서는 OLEDB를 사용하면 된다.

    OLEDB로 연결하는 방법

    출처 : http://www.dragoneye.co.kr/lecture/DBCON/sql_oledb.asp

     

     

    Data Source : DB명 / Initial Catalog : Table명

     

    localhost(또는 DB서버의 Netbios명) 또는 원격지 DB 211.233.xxx.yyy 에 연결을 하고자 한다. localhost는 EC001이라는 Netbios명을 가지고 있다고 하면

     

    1. 소스중에 넣기
    <%
    Set DB=Server.CreateObject("Adodb.Connection")
    DB.open "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=dbName;User ID=kim;Password=1234"
    %>

    2. 변수를 사용하기
    <%
    Connstring
    = "Provider=SQLOLEDB;Data Source=EC001;Initial Catalog=Sales;User ID=kim;Password=1234"

    Set DB=Server.CreateObject("Adodb.Connection")
    DB.open Connstring
    %>

    3. 인클루드 사용 (권장하는 방법입니다)

    ♡ 변수를 저장할 페이지 : INC.ASP 파일(임의로 정함)

    <%
    Connstring= "Provider=SQLOLEDB;Data Source=EC001;Initial Catalog=Sales;User ID=kim;Password=1234"
    %>

    ♡ 사용할 페이지

    <!-- #include file="inc.asp" -->
    <%
    Set DB=Server.CreateObject("Adodb.Connection")
    DB.open Connstring
    %>

    원격지 서버에서 다른 port를 사용할 때

    DB.Open "Provider=sqloledb;" & _
               "Network Library=DBMSSOCN;" & _
               "Data Source=xxx.xxx.xxx.xxx,1433;" & _
               "Initial Catalog=myDatabaseName;" & _
               "User ID=myUsername;" & _
               "Password=myPassword"

     

    상기에서 1433번 외에 다른 port가 지정될 것이다. 그것을 수정해 주면 된다.