STEP3.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:12k
源码类别:

Windows编程

开发平台:

Visual C++

  1. //-----------------------------------------------------------------------------
  2. // Microsoft OLE DB TABLECOPY Sample
  3. // Copyright (C) 1995-1998 Microsoft Corporation
  4. //
  5. // @doc
  6. //
  7. // @module STEP3.CPP
  8. //
  9. //-----------------------------------------------------------------------------
  10. /////////////////////////////////////////////////////////////////////
  11. // Includes
  12. //
  13. /////////////////////////////////////////////////////////////////////
  14. #include "wizard.h"
  15. #include "common.h"
  16. #include "Tablecopy.h"
  17. #include "Table.h"
  18. /////////////////////////////////////////////////////////////////////
  19. // CS3Dialog::CS3Dialog
  20. //
  21. /////////////////////////////////////////////////////////////////////
  22. CS3Dialog::CS3Dialog(HWND hWnd, HINSTANCE hInst, CTableCopy* pCTableCopy)
  23. : CDialogBase(hWnd, hInst)
  24. {
  25. ASSERT(pCTableCopy);
  26. m_pCTableCopy = pCTableCopy;
  27. }
  28. /////////////////////////////////////////////////////////////////////
  29. // CS3Dialog::~CS3Dialog
  30. //
  31. /////////////////////////////////////////////////////////////////////
  32. CS3Dialog::~CS3Dialog()
  33. {
  34. }
  35. /////////////////////////////////////////////////////////////////////////////
  36. // ULONG CS3Dialog::Display
  37. //
  38. /////////////////////////////////////////////////////////////////////////////
  39. ULONG CS3Dialog::Display()
  40. {
  41. //Create a modal dialog box
  42. return DialogBoxParam(m_hInst, MAKEINTRESOURCE(IDD_TO_INFO), NULL, DlgProc, (LPARAM)this);
  43. }
  44. /////////////////////////////////////////////////////////////////////
  45. // CS3Dialog::DlgProc
  46. //
  47. /////////////////////////////////////////////////////////////////////
  48. BOOL WINAPI CS3Dialog::DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  49. {
  50. switch(msg) 
  51. {
  52. case WM_INITDIALOG:
  53. {
  54. Busy();
  55. //Store the "this" pointer, since this is a static method
  56. CS3Dialog* pThis = (CS3Dialog*)lParam;
  57. SetWindowLong(hWnd, GWL_USERDATA, (LONG)pThis);
  58. //On INIT we know we have a valid hWnd to store
  59. CenterDialog(hWnd);
  60. pThis->m_hWnd = hWnd;
  61. //Init all controls to the default values
  62. pThis->InitControls();
  63. //Limit the length of User Entered TableName
  64. SendDlgItemMessage(hWnd, IDE_TO_TABLE, EM_LIMITTEXT, (WPARAM)MAX_NAME_LEN-1, 0L);
  65. pThis->RefreshControls();
  66. pThis->m_pCTableCopy->m_pCWizard->DestroyPrevStep(WIZ_STEP3);
  67. return HANDLED_MSG;
  68. }
  69. case WM_COMMAND:
  70. {
  71. //Obtain the "this" pointer
  72. CS3Dialog* pThis = (CS3Dialog*)GetWindowLong(hWnd, GWL_USERDATA);
  73. CTable* pCFromTable = pThis->m_pCTableCopy->m_pCFromTable;
  74. CTable* pCToTable = pThis->m_pCTableCopy->m_pCToTable;
  75. CDataSource* pCToDataSource = pCToTable->m_pCDataSource;
  76. CDataSource* pCFromDataSource = pCFromTable->m_pCDataSource;
  77. // All buttons are handled the same way
  78. switch(GET_WM_COMMAND_ID(wParam, lParam)) 
  79. {
  80. case IDB_TO_CONNECT:
  81. {
  82. Busy();
  83. if(pThis->Connect()) 
  84. {
  85. Busy();
  86. pThis->RefreshControls();
  87. SetFocus(GetDlgItem(hWnd, IDE_TO_TABLE));
  88. SendMessage(GetDlgItem(hWnd, IDE_TO_TABLE), EM_SETSEL, 0, -1); //Highlight TableName
  89. }
  90. return HANDLED_MSG;
  91. }
  92.                 case IDOK:
  93. {
  94. //Get the TableName
  95. Busy();
  96. wSendMessage(GetDlgItem(hWnd, IDE_TO_TABLE), WM_GETTEXT, MAX_NAME_LEN-1, pCToTable->m_TableInfo.wszTableName);
  97. //If the TableNames are the same (ignoring case) and the 
  98. //DataSource is the same then the copy is worthless (a no-op)
  99. if(_wcsicmp(pCToTable->m_TableInfo.wszTableName, pCFromTable->m_TableInfo.wszTableName)==0 &&
  100. pCToDataSource->IsEqual(pCFromDataSource))
  101. {
  102. //Need to enter a different table name from the source
  103. wMessageBox(hWnd, MB_TASKMODAL | MB_ICONEXCLAMATION | MB_OK, 
  104. wsz_ERROR, wsz_SAME_TABLE_NAME, pCToDataSource->m_pwszTableTerm);
  105. SetFocus(GetDlgItem(hWnd, IDE_TO_TABLE));
  106. SendMessage(GetDlgItem(hWnd, IDE_TO_TABLE), EM_SETSEL, 0, -1); //Highlight TableName
  107. return HANDLED_MSG;
  108. }
  109. wcscpy(pCToTable->m_wszQualTableName, pCToTable->m_TableInfo.wszTableName);
  110. pThis->m_pCTableCopy->m_pCWizard->DisplayStep(WIZ_STEP4);
  111. return HANDLED_MSG;
  112. }
  113.                 
  114.                 case IDB_PREV:
  115. //Get the TableName
  116. Busy();
  117. wSendMessage(GetDlgItem(hWnd, IDE_TO_TABLE), WM_GETTEXT, MAX_NAME_LEN-1, pCToTable->m_TableInfo.wszTableName);
  118. wcscpy(pCToTable->m_wszQualTableName,pCToTable->m_TableInfo.wszTableName);
  119. pThis->m_pCTableCopy->m_pCWizard->DisplayStep(WIZ_STEP2);
  120.                  return HANDLED_MSG;
  121. case IDCANCEL:
  122. Busy();
  123.                  EndDialog(hWnd, GET_WM_COMMAND_ID(wParam, lParam));
  124.                  return HANDLED_MSG;
  125. }
  126. // Now look for notification messages
  127. switch(GET_WM_COMMAND_CMD(wParam, lParam)) 
  128. {
  129. case LBN_SELCHANGE:
  130. {
  131. //A Provider Change requires a refresh
  132. if(IDC_PROVIDER_NAME == GET_WM_COMMAND_ID(wParam, lParam)) 
  133. {
  134. //Get new selection
  135. Busy();
  136. LONG iSel = 0;
  137. if((iSel = SendMessage(GetDlgItem(pThis->m_hWnd, IDC_PROVIDER_NAME), CB_GETCURSEL, 0, 0L)) != CB_ERR)
  138. {
  139. //Since we have the CBS_SORT turned on, the order in the Combo Box does
  140. //not match our array, so we pass the array index (lParam) as the item data
  141. LONG lParam = SendMessage(GetDlgItem(pThis->m_hWnd, IDC_PROVIDER_NAME), CB_GETITEMDATA, iSel, 0L);
  142. if((lParam < (LONG)pCToDataSource->m_cProviderInfo) && (wcscmp(pCToDataSource->m_rgProviderInfo[lParam].wszName, pCToDataSource->m_pwszProviderName)!=0))
  143. {
  144. pCToDataSource->Disconnect();
  145. }
  146. }
  147. }
  148. pThis->RefreshControls();
  149. }
  150. case EN_CHANGE:
  151. {
  152. pThis->EnableTable();
  153. return HANDLED_MSG;
  154. }
  155. }
  156. }
  157. }
  158. return UNHANDLED_MSG;
  159. }
  160. /////////////////////////////////////////////////////////////////////////////
  161. // BOOL CS3Dialog::InitControls
  162. //
  163. /////////////////////////////////////////////////////////////////////////////
  164. BOOL CS3Dialog::InitControls()
  165. {
  166. //Initialize the Provider List (if not done so already)
  167. CDataSource* pCDataSource = m_pCTableCopy->m_pCToTable->m_pCDataSource;
  168. CDataSource* pCFromDataSource = m_pCTableCopy->m_pCFromTable->m_pCDataSource;
  169. if(pCDataSource->m_rgProviderInfo == NULL)
  170. pCDataSource->GetProviders();
  171. WCHAR wszBuffer[MAX_NAME_LEN*2];
  172. HWND hWndProv = GetDlgItem(m_hWnd, IDC_PROVIDER_NAME);
  173. //Fill out the provider name combo box.
  174. for(ULONG i=0; i<pCDataSource->m_cProviderInfo; i++)
  175. {
  176. //Add the name to the list
  177. //Since we have the CBS_SORT turned on, the order in the Combo Box does
  178. //not match our array, so we pass the array index (lParam) as the item data
  179. swprintf(wszBuffer, wsz_PROVIDER_INFO_, pCDataSource->m_rgProviderInfo[i].wszName, pCDataSource->m_rgProviderInfo[i].wszDescription);
  180. LONG iIndex = wSendMessage(hWndProv, CB_ADDSTRING, (WPARAM)0, wszBuffer);
  181. SendMessage(hWndProv, CB_SETITEMDATA, (WPARAM)iIndex, (LPARAM)i);
  182. }
  183. //By default, it selects the same provider chossen in Step1
  184. if(pCDataSource->m_pwszProviderName == NULL)
  185. pCDataSource->m_pwszProviderName = pCFromDataSource->m_pwszProviderName;
  186. //Try and select the previous selected Provider
  187. if(CB_ERR == wSendMessage(hWndProv, CB_SELECTSTRING, 0, pCDataSource->m_pwszProviderName))
  188. {
  189. //If not found, just select the first one
  190. SendMessage(hWndProv, CB_SETCURSEL, 0, 0);
  191. }
  192. //By default, try and Connect to the same DataSource as in Step1
  193. //if using the same provider as in Step1
  194. if(!m_pCTableCopy->m_pCToTable->IsConnected() && wcscmp(pCDataSource->m_pwszProviderName, pCFromDataSource->m_pwszProviderName)==0)
  195. {
  196. //The Provider must support more than 1 active session as well to do
  197. //this functionality by default...
  198. if(pCFromDataSource->m_ulActiveSessions==0 || pCFromDataSource->m_ulActiveSessions>=2)
  199. Connect(pCFromDataSource);
  200. }
  201. // Enable Connect button only if there are providers installed.
  202. EnableWindow(GetDlgItem(m_hWnd, IDB_FROM_CONNECT), SendMessage(hWndProv, CB_GETCURSEL, 0, 0L) != CB_ERR);
  203. // Set the "Source" info
  204. //CONNECT_STRING
  205. wSetDlgItemText(m_hWnd, IDT_FROM_CONNECT, wsz_CONNECT_STRING_,
  206. pCFromDataSource->m_pwszProviderName, 
  207. pCFromDataSource->m_pwszDataSource, 
  208. pCFromDataSource->m_pwszDBMS,
  209. pCFromDataSource->m_pwszDBMSVer,
  210. pCFromDataSource->m_pwszProviderFileName,
  211. pCFromDataSource->m_pwszProviderVer);
  212. //TABLE
  213. wSetDlgItemText(m_hWnd, IDE_FROM_TABLE, m_pCTableCopy->m_pCFromTable->m_wszQualTableName);
  214. return TRUE;
  215. }
  216. /////////////////////////////////////////////////////////////////////////////
  217. // BOOL CS3Dialog::RefreshControls
  218. //
  219. /////////////////////////////////////////////////////////////////////////////
  220. BOOL CS3Dialog::RefreshControls()
  221. {
  222. BOOL fConnected;
  223. CTable* pCToTable = m_pCTableCopy->m_pCToTable;
  224. CTable* pCFromTable = m_pCTableCopy->m_pCFromTable;
  225. CDataSource* pCDataSource = pCToTable->m_pCDataSource;
  226. // Must have a connection to edit other controls
  227. fConnected = pCToTable->IsConnected();
  228. //Enable certain dialog controls, only if connected
  229. EnableWindow(GetDlgItem(m_hWnd, IDE_TO_TABLE), fConnected);
  230. EnableWindow(GetDlgItem(m_hWnd, IDT_TARGET), fConnected);
  231. EnableWindow(GetDlgItem(m_hWnd, IDT_TOTABLEHELP), fConnected);
  232. //Store the selected ProviderName and ProviderDesc
  233. LONG iSel = 0;
  234. if((iSel = SendMessage(GetDlgItem(m_hWnd, IDC_PROVIDER_NAME), CB_GETCURSEL, 0, 0L)) != CB_ERR)
  235. {
  236. //Since we have the CBS_SORT turned on, the order in the Combo Box does
  237. //not match our array, so we pass the array index (lParam) as the item data
  238. LONG lParam = SendMessage(GetDlgItem(m_hWnd, IDC_PROVIDER_NAME), CB_GETITEMDATA, iSel, 0L);
  239. ASSERT(lParam < (LONG)pCDataSource->m_cProviderInfo);
  240. pCDataSource->m_pwszProviderName = pCDataSource->m_rgProviderInfo[lParam].wszName;
  241. pCDataSource->m_pwszProviderParseName = pCDataSource->m_rgProviderInfo[lParam].wszParseName;
  242. }
  243. // Show user the connection string, and enable Next that requires connection
  244. if(fConnected)
  245. {
  246. //CONNECTSTATUS
  247. SetDlgItemText(m_hWnd, IDT_CONNECTSTATUS, "");
  248. //CONNECT_STRING
  249. wSetDlgItemText(m_hWnd, IDT_TO_CONNECT, wsz_CONNECT_STRING_,
  250. pCDataSource->m_pwszProviderName, 
  251. pCDataSource->m_pwszDataSource, 
  252. pCDataSource->m_pwszDBMS,
  253. pCDataSource->m_pwszDBMSVer,
  254. pCDataSource->m_pwszProviderFileName,
  255. pCDataSource->m_pwszProviderVer);
  256. //TABLEHELPMSG
  257. wSetDlgItemText(m_hWnd, IDT_TOTABLEHELP, wsz_TOTABLEHELP_, 
  258. pCDataSource->m_pwszTableTerm);
  259. }
  260. else
  261. {
  262. //CONNECTSTATUS
  263. wSetDlgItemText(m_hWnd, IDT_CONNECTSTATUS, wsz_NOT_CONNECTED);
  264. //CONNECT_STRING
  265. wSetDlgItemText(m_hWnd, IDT_TO_CONNECT, L"");
  266. }
  267. // If there is already a Table from previous selections, just use that one
  268. wSetDlgItemText(m_hWnd, IDE_TO_TABLE, pCToTable->m_TableInfo.wszTableName[0] ? pCToTable->m_TableInfo.wszTableName : pCFromTable->m_TableInfo.wszTableName);
  269. // Determine if there is enough information to move on
  270. return EnableTable();
  271. }
  272. /////////////////////////////////////////////////////////////////////////////
  273. // BOOL CS3Dialog::Connect
  274. //
  275. /////////////////////////////////////////////////////////////////////////////
  276. BOOL CS3Dialog::Connect(CDataSource* pCDataSource)
  277. {
  278. CDataSource* pCToDataSource = m_pCTableCopy->m_pCToTable->m_pCDataSource;
  279. CDataSource* pCFromDataSource = m_pCTableCopy->m_pCFromTable->m_pCDataSource;
  280. //Connect to the DataSource
  281. BOOL fConnected = m_pCTableCopy->m_pCToTable->Connect(m_hWnd, pCDataSource);
  282. //If Connected
  283. if(fConnected)
  284. {
  285. // Verify we can use this data source
  286. // Just give a warning to the user, since the DataSource may actually
  287. // be updatable, but it is returning the wrong property value.
  288. if(pCToDataSource->m_fReadOnly) 
  289. {
  290. wMessageBox(m_hWnd, MB_TASKMODAL | MB_ICONEXCLAMATION | MB_OK,  wsz_WARNING, 
  291. wsz_READONLY_DATASOURCE_, pCToDataSource->m_pwszDataSource);
  292. }
  293. //See if this is a similar DSN than the Source
  294. //If DSN's are not similar, then we need to translate
  295. m_pCTableCopy->m_fTranslate = !pCToDataSource->IsSimilar(pCFromDataSource);
  296. }
  297. return fConnected;
  298. }
  299. /////////////////////////////////////////////////////////////////////////////
  300. // BOOL CS3Dialog::EnableTable
  301. //
  302. /////////////////////////////////////////////////////////////////////////////
  303. BOOL CS3Dialog::EnableTable()
  304. {
  305. BOOL fConnected = m_pCTableCopy->m_pCToTable->IsConnected();
  306. EnableWindow(GetDlgItem(m_hWnd, IDOK), 
  307. fConnected && SendDlgItemMessage(m_hWnd, IDE_TO_TABLE, WM_GETTEXTLENGTH, 0, 0L));
  308. return TRUE;
  309. }