JoinProvision.html에서 동의하면 JoinMember.asp로 넘어가며 JoinMember.asp 주소를 직접 치고 들어오는 요청을 약관 동의 페이지로 넘겨버리는 소스

Request.ServerVariables ("HTTP_REFERER")를 사용하는 경우 주소창이나 locaiton.href를 이용해 이동하면 NULL값이 되므로 form의 action을 이용해서 JoinMember.asp로 이동해야함(정확한건지는 잘 모르겠음 http헤더 확인 필요)

-JoinProvisioin.html-
<script language="javascript">
function agree()
{
        document.provision.action = "JoinMember.asp";
        document.provision.submit();
        return false;
}

</script>
-회원 약관 페이지-<br>
<form name="provision">
<input type="hidden" name="agree" value="ok">
</form>
<a href="#" onClick="agree()">동의</a>    <a href="../index.html">동의안함</a>

-JoinMember.asp-
<%
        Option Explicit
       
        dim PrevUrl , pos
        PrevUrl = Request.ServerVariables ("HTTP_REFERER")
        pos = InStr(PrevUrl,"JoinProvision.html")
       
        if pos < 1 then
                Response.Write "<Script language='javascript'>"
                Response.Write "alert('약관에 동의하셔야 합니다.');"
                Response.Write "location.href='JoinProvision.html';"
                Response.Write "location.go();"
                Response.Write "</Script>"
        end if
%>

Posted by Gu Youn
,
1. 테이블 구조 보기(DESC)
    Exec sp_help [UserTableName]

2. Stored Procedure 목록 보기 / 검색
SELECT * FROM sysobjects

3. Stored Procedure에서 select후의 레코드셋의 개수를 알고 싶은 경우
SELECT @@rowcount

4.Stored Procedure 삭제 하기
(1) 일반 삭제
     Drop Proc [StoredProcedureName]
 (2) 존재 검사후 삭제
    IF exists (select * from sysobjects where name='sp_extract_rand_problem')
    Begin
        Drop Proc sp_extract_rand_problem
    End
    Go

5. Stored Procedre 작성중 쿼리에 변수 사용 못하는 경우
varchar형 변수에 쿼리 저장한후 EXEC함수로 실행한다
 
예)
  Declare @sql Varchar(200)
       
  SET @sql = 'SELECT TOP ' + CONVERT(varchar(5),@pagesize) + ' * FROM MyBoard '
  SET @sql = @sql + 'WHERE board_idx not in (SELECT TOP ' + CONVERT(varchar(5),(@GotoPage-1) *@pagesize)  
  SET @sql = @sql + ' board_idx FROM MyBoard ORDER BY b_ref desc, b_step) order by b_ref desc, b_step'
  --print @sql
  EXEC (@sql)

6. Query Analyzer 에서 sql문 실행하면 메시지 텝에 (30 row(s) affected) 같은 메시지가 나오지 못하게 하기 #

set NoCount On

7. Local Variable로 Text 타입을 사용 못하므로 varchar형으로 대체해서 사용함

8. Stored Procedure 내에서 동적 쿼리 사용하는 예
Create Proc sp_dynamic_sql
        @strTableName varchar(20) ,
        @intBoard_Idx int ,
        @prev_idx int OUtput
As
Begin
--꼭 nvarchar 이어야 함
declare @stmt as nvarchar(400)
declare @params as nvarchar(500)

--stmt와 paranms에 임시 output 변수를 사용하면 됨, 여러개의 파라미터 경우는 "," 로 구분한다.
set @stmt = 'Select @idx = Min(board_idx) from ' + @strTableName + ' where board_idx > ' + CONVERT(VARCHAR(10),@intBoard_idx)
set @params = '@idx  as int OUTPUT' -- OUTPUT 키워드에 주의
exec sp_executesql @stmt, @params, @idx = @prev_idx OUTPUT
End

9. 테이블 목록(MySql의 show tables기능)
exec sp_tables

10. 데이타 베이스 목록및 정보(MySql의 show database 기능)
exec sp_databases / exec SP_HELPDB

