TNB Library
TnbTinyMsSqlAccessor.h
[詳解]
1#pragma once
13#ifdef __TNBPROCESSHANDLE_H__
14 #ifndef _TnbPROCESS_PipeInOut_ENABLE
15 #error Please define _TnbPROCESS_PipeInOut_ENABLE first rather than you include TnbProcessHandle.h.
16 #endif
17#endif
18
19#ifndef _TnbDOXYGEN //Document作成用シンボル
20 #define _TnbPROCESS_PipeInOut_ENABLE
21#endif
22#include <TnbProcessHandle.h>
23#include <TnbTinySqlAccessor.h>
24#include <TnbDntStr.h>
25#include <TnbFileName.h>
26#include <odbcinst.h>
27#pragma comment(lib, "odbccp32.lib")
28
29
30
31namespace TNB
32{
33
34
35
48{
49public:
50
60 static bool AddUserDsn(LPCTSTR lpszDriver, LPCTSTR lpszDsn, LPCTSTR lpszServer, LPCTSTR lpszPath)
61 {
63 dnt.Add(CStr::Fmt(_T("DSN=%s"), lpszDsn));
64 dnt.Add(CStr::Fmt(_T("SERVER=%s"), lpszServer));
65 dnt.Add(_T("Trusted_Connection=Yes"));
66 dnt.Add(CStr::Fmt(_T("Database=%s"), lpszPath));
67 return ConfigDataSource(ODBC_ADD_DSN, lpszDriver, dnt);
68 }
69
77 static bool RemoveUserDsn(LPCTSTR lpszDriver, LPCTSTR lpszDsn)
78 {
80 dnt.Add(CStr::Fmt(_T("DSN=%s"), lpszDsn));
81 return ConfigDataSource(ODBC_REMOVE_DSN, lpszDriver, dnt);
82 }
83
91 static bool HasUserDsn(LPCTSTR lpszDriver, LPCTSTR lpszDsn)
92 {
94 dnt.Add(CStr::Fmt(_T("DSN=%s"), lpszDsn));
95 return ConfigDataSource(ODBC_CONFIG_DSN, lpszDriver, dnt);
96 }
97
106 static bool ConfigDataSource(WORD request, LPCTSTR lpszDriver, const CDoubleNullTerminateStr& attributes)
107 {
108 BOOL r = ::SQLConfigDataSource(NULL, request, lpszDriver, attributes);
109 if ( ! r )
110 {
112 }
113 return !! r;
114 }
115
121 static CStrVector GetLastErrors(CDwordVector* pErrorCodes = NULL)
122 {
123 CStrVector vs;
124 WORD count = 1;
125 DWORD errorCode;
126 const WORD errorMsgMax = 300;
127 TCHAR errorMsg[errorMsgMax + 1];
128 if ( pErrorCodes != NULL )
129 {
130 pErrorCodes->RemoveAll();
131 }
132 while ( true )
133 {
134 RETCODE rc = ::SQLInstallerError(count++, &errorCode, errorMsg, errorMsgMax, NULL);
135 if ( rc == SQL_NO_DATA )
136 {
137 break;
138 }
139 if ( rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO )
140 {
141 TRACE1("%s\n", CStr(errorMsg));
142 vs.Add(CStr(errorMsg));
143 if ( pErrorCodes != NULL )
144 {
145 pErrorCodes->Add(errorCode);
146 }
147 }
148 }
149 return vs;
150 }
151};
152
153
154
190{
191 DEFSUPER(CTinySqlAccessor);
192public:
193
202 bool ConnectDataFile(LPCTSTR lpszManageName = NULL)
203 {
204 return _super::Connect(lpszManageName, _T(""), _T(""));
205 }
206
207
208 //-----
209
210
223 static bool AttachDataFile(LPCTSTR lpszManageName, LPCTSTR lpszMdfPath, LPCTSTR lpszDriver, LPCTSTR lpszServer = NULL)
224 {
225 CStr server = lpszServer;
226 if ( server.IsEmpty() )
227 {
228 server = _T(".\\SQLEXPRESS");
229 }
230 CFileName fn1 = lpszMdfPath;
231 CFileName fn2 = fn1.InsertAtEndOfName(_T("_log"), _T("ldf"));
232 //
233 DetachDataFile(lpszManageName, lpszDriver, lpszServer);
234 //
235 CStr cl;
236 // sqlcmd -S .\SQLEXPRESS -Q "sp_attach_db 'test','C:\Home\temp\TestDb1.mdf','C:\Home\temp\TestDb1_log.ldf';"
237 cl.Format(_T("sqlcmd -S %s -Q \"sp_attach_db '%s','%s','%s';\"")
238 , server, lpszManageName, fn1.GetFullName(), fn2.GetFullName());
239 CAscii ss;
240 bool r = ms_Execute(ss, cl);
241 if ( r && ! ss.IsEmpty() )
242 {
243 MB_OK;
244 CStr s;
245 s.Format(_T("SQLツールが以下のメッセージを返しました。\n正常なら「はい」、失敗なら「いいえ」を選択してください。\n\n-----\n\n%s"), CStr(ss));
246 if ( ::MessageBox(NULL, s, _T("AttachDataFile"), MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2) == IDNO )
247 {
248 r = false;
249 }
250 }
251 if ( ! r )
252 {
253 CStr cl2;
254 cl2.Format(_T("sqlcmd -S %s -Q \"drop database %s;\""), server, lpszManageName);
255 if ( ! ms_Execute(cl2) )
256 {
257 return false;
258 }
259 if ( ! ms_Execute(cl) )
260 {
261 return false;
262 }
263 }
264 return COdbcConfiguration::AddUserDsn(lpszDriver, lpszManageName, server, lpszManageName);
265 }
266
276 static bool DetachDataFile(LPCTSTR lpszManageName, LPCTSTR lpszDriver, LPCTSTR lpszServer = NULL)
277 {
278 bool r = COdbcConfiguration::RemoveUserDsn(lpszDriver, lpszManageName);
279 // sqlcmd -S .\SQLEXPRESS -Q "sp_detach_db 'test'';"
280 CStr server = lpszServer;
281 if ( server.IsEmpty() )
282 {
283 server = _T(".\\SQLEXPRESS");
284 }
285 CStr cl;
286 cl.Format(_T("sqlcmd -S %s -Q \"sp_detach_db '%s';\""), server, lpszManageName);
287 return ms_Execute(cl) & r;
288 }
289
298 static bool IsDataFileAttached(LPCTSTR lpszManageName, LPCTSTR lpszDriver)
299 {
300 return COdbcConfiguration::HasUserDsn(lpszDriver, lpszManageName);
301 }
302
311 static bool BackupDataFile(LPCTSTR lpszBackupFileName, LPCTSTR lpszManageName, LPCTSTR lpszServer = NULL)
312 {
313 // sqlcmd -S .\SQLEXPRESS -Q "backup database testDB to disk = 'c:\aa';"
314 CStr server = lpszServer;
315 if ( server.IsEmpty() )
316 {
317 server = _T(".\\SQLEXPRESS");
318 }
319 CStr cl;
320 cl.Format(_T("sqlcmd -S %s -Q \"backup database %s to disk ='%s' WITH INIT;\""), server, lpszManageName, lpszBackupFileName);
321 CAscii r;
322 ms_Execute(r, cl);
323 return r.Find("正常に処理") != INVALID_INDEX;
324 }
325
334 static bool RestoreDataFile(LPCTSTR lpszBackupFileName, LPCTSTR lpszManageName, LPCTSTR lpszServer = NULL)
335 {
336 // sqlcmd -S .\SQLEXPRESS -Q "restore database testDB from disk = 'c:\aa';"
337 CStr server = lpszServer;
338 if ( server.IsEmpty() )
339 {
340 server = _T(".\\SQLEXPRESS");
341 }
342 CStr cl;
343 cl.Format(_T("sqlcmd -S %s -Q \"restore database %s from disk ='%s' WITH RECOVERY;\""), server, lpszManageName, lpszBackupFileName);
344 CAscii r;
345 ms_Execute(r, cl);
346 return r.Find("正常に処理") != INVALID_INDEX;
347 }
348private:
349 static bool ms_Execute(CAscii& _res, LPCTSTR lpszCommandLine)
350 {
351 _res.Empty();
353 CPipe pipeIn;
354 CPipe pipeOut;
355 VERIFY( pipeIn.Open() );
356 VERIFY( pipeOut.Open() );
357 if ( ! ph.Create(lpszCommandLine, &pipeIn, &pipeOut, NULL, FALSE) )
358 {
359 return false;
360 }
361 ph.WaitForExit(5000);
362 CWorkMemT<char> a(500);
363 a.Fill(0);
364 if ( pipeOut.Receive(500, a) > 0 )
365 {
366 _res = a;
367 }
368 return true;
369 }
370 static bool ms_Execute(LPCTSTR lpszCommandLine)
371 {
372 CAscii r;
373 if ( ! ms_Execute(r, lpszCommandLine))
374 {
375 return false;
376 }
377 if ( ! r.IsEmpty() )
378 {
379 // 文字があればそれはエラー。
380 TRACE1("%s\n", CStr(r));
381 return false;
382 }
383 return true;
384 }
385};
386
387
388
389} // TNB
Double Null Terminate(DNT)型文字列操作関係のヘッダ
ファイルネーム関係のヘッダ
プロセスハンドル管理ヘッダ
簡易 SQL アクセス関係のヘッダ
Double Null Terminate(DNT)型文字列管理
Definition: TnbDntStr.h:61
void Add(LPCTSTR lpszStr)
[設定] 追加.
Definition: TnbDntStr.h:163
ファイル名管理クラス
Definition: TnbFileName.h:59
CStr GetFullName(void) const
[取得] フルName名取得
Definition: TnbFileName.h:184
CStr InsertAtEndOfName(LPCTSTR lpsz, LPCTSTR lpszExt=NULL) const
[取得] ファイル名末文字列追加.
Definition: TnbFileName.h:430
ODBC コンフィグレーションクラス
static CStrVector GetLastErrors(CDwordVector *pErrorCodes=NULL)
[取得] ラストエラー文字列取得.
static bool HasUserDsn(LPCTSTR lpszDriver, LPCTSTR lpszDsn)
[確認] ユーザー DSN 確認
static bool RemoveUserDsn(LPCTSTR lpszDriver, LPCTSTR lpszDsn)
[削除] ユーザー DSN 削除.
static bool AddUserDsn(LPCTSTR lpszDriver, LPCTSTR lpszDsn, LPCTSTR lpszServer, LPCTSTR lpszPath)
[追加] ユーザー DSN 追加.
static bool ConfigDataSource(WORD request, LPCTSTR lpszDriver, const CDoubleNullTerminateStr &attributes)
[設定] データソース設定.
パイプアクセスクラス
Definition: TnbPipe.h:38
virtual bool Open(void)
[処理] オープン.
Definition: TnbPipe.h:105
virtual size_t Receive(size_t size, LPVOID _P)
[処理] 受信.
Definition: TnbPipe.h:198
プロセスハンドル管理クラス
bool Create(LPCTSTR lpszExecName, LPCTSTR lpszCommand, STARTUPINFO &si)
[実行] プロセス実行
DWORD WaitForExit(DWORD dwWait=INFINITE)
[処理] 終了待ち.
bool IsEmpty(void) const
[確認] 空チェック
Definition: TnbStr.h:528
static CStrT Fmt(const TCHAR *lpszFormat,...)
[作成] 書式付き文字列作成
Definition: TnbStr.h:1206
INT_PTR Find(TYP t, INDEX iFromIndex=0) const
[確認] 検索.
Definition: TnbStr.h:540
void Empty(void)
[削除] 空化
Definition: TnbStr.h:197
void Format(const TYP *lpszFormat,...)
[代入] 書式付き文字列代入.
Definition: TnbStr.h:359
簡易 MS SQL アクセサクラス
static bool BackupDataFile(LPCTSTR lpszBackupFileName, LPCTSTR lpszManageName, LPCTSTR lpszServer=NULL)
[設定] データファイルのバックアップ.
static bool RestoreDataFile(LPCTSTR lpszBackupFileName, LPCTSTR lpszManageName, LPCTSTR lpszServer=NULL)
[設定] データファイルのリストア.
static bool AttachDataFile(LPCTSTR lpszManageName, LPCTSTR lpszMdfPath, LPCTSTR lpszDriver, LPCTSTR lpszServer=NULL)
[設定] データファイルのアタッチ.
static bool IsDataFileAttached(LPCTSTR lpszManageName, LPCTSTR lpszDriver)
[確認] データファイルのアタッチ済み?.
bool ConnectDataFile(LPCTSTR lpszManageName=NULL)
[設定] 接続.
static bool DetachDataFile(LPCTSTR lpszManageName, LPCTSTR lpszDriver, LPCTSTR lpszServer=NULL)
[設定] データファイルのデタッチ.
簡易 SQL アクセサクラス
virtual bool RemoveAll(void)
[削除] 空化
Definition: TnbVector.h:565
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
Definition: TnbVector.h:383
TNB::CStrT< TCHAR > CStr
文字列クラス
Definition: TnbStr.h:1785
TNB Library
Definition: TnbDoxyTitle.txt:2