본문 바로가기
학습 노트/개인학습

250606 금요일 @ 40일차 (ODBC MSSQL 연결)

by 삼색먕 2025. 6. 7.

 

오전에 일어나서
SQL Server 2022 Express Edition 
SQL Server Management Studio 21 
설치, MSSQL 설정하다가 점심먹고
인디 게임제작 
Spawner  - 단순히 ObjectManager에 있는 Player의 위치기준 몬스터생성, 하이어라키 조합 Monster prefab+ Model prefab
ObjectPool - ObjectManager에 위치할 obejctPool 제작, object를 전체 통합으로 쓸줄알았는데
                     SetParent 하는것도 자원을 GetComponent급으로 많이먹는다고 해서
                     SetParent를 안하는 것들 (UI)같은거를 위해 설정값 추가
Monster (기본) - 팀원제작한 Character상속받아서 State 객체로 조작
                        - lookAt으로 사용할려고했으나 Model과 Monster가 로테이션 각각이고,
                          RigidBody 이동을 하길래 맞춰서 Rotation으로 변경

저녁먹기전에 ODBC 연결을 하는데 잘안됐다.
이전에 했었는데 따로 기록을 안해놔서 좀해맸다.

시작에서 ODBC 데이터 원본관리자를 검색해서 창을 띄워지는데
추가 버튼 눌러서 SQL Server / ODBC Driver 17 for SQL Server가 있어야 된다고 한다.
나는 SQL Server로 만들었다.

이름,설명은 아무거나 해도 된다 (이름은 소스코드에서 DSN방식으로 DB연결시 필요하다)
서버는 IP주소를 쓰면되는데 나는 로컬이니까 127.0.0.1로 (localhost)했다.
이렇게하면 서버가 다른곳에 있을때는 안되는지는 모르겠다 노트북이 없어서 테스트 해볼수는 없을듯하다.

다음 누르면 이화면이 나오는데 인증 사용을 누르고
로그인 ID 에서 SSMS에서 사용자를 등록해주고 사용자 / 패스워드를 입력해야한다 
(sa는 추천하지 않는다 기본적으로 있는 로그인 개체이기 때문에 1433포트 sa에 암호만 바꿔서 브루트포스 공격을 한다고 한다)
여기서 시간을 꽤 오래 잡아먹었는데,
Server 구성관리자 에서 127.0.0.1 활성, 사용 다 해봤는데도 안되고
SSMS 사용자에서 상태 로그인 사용으로 바꿨는데도 안넘어가졌었다.

SSMS에서 DB우클릭 속성 > 보안 >서버인증을 바꿔주면 다음으로 넘어갈수있었다.

이렇게 하고 나면 ODBC 등록이 된다

이걸로 시간 뺏고 작성하기 전에 알게된거지만
굳이 위에 있는 DSN설정 할필요없이 연결 문자열로 하면 ODBC드라이버 설치되어 있을경우 정상적으로 작동한다는것.

    wchar_t inidata_uid[100] = {};
    wchar_t inidata_pwd[100] = {};
    wchar_t inidata_server[100] = {};
    wchar_t inidata_dsn[100] = {};
    wchar_t inidata_database[100] = {};

    if (GetFileAttributesW(L"./db.config.ini") == INVALID_FILE_ATTRIBUTES) 
    {
        std::cout << "db.config.ini not founded\n";
        return false;
    }

    //ini 파일에서 ID/PW 읽기
    GetPrivateProfileStringW(L"database", L"uid", L"", inidata_uid, 100, L"./db.config.ini");
    GetPrivateProfileStringW(L"database", L"pwd", L"", inidata_pwd, 100, L"./db.config.ini");
    GetPrivateProfileStringW(L"database", L"server", L"", inidata_server, 100, L"./db.config.ini");
    GetPrivateProfileStringW(L"database", L"dsn", L"", inidata_dsn, 100, L"./db.config.ini");
    GetPrivateProfileStringW(L"database", L"database", L"", inidata_database, 100, L"./db.config.ini");

	// 연결 문자열 생성
	SQLWCHAR connectionString[512] = {};
    swprintf_s(connectionString, 512,
        L"DRIVER={SQL Server};SERVER=%s;DATABASE=%s;UID=%s;PWD=%s;",
        inidata_server, inidata_database, inidata_uid, inidata_pwd);

    //ODBC DSN으로 연결
    SQLWCHAR connStr[512] = {};
    swprintf_s(connStr, 512, L"DSN=%s;UID=%s;PWD=%s;", inidata_dsn, inidata_uid, inidata_pwd);

    //if (SQL_ERROR == SQLDriverConnectW(_h_dbc, NULL, connectionString, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT))
    if (SQL_ERROR == SQLDriverConnectW(_h_dbc, NULL, connStr, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT))
    {
        PrintErrorMessage(SQL_HANDLE_DBC, _h_dbc);
        return false;
    }

깃허브에 올리기 때문에 민감정보(ip,id,pw)는 ini파일로 숨기고 커밋에서 제외했다.

 

그리고 SQL타입 정리

//--SQL TYPE                --ODBC CTYPE DEFINE--
//CHAR(n) / VARCHAR(n)	     SQL_C_CHAR
//NCHAR(n) / NVARCHAR(n)     SQL_C_WCHAR
//TINYINT	                 SQL_C_STINYINT / SQL_C_UTINYINT
//SMALLINT	                 SQL_C_SSHORT / SQL_C_USHORT
//INT	                     SQL_C_SLONG / SQL_C_ULONG /SQL_C_LONG
//BIGINT                     SQL_C_SBIGINT / SQL_C_UBIGINT
//FLOAT (8바이트)	      	  SQL_C_DOUBLE
//REAL (4바이트)	          SQL_C_FLOAT
//DATETIME, SMALLDATETIME	 SQL_C_TYPE_TIMESTAMP
//UNIQUEIDENTIFIER(16바이트) SQL_C_GUID

SLONG signed  
ULONG unsigned

 

DB연동후 AccoundDB / GameDB 연결 완료 했다
Test용으로 Query를 직접 날렸고,
내일부터는 SP이용해서 플로우를 진행하면서 컨텐츠로 진입할예정이다.

'학습 노트 > 개인학습' 카테고리의 다른 글

250608 일요일 @ 42일차  (0) 2025.06.09
250607 토요일 @ 41일차  (0) 2025.06.08
250605 목요일 @ 38일차  (0) 2025.06.06
250603 화요일 @ 37일차  (0) 2025.06.04
250529 목요일 @ 32일차  (0) 2025.05.30

댓글