11. FK 관계가 설정된 값 변경하기(참고: http://www.sqler.pe.kr/sql2k/63.asp )
참조받는 쪽의 값을 변경하는 경우 참조하는쪽 테이블에 CASCADE 설정 필요함
--ex(sql.pe.kr에서 발췌)- --tempdb를 사용한다. USE tempdb GO


--학과 테이블을 생성한다. CREATE TABLE 학과( 학과ID varchar(5) primary key , 학과명 varchar(10) not null ) GO

--학생 테이블을 생성한다. --UPDATE는 새로운 CASCADE 옵션으로, --DELETE는 아무 처리도 하지않게(기본 옵션)으로 처리 한다. CREATE TABLE 학생( 학번 int primary key , 이름 varchar(12) not null , 학과ID varchar(5) FOREIGN KEY REFERENCES 학과 (학과ID) ON UPDATE CASCADE ON DELETE NO ACTION ) GO

--학과에 정보를 삽입 한다. INSERT 학과 VALUES ('ITE', '정보통신') INSERT 학과 VALUES ('EC', '전자계산') GO

--학생 테이블에 참조하는 학과(학과ID)컬럼의 값으로 삽입한다. INSERT 학생 VALUES (941234, '코난', 'ITE') INSERT 학생 VALUES (950083, '세린', 'EC') GO

--데이터를 조회한다. SELECT * FROM 학과 SELECT * FROM 학생

--참조제이 걸려 있는 학과(학과ID) 에 --CASCADE 옵션이 걸려 있는 UPDATE를 수행한다. UPDATE 학과 SET 학과ID = 'AAA' WHERE 학과ID = 'ITE' GO

--데이터를 조회한다. CASCADE 옵션이 잘 동작한다. SELECT * FROM 학생 SELECT * FROM 학과

--삭제를 해 보자. DELETE 학과 WHERE 학과ID = 'EC' --참조 제약으로 삭제가 불가 하다는 에러메세지가 나온다.


12. 커서 이용하기(참고: http://www.sqler.pe.kr mssql2000강좌)
dbo.student_tbl에 있는 데이타를 jls.member_tbl에 인서트 하는 루틴

 declare cur_test CURSOR
 For select student_id,pwd,'S'  from dbo.student_tbl        
 --For select teacher_id ,pwd,'T'  from dbo.teacher_tbl

 Open cur_test

 declare @member_id varchar(20),
            @passwd varchar(20),
            @member_type varchar(1),
            @sql varchar(200)
 FETCH NEXT FROM cur_test INTO @member_id, @passwd,@member_type

 WHILE (@@FETCH_STATUS = 0)
 BEGIN
  -- Set @member_id  = 't'+cast(@member_id as varchar(20))
   set @sql = 'insert into jls.member_tbl (member_id,passwd,member_type)values ('''+@member_id+''', '''+@passwd+''','''+@member_type+''' )'
   EXEC (@sql)
 
   FETCH NEXT FROM cur_test INTO @member_id, @passwd,@member_type
  END


  close cur_Test
  deallocate cur_test

ps) 커서 선언시 테이블 조건에 사용할 값에 변수를 직접 사용할 수는 있으나 테이블 명에 직접 변수 사용은 불가능 하므로 다음처럼 해서 커서를 선언 할 수 있다.
  Declare @SQL VARCHAR(400)  
  SET @SQL = 'declare cur_problem CURSOR '
  SET @SQL = @SQL + 'For SELECT problem_num,a.test_cont_info_id FROM '+@strTestTableName+' As a, test_cont_info_tbl As B WHERE course_code='+@strCourseCode
  EXEC(@SQL)

13. 데이터 베이스 계정 정보
exec sp_helplogins <--- 데이타베이스에 상관없이 로긴할 수 있는 넘들 다 보여준다.
exec sp_helpuser <--- 현재 데이타베이스의 유저들을 보여준다.

14. Procedure 에서 변수에 SELECT 결과 할당하기
(변수 이용하는 동적 쿼리는 5, 8 번 참고)
Declare @name VARCHAR(30)
SELECT @name FROM member WHERE id='user_id' Print @name

15. 컬럼 이름 변경(column name)
test테이블의 name 컬럼명을 user_name으로 변경

EXEC   sp_rename 'test.name', 'user_name', 'COLUMN'

16. column이 null이면 기본 값을 주는 함수
ISNULL ( check_expression , replacement_value )

17. sp 작성시 유의점
sp 작성시에는 상황에 따라서 적당한 return 값을 갖도록 한다. 그래야 sp 사용시 발생하는 문제점을 빨리 알 수 있다.

18. IDENTITY 초기화
DBCC CHECKIDENT (t_mark_histw_tbl, RESEED, 0)//table_name, RESEED, 초기값

19. ALTER문 정리
ㄱ. column 속성 변경 : ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR(20) NOT NULL


20. Index에 따르지 않고 정렬하기
상황 : study_contents_id가 93,92,94인 레코드를 조회 하는데 결과의 정렬이 93,92,94로 되기를 원하지만 study_contents_id가 index여서 92,93,94 순으로 오름차순 정렬이 된다.
해결책 : study_contents_id 값에 따라서 정렬하고자 하는 순서를 order_seq에 부여한다. 그리고 order_seq를 정렬조건으로 사용한다.
SELECT study_contents_id ,
CASE study_contents_id
       WHEN 93  THEN 1
       WHEN 92  THEN 2
       WHEN 94  THEN 3
       END AS order_seq
,course_code, FROM study_contents_tbl WHERE study_contents_id IN (93,92,94,) ORDER BY order_seq ASC

21. 로그인 이름이 비어있는 사용자 정보 수정하기.이상하게 EM에서는 수정이 안됨
(1). 로그인 계정(로그인 이름) 생성 : sp_addlogin 생성할유저명, 비빌번호, 디폴트DB
   예) EXEC sp_addlogin 'con_user', 'con_pass', 'test_db'

  (2). 데이터 베이스 로그인 계정 변경 : sp_change_users_login 액션, 데이터베이스의사용자이름
   예) EXEC sp_change_users_login 'Update_One', 'con_user', 'con_user'

  관련 게시물 : http://sqler.pe.kr/web_board/view_list.asp?id=45680&read=45&pagec=&found=is&part=myboard1&ser=yes

22. 객체 생성 스크립트
sp_helptext 함수를 이용하거나 syscomments 시스템 테이블을 이용하면 됨.

ㄱ.프로시져
  select text from syscomments where id in (select id from sysobjects where xtype='p' and name NOT LIKE 'dt%')

ㄴ.트리거
  select text from syscomments where id in (select id from sysobjects where xtype='tr' and name NOT LIKE 'dt%')

ㄷ.뷰
  select text from syscomments where id in (select id from sysobjects where xtype='v' and name NOT LIKE 'sys%')

23. 서버에 생성된 데이터 베이스 정보
--서버단위
--데이터베이스 서버 정보
 select srvname, srvproduct, providername, datasource from master..sysservers
--데이터베이스 로그 공간
 DBCC sqlperf(logspace) /*각 데이터 베이스의 트랜젹션 로그 공간 */

--각 데이터베이스 정보(데위터베이스명, 생성일, 파일)
 select  name, crdate, filename from master..sysdatabases

--데이터베이스 단위
--sp_spaceused , DBCC sqlperf(logspace)를 이용

declare cur_name CURSOR
For select name from master..sysdatabases

Open cur_name

declare @name varchar(100)
declare @command varchar(200)

Fetch Next From cur_Name Into @name

while(@@FETCH_STATUS =0)
begin
        print @name
          set @command = 'use ['+ @name+'] exec sp_spaceused' --use구문과 프로시져가 동일한exec에서 실행 되도록 해야함
        exec(@command)
        /*sp_spaceused  각 데이터 베이스의 사용 공간*/

        FETCH NEXT FROM cur_name INTO @name
end
close cur_name
deallocate cur_name

--데이터베이스 단위
--테이블 목록
--exec sp_tables [dbname]
select * from INFORMATION_SCHEMA.TABLES

--테이블 단위
--컬럼 목록 및 자료형
--exec sp_columns [tablename]
select * from INFORMATION_SCHEMA.COLUMNS where table_name = 'blog_data'

24. 데이터베이스 풀 백업
--pubs데이터 베이스를 e:\backup\backup-file로 백업하는 명령
--백업 파일 경로 지정시 드라이브의 루트를 설정하면 장치 오류가 발생하여 백업이 되지 않음으로
--임의의 디렉토리를 만들어서 사용한다.
BACKUP DATABASE pubs TO DISK = 'e:\backup\backup-file' WITH INIT

'Computer > Database' 카테고리의 다른 글

MySQL 팁  (0) 2005.07.10
MS-SQL - ConnectionString 샘플  (0) 2005.07.10
MS-SQL - 패치및 서비스팩 적용에 따른 버전 정보  (0) 2005.07.10
데이터 베이스 잡담...  (0) 2003.05.23
Oracle 기본 정리  (0) 2003.03.26
두개 이상의 인스턴스 EM에 등록하기  (0) 2002.11.04
Posted by Gu Youn
,

폼에 리스트 박스 하나 추가하고 테스트한다.
gethostbyaddr의 타임아웃 문제는 고려하지 않았다.

WSAData wsadata;

  if(WSAStartup (MAKEWORD(1,1), &wsadata) != 0 )
  {
    ShowMessage("에러");
  }
 
  char ip[16];
  in_addr addr;
  hostent *host = 0;
  String errorcode;
   
  for(int i=0;i<255;i++)
  {

    sprintf(ip,"211.178.64.%d",i);
    addr.S_un.S_addr =  inet_addr(ip);
    host = gethostbyaddr ( (char *)(&addr.S_un.S_addr),        sizeof(addr.S_un.S_addr),        AF_INET);       

    int error = WSAGetLastError(); 


    switch(error)
    {
      case  WSANOTINITIALISED :
        errorcode = "WSANOTINITIALISED";
        break;
      case         WSAENETDOWN :
        errorcode = "WSAENETDOWN";
        break;
      case  WSAHOST_NOT_FOUND :
        errorcode = "WSAHOST_NOT_FOUND";
        break;
      case  WSATRY_AGAIN        :
        errorcode = "WSATRY_AGAIN";
        break;
      case  WSANO_RECOVERY  :
        errorcode = "WSANO_RECOVERY";
        break;
      case  WSANO_DATA :
        errorcode = "WSANO_DATA";
        break;
      case  WSAEINPROGRESS :
        errorcode = "WSAEINPROGRESS";
        break;
      case  WSAEAFNOSUPPORT :
        errorcode = "WSAEAFNOSUPPORT";
        break;
      case  WSAEFAULT        :
        errorcode = "WSAEFAULT";
        break;   
    }

    if(host != NULL)
      ListBox1->Items->Add( host->h_name); 
    else
    {
      ListBox1->Items->Add(errorcode); 
    }   
   
  }

  String msg  = "테스트가 끝났습니다.";
  ShowMessage(msg);

Posted by Gu Youn
,
1. 폼에 DataControls의 DBGrid를 폼에 놓고,그다음 Data Access의 DataSource를 폼에 추가한다.

2. ADO의 ADOConnection 과 ADODataSet을 추가한다.

3. ADOConnection의 ConnectionString을 생성한다.

4. ADODataSet의 connection 프로퍼티를 ADOConnection1로 하고 command text를 편집하고 Active프로퍼티를 true로 설정한다.

5. 그리고 DataSource1의 DataSet 프로퍼티를 ADODataSet1으로 한다.

6. F9를 누르면 그리드에 테이블의 내용이 나오는 프로그램이 실행될것이다.

참고) 프로그램 실행시에 디비 로그인 다이얼로그가 나오면 ADOConnection1의 LoginPrompt 속성을 false로 설정한다.
Posted by Gu Youn
,

컴포넌트가 등록되는 팔레트는 컴포넌트 소스 구현된 부분에 고칠수 있다.
Register()함수 찾은다음에 각자 환경에 맞는 팔레트 이름으로 변경하고 컴포넌트 설치한 다음에 빌더 재 실행하면 반영이 된다.

void __fastcall PACKAGE Register()
{
            TComponentClass classes[1] = {__classid(TImpFindFile)};
            RegisterComponents("Imp", classes, 0);
}
Posted by Gu Youn
,

볼랜드포럼에 임프.박지훈님이 팁앤트릭란에 "쓰레드 사용의 기초와 활용예"란 제목으로 올린 글에 나온 내용을 만든 예제 프로그램 첨부한다.


Posted by Gu Youn
,