2025-11-28 00:35:46 +09:00

633 lines
25 KiB
C++

//-----------------------------------------------------------------------------
// Microsoft OLE DB TABLECOPY Sample
// Copyright (C) 1991-2000 Microsoft Corporation
//
// @doc
//
// @module STEP4.CPP
//
//-----------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////
// Includes
//
/////////////////////////////////////////////////////////////////////
#include "wizard.h"
#include "common.h"
#include "tablecopy.h"
#include "table.h"
/////////////////////////////////////////////////////////////////////
// Defines
//
/////////////////////////////////////////////////////////////////////
//Enum Type Header for the ListView controls
enum COL_HEADERS
{
//IDL_FROM_TYPES
//ID_TO_TYPES
COL_COLNAME = 0, //ColInfo.pwszName
COL_COLTYPENAME = 1, //TypeInfo.pwszTypeName
COL_COLTYPE = 2, //ColInfo.wType
COL_COLORDINAL = 3, //ColInfo.iOrdinal
COL_COLSIZE = 4, //ColInfo.ulColumnSize
COL_COLPREC = 5, //ColInfo.bPrecision
COL_COLSCALE = 6, //ColInfo.bScale
COL_COLISFIXED = 7, //ColInfo.dwFlags ISFIXEDLENGTH
COL_COLISLONG = 8, //ColInfo.dwFlags ISLONG
COL_COLISNULLABLE = 9, //ColInfo.dwFlags ISNULLABLE
COL_COLWRITE =10, //ColInfo.dwFlags WRITE
COL_COLISROWID =11, //ColInfo.dwFlags ISROWID
COL_COLISROWVER =12, //ColInfo.dwFlags ISROWVER
};
enum EICON
{
ICON_COLUMN = 0,
ICON_READONLY = 1,
ICON_LONG = 2,
};
/////////////////////////////////////////////////////////////////////
// CS4Dialog::CS4Dialog
//
/////////////////////////////////////////////////////////////////////
CS4Dialog::CS4Dialog(HWND hWnd, HINSTANCE hInst, CTableCopy* pCTableCopy)
: CDialogBase(hWnd, hInst)
{
ASSERT(pCTableCopy);
m_pCTableCopy = pCTableCopy;
}
/////////////////////////////////////////////////////////////////////
// CS4Dialog::~CS4Dialog
//
/////////////////////////////////////////////////////////////////////
CS4Dialog::~CS4Dialog()
{
}
/////////////////////////////////////////////////////////////////////////////
// ULONG CS4Dialog::Display
//
/////////////////////////////////////////////////////////////////////////////
INT_PTR CS4Dialog::Display()
{
return DialogBoxParam(m_hInst, MAKEINTRESOURCE(IDD_OPTIONS), NULL, (DLGPROC)DlgProc, (LPARAM)this);
}
/////////////////////////////////////////////////////////////////////
// CS4Dialog::DlgProc
//
/////////////////////////////////////////////////////////////////////
BOOL WINAPI CS4Dialog::DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_INITDIALOG:
{
Busy();
//Store the "this" pointer, since this is a static method
CS4Dialog* pThis = (CS4Dialog*)lParam;
SetWindowLongPtrA(hWnd, GWLP_USERDATA, (LONG_PTR)pThis);
//On INIT we know we have a valid hWnd to store
pThis->m_hWnd = hWnd;
pThis->InitControls();
CenterDialog(hWnd);
pThis->m_pCTableCopy->m_pCWizard->DestroyPrevStep(WIZ_STEP4);
return HANDLED_MSG;
}
case WM_COMMAND:
{
//Obtain the "this" pointer
CS4Dialog* pThis = (CS4Dialog*)GetWindowLongPtrA(hWnd, GWLP_USERDATA);
// All buttons are handled the same way
switch(GET_WM_COMMAND_ID(wParam, lParam))
{
case IDX_COPY_TABLE:
case IDX_COPY_INDEXES:
case IDX_SHOW_SQL:
case IDR_ALL_ROWS:
case IDR_ROW_COUNT:
case IDR_PARAM_SETS:
case IDR_INSERTROW_IMMEDIATE:
case IDR_INSERTROW_BUFFERED:
case IDR_BLOB_SIZE:
case IDR_ISEQ_STREAM:
Busy();
pThis->RefreshControls();
return HANDLED_MSG;
case IDOK:
Busy();
if(!pThis->RefreshControls())
return HANDLED_MSG;
pThis->m_pCTableCopy->m_pCWizard->DisplayStep(WIZ_TYPES);
return HANDLED_MSG;
case IDB_PREV:
Busy();
if(!pThis->RefreshControls())
return HANDLED_MSG;
pThis->m_pCTableCopy->m_pCWizard->DisplayStep(WIZ_STEP3);
return HANDLED_MSG;
case IDCANCEL:
Busy();
EndDialog(hWnd, GET_WM_COMMAND_ID(wParam, lParam));
return HANDLED_MSG;
}
}
}
return UNHANDLED_MSG;
}
/////////////////////////////////////////////////////////////////////////////
// BOOL CS4Dialog::InitControls
//
/////////////////////////////////////////////////////////////////////////////
BOOL CS4Dialog::InitControls()
{
CDataSource* pCToDataSource = m_pCTableCopy->m_pCToTable->m_pCDataSource;
//IDX_COPY_TABLE (default-checked)
EnableWindow(GetDlgItem(m_hWnd, IDX_COPY_TABLE), pCToDataSource->m_pICommandText || pCToDataSource->m_pITableDefinition);
CheckDlgButton(m_hWnd, IDX_COPY_TABLE, m_pCTableCopy->m_fCopyTables);
wSetDlgItemText(m_hWnd, IDX_COPY_TABLE, pCToDataSource->m_pwszTableTerm);
//IDX_COPY_INDEXES (default-checked)
EnableWindow(GetDlgItem(m_hWnd, IDX_COPY_INDEXES), pCToDataSource->m_pICommandText || pCToDataSource->m_pIIndexDefinition);
CheckDlgButton(m_hWnd, IDX_COPY_INDEXES, m_pCTableCopy->m_fCopyIndexes);
//IDX_COPY_PRIMARYKEYS (default-checked)
EnableWindow(GetDlgItem(m_hWnd, IDX_COPY_PRIMARYKEYS), pCToDataSource->m_fPrimaryKeysSupported);
CheckDlgButton(m_hWnd, IDX_COPY_PRIMARYKEYS, m_pCTableCopy->m_fCopyPrimaryKeys);
//IDX_SHOW_SQL (checked)
EnableWindow(GetDlgItem(m_hWnd, IDX_SHOW_SQL), pCToDataSource->m_pICommandText != NULL);
CheckDlgButton(m_hWnd, IDX_SHOW_SQL, m_pCTableCopy->m_fShowQuery);
//IDR_ALL_ROWS (default)
//IDR_MAX_ROWS
CheckRadioButton(m_hWnd, IDR_ALL_ROWS, IDR_ROW_COUNT, m_pCTableCopy->m_dwRowOpt);
wSetDlgItemText(m_hWnd, IDE_ROW_COUNT, L"%lu", m_pCTableCopy->m_ulMaxRows);
//IDR_PARAM_SETS (default)
//If multiple param sets are not supported by this driver, select only 1 set
if(!pCToDataSource->m_fMultipleParamSets)
m_pCTableCopy->m_ulParamSets = 1;
if (pCToDataSource->m_pICommandText == NULL)
{
m_pCTableCopy->m_dwInsertOpt = IDR_INSERTROW_IMMEDIATE;
EnableWindow(GetDlgItem(m_hWnd, IDR_PARAM_SETS), FALSE);
}
CheckRadioButton(m_hWnd, IDR_PARAM_SETS, IDR_INSERTROW_BUFFERED, m_pCTableCopy->m_dwInsertOpt);
wSetDlgItemText(m_hWnd, IDE_PARAM_SETS, L"%lu", m_pCTableCopy->m_ulParamSets);
//Enable IDR_INSERTROW_IMMEDIATE radio button if supported by the provider
EnableWindow(GetDlgItem(m_hWnd, IDR_INSERTROW_IMMEDIATE), pCToDataSource->m_fIRowsetChange);
//Enable IDR_INSERTROW_BUFFERED radio button if supported by the provider
EnableWindow(GetDlgItem(m_hWnd, IDR_INSERTROW_BUFFERED), pCToDataSource->m_fIRowsetUpdate);
//IDR_BLOB_SIZE (default)
//IDR_ISEQ_STREAM
EnableWindow(GetDlgItem(m_hWnd, IDR_ISEQ_STREAM), pCToDataSource->m_dwStorageObjects & DBPROPVAL_SS_ISEQUENTIALSTREAM);
CheckRadioButton(m_hWnd, IDR_BLOB_SIZE, IDR_ISEQ_STREAM, m_pCTableCopy->m_dwBlobOpt);
wSetDlgItemText(m_hWnd, IDE_BLOB_SIZE, L"%lu", m_pCTableCopy->m_ulBlobSize);
//Limit the TextLength of the Edit Controls to 10 chars
SendDlgItemMessage(m_hWnd, IDE_ROW_COUNT, EM_LIMITTEXT, (WPARAM)10, 0L);
SendDlgItemMessage(m_hWnd, IDE_PARAM_SETS, EM_LIMITTEXT, (WPARAM)10, 0L);
SendDlgItemMessage(m_hWnd, IDE_BLOB_SIZE, EM_LIMITTEXT, (WPARAM)10, 0L);
//Only allow "NEXT" button if Some form of INSERT is supported
EnableWindow(GetDlgItem(m_hWnd, IDOK), pCToDataSource->m_pICommandText || pCToDataSource->m_pITableDefinition);
// Refresh the controls
RefreshControls();
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// BOOL CS4Dialog::RefreshControls
//
/////////////////////////////////////////////////////////////////////////////
BOOL CS4Dialog::RefreshControls()
{
// IDE_ROW_COUNT Get the Copy options first so we can check the row count if given.
if(IsDlgButtonChecked(m_hWnd, IDR_ROW_COUNT))
{
m_pCTableCopy->m_dwRowOpt = IDR_ROW_COUNT;
EnableWindow(GetDlgItem(m_hWnd, IDE_ROW_COUNT), TRUE);
}
else
{
m_pCTableCopy->m_dwRowOpt = IDR_ALL_ROWS;
EnableWindow(GetDlgItem(m_hWnd, IDE_ROW_COUNT), FALSE);
}
//Verify IDE_ROW_COUNT has legal value
if(!GetEditBoxValue(GetDlgItem(m_hWnd, IDE_ROW_COUNT), 1, LONG_MAX, &m_pCTableCopy->m_ulMaxRows))
return FALSE;
//IDE_PARAM_SETS Get the Insert ParamSets options
if(IsDlgButtonChecked(m_hWnd, IDR_PARAM_SETS))
{
m_pCTableCopy->m_dwInsertOpt = IDR_PARAM_SETS;
EnableWindow(GetDlgItem(m_hWnd, IDE_PARAM_SETS), m_pCTableCopy->m_pCToTable->m_pCDataSource->m_fMultipleParamSets);
}
else if(IsDlgButtonChecked(m_hWnd, IDR_INSERTROW_IMMEDIATE))
{
//IDR_INSERTROW_IMMEDIATE
m_pCTableCopy->m_dwInsertOpt = IDR_INSERTROW_IMMEDIATE;
EnableWindow(GetDlgItem(m_hWnd, IDE_PARAM_SETS), FALSE);
}
else
{
//IDR_INSERTROW_IMMEDIATE
m_pCTableCopy->m_dwInsertOpt = IDR_INSERTROW_BUFFERED;
EnableWindow(GetDlgItem(m_hWnd, IDE_PARAM_SETS), FALSE);
}
//Verify IDE_PARAM_SETS has legal value
if(!GetEditBoxValue(GetDlgItem(m_hWnd, IDE_PARAM_SETS), 1, LONG_MAX, &m_pCTableCopy->m_ulParamSets))
return FALSE;
//IDE_BLOB_SIZE Get the Insert ParamSets options
if(IsDlgButtonChecked(m_hWnd, IDR_BLOB_SIZE))
{
m_pCTableCopy->m_dwBlobOpt = IDR_BLOB_SIZE;
EnableWindow(GetDlgItem(m_hWnd, IDE_BLOB_SIZE), TRUE);
}
else
{
m_pCTableCopy->m_dwBlobOpt = IDR_ISEQ_STREAM;
EnableWindow(GetDlgItem(m_hWnd, IDE_BLOB_SIZE), FALSE);
}
//Verify IDE_BLOB_SIZE has legal value
if(!GetEditBoxValue(GetDlgItem(m_hWnd, IDE_BLOB_SIZE), 1, MAX_COL_SIZE, &m_pCTableCopy->m_ulBlobSize))
return FALSE;
// Get Create options
m_pCTableCopy->m_fCopyTables = IsDlgButtonChecked(m_hWnd, IDX_COPY_TABLE);
m_pCTableCopy->m_fCopyIndexes = IsDlgButtonChecked(m_hWnd, IDX_COPY_INDEXES);
m_pCTableCopy->m_fCopyPrimaryKeys = IsDlgButtonChecked(m_hWnd, IDX_COPY_PRIMARYKEYS);
// Set other Options
m_pCTableCopy->m_fShowQuery = IsDlgButtonChecked(m_hWnd, IDX_SHOW_SQL);
return TRUE;
}
/////////////////////////////////////////////////////////////////////
// CTypesDialog::CTypesDialog
//
/////////////////////////////////////////////////////////////////////
CTypesDialog::CTypesDialog(HWND hWnd, HINSTANCE hInst, CTableCopy* pCTableCopy)
: CDialogBase(hWnd, hInst)
{
ASSERT(pCTableCopy);
m_pCTableCopy = pCTableCopy;
}
/////////////////////////////////////////////////////////////////////
// CTypesDialog::~CTypesDialog
//
/////////////////////////////////////////////////////////////////////
CTypesDialog::~CTypesDialog()
{
}
/////////////////////////////////////////////////////////////////////////////
// ULONG CTypesDialog::Display
//
/////////////////////////////////////////////////////////////////////////////
INT_PTR CTypesDialog::Display()
{
return DialogBoxParam(m_hInst, MAKEINTRESOURCE(IDD_DATA_TYPES), NULL, (DLGPROC)DlgProc, (LPARAM)this);
}
/////////////////////////////////////////////////////////////////////
// CTypesDialog::DlgProc
//
/////////////////////////////////////////////////////////////////////
BOOL WINAPI CTypesDialog::DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_INITDIALOG:
{
Busy();
//Store the "this" pointer, since this is a static method
CTypesDialog* pThis = (CTypesDialog*)lParam;
SetWindowLongPtrA(hWnd, GWLP_USERDATA, (LONG_PTR)pThis);
//On INIT we know we have a valid hWnd to store
CenterDialog(hWnd);
pThis->m_hWnd = hWnd;
//Tell TableCopy to Map the Types from the Source->Target
//If MapTypes fails, start over, (ie: same as hitting OK)
if(FAILED(pThis->m_pCTableCopy->MapTypes()))
{
EndDialog(hWnd, 0);
return UNHANDLED_MSG;
}
pThis->InitControls();
pThis->RefreshControls();
// Now Display the lists of Mappings
pThis->ResetTypeLists();
pThis->m_pCTableCopy->m_pCWizard->DestroyPrevStep(WIZ_TYPES);
return HANDLED_MSG;
}
// Now look for WM_NOTIFY messages
case WM_NOTIFY:
{
if(wParam == IDL_FROM_TYPES || wParam == IDL_TO_TYPES)
{
//Obtain the "this" pointer
CTypesDialog* pThis = (CTypesDialog*)GetWindowLongPtrA(hWnd, GWLP_USERDATA);
NM_LISTVIEW* pListView = (NM_LISTVIEW*)lParam;
switch(pListView->hdr.code)
{
case LVN_ITEMCHANGED:
{
if(pListView->uNewState & LVNI_FOCUSED &&
pListView->uNewState & LVNI_SELECTED)
{
if(wParam == IDL_FROM_TYPES)
{
Busy();
SyncSibling(GetDlgItem(hWnd,IDL_TO_TYPES), GetDlgItem(hWnd,IDL_FROM_TYPES));
return HANDLED_MSG;
}
if(wParam == IDL_TO_TYPES)
{
Busy();
SyncSibling(GetDlgItem(hWnd,IDL_FROM_TYPES), GetDlgItem(hWnd,IDL_TO_TYPES));
return HANDLED_MSG;
}
return UNHANDLED_MSG; //No return Value
}
return UNHANDLED_MSG;
}//case LVN_ITEMCHANGED
}
return UNHANDLED_MSG;
}//IDL_TABLES
return UNHANDLED_MSG;
}//WM_NOTIFY
case WM_COMMAND:
{
// All buttons are handled the same way
//Obtain the "this" pointer
CTypesDialog* pThis = (CTypesDialog*)GetWindowLongPtrA(hWnd, GWLP_USERDATA);
switch(GET_WM_COMMAND_ID(wParam, lParam))
{
case IDOK:
//Now copy the Tables
pThis->m_pCTableCopy->CopyTables();
Busy();
pThis->m_pCTableCopy->m_pCWizard->DisplayStep(WIZ_STEP1);
return HANDLED_MSG;
case IDB_PREV:
Busy();
pThis->m_pCTableCopy->m_pCWizard->DisplayStep(WIZ_STEP4);
return HANDLED_MSG;
case IDCANCEL:
Busy();
EndDialog(hWnd, GET_WM_COMMAND_ID(wParam, lParam));
return HANDLED_MSG;
}
}
}
return UNHANDLED_MSG;
}
/////////////////////////////////////////////////////////////////////////////
// BOOL CTypesDialog::InitControls
//
/////////////////////////////////////////////////////////////////////////////
BOOL CTypesDialog::InitControls()
{
HWND hWndFrom = GetDlgItem(m_hWnd, IDL_FROM_TYPES);
HWND hWndTo = GetDlgItem(m_hWnd, IDL_TO_TYPES);
CDataSource* pCFromDataSource = m_pCTableCopy->m_pCFromTable->m_pCDataSource;
CDataSource* pCToDataSource = m_pCTableCopy->m_pCToTable->m_pCDataSource;
//CONNECT_STRING
wSetDlgItemText(m_hWnd, IDT_FROM_CONNECT, wsz_TYPES_STRING_,
pCFromDataSource->m_pwszProviderName,
pCFromDataSource->m_pwszDataSource,
pCFromDataSource->m_pwszTableTerm,
m_pCTableCopy->m_pCFromTable->m_wszQualTableName);
//CONNECT_STRING
wSetDlgItemText(m_hWnd, IDT_TO_CONNECT, wsz_TYPES_STRING_,
pCToDataSource->m_pwszProviderName,
pCToDataSource->m_pwszDataSource,
pCToDataSource->m_pwszTableTerm,
m_pCTableCopy->m_pCToTable->m_wszQualTableName);
//Create the Col ImageList
HIMAGELIST hColImageList = ImageList_Create(16, 16, ILC_MASK, 1, 0 );
//IDI_COLUMN - normal column icon
HICON hIcon = LoadIcon(m_hInst, MAKEINTRESOURCE(IDI_COLUMN));
ImageList_AddIcon(hColImageList, hIcon);
//IDI_COLUMNREAD - read-only column icon
hIcon = LoadIcon(m_hInst, MAKEINTRESOURCE(IDI_COLUMNREAD));
ImageList_AddIcon(hColImageList, hIcon);
//IDI_COLUMNLONG - long column icon
hIcon = LoadIcon(m_hInst, MAKEINTRESOURCE(IDI_COLUMNLONG));
ImageList_AddIcon(hColImageList, hIcon);
//Set image list to the Table Window
ListView_SetImageList(hWndFrom, hColImageList, LVSIL_SMALL);
ListView_SetImageList(hWndTo, hColImageList, LVSIL_SMALL);
//Use Extended ListView Styles!
SendMessage(hWndFrom, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_TWOCLICKACTIVATE | LVS_EX_SUBITEMIMAGES, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_TWOCLICKACTIVATE | LVS_EX_SUBITEMIMAGES);
SendMessage(hWndTo, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_TWOCLICKACTIVATE | LVS_EX_SUBITEMIMAGES, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_TWOCLICKACTIVATE | LVS_EX_SUBITEMIMAGES);
//Source ListView COLUMNS
LV_InsertColumn(hWndFrom, COL_COLNAME, "ColName");
LV_InsertColumn(hWndFrom, COL_COLTYPENAME, "TypeName");
LV_InsertColumn(hWndFrom, COL_COLTYPE, "Type");
LV_InsertColumn(hWndFrom, COL_COLSIZE, "Size");
LV_InsertColumn(hWndFrom, COL_COLORDINAL, "Ordinal");
LV_InsertColumn(hWndFrom, COL_COLPREC, "Precision");
LV_InsertColumn(hWndFrom, COL_COLSCALE, "Scale");
LV_InsertColumn(hWndFrom, COL_COLISFIXED, "ISFIXED");
LV_InsertColumn(hWndFrom, COL_COLISLONG, "ISLONG");
LV_InsertColumn(hWndFrom, COL_COLISNULLABLE, "ISNULLABLE");
LV_InsertColumn(hWndFrom, COL_COLWRITE, "WRITE");
LV_InsertColumn(hWndFrom, COL_COLISROWID, "ISROWID");
LV_InsertColumn(hWndFrom, COL_COLISROWVER, "ISROWVER");
//Target ListView COLUMNS
LV_InsertColumn(hWndTo, COL_COLNAME, "ColName");
LV_InsertColumn(hWndTo, COL_COLTYPENAME, "TypeName");
LV_InsertColumn(hWndTo, COL_COLTYPE, "Type");
LV_InsertColumn(hWndTo, COL_COLSIZE, "Size");
LV_InsertColumn(hWndTo, COL_COLORDINAL, "Ordinal");
LV_InsertColumn(hWndTo, COL_COLPREC, "Precision");
LV_InsertColumn(hWndTo, COL_COLSCALE, "Scale");
LV_InsertColumn(hWndTo, COL_COLISFIXED, "ISFIXED");
LV_InsertColumn(hWndTo, COL_COLISLONG, "ISLONG");
LV_InsertColumn(hWndTo, COL_COLISNULLABLE, "ISNULLABLE");
LV_InsertColumn(hWndTo, COL_COLWRITE, "WRITE");
LV_InsertColumn(hWndTo, COL_COLISROWID, "ISROWID");
LV_InsertColumn(hWndTo, COL_COLISROWVER, "ISROWVER");
//AutoSize all columns
for(ULONG i=0; i<=COL_COLISROWVER; i++)
{
SendMessage(hWndFrom, LVM_SETCOLUMNWIDTH, (WPARAM)i, (LPARAM)LVSCW_AUTOSIZE_USEHEADER);
SendMessage(hWndTo, LVM_SETCOLUMNWIDTH, (WPARAM)i, (LPARAM)LVSCW_AUTOSIZE_USEHEADER);
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// BOOL CTypesDialog::RefreshControls
//
/////////////////////////////////////////////////////////////////////////////
BOOL CTypesDialog::RefreshControls()
{
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// BOOL CTypesDialog::ResetTypeLists
//
/////////////////////////////////////////////////////////////////////////////
BOOL CTypesDialog::ResetTypeLists()
{
HWND hWndFrom; // From data types
HWND hWndTo; // To data types
WCHAR wszBuffer[MAX_NAME_LEN];
CHAR szBuffer[MAX_NAME_LEN];
CTable* pCFromTable = m_pCTableCopy->m_pCFromTable;
CTable* pCToTable = m_pCTableCopy->m_pCToTable;
// Get window handles to speed up the population
hWndFrom = GetDlgItem(m_hWnd, IDL_FROM_TYPES);
hWndTo = GetDlgItem(m_hWnd, IDL_TO_TYPES);
// Now populate each list
for(ULONG i=0; i<pCFromTable->m_cColumns; i++)
{
COLDESC* pCFromColDesc = &pCFromTable->m_rgColDesc[i];
COLDESC* pCToColDesc = &pCToTable->m_rgColDesc[i];
//COLNAME (item)
ConvertToMBCS(pCFromColDesc->wszColName, szBuffer, MAX_NAME_LEN);
LV_InsertItem(hWndFrom, i, COL_COLNAME, szBuffer, 0, pCFromColDesc->dwFlags & (DBCOLUMNFLAGS_WRITE | DBCOLUMNFLAGS_WRITEUNKNOWN) ? ((pCFromColDesc->dwFlags & DBCOLUMNFLAGS_ISLONG) ? ICON_LONG : ICON_COLUMN) : ICON_READONLY);
ConvertToMBCS(pCToColDesc->wszColName, szBuffer, MAX_NAME_LEN);
LV_InsertItem(hWndTo, i, COL_COLNAME, szBuffer, 0, pCToColDesc->dwFlags & (DBCOLUMNFLAGS_WRITE | DBCOLUMNFLAGS_WRITEUNKNOWN) ? ((pCToColDesc->dwFlags & DBCOLUMNFLAGS_ISLONG) ? ICON_LONG : ICON_COLUMN) : ICON_READONLY);
//COLTYPENAME (subitem)
pCFromTable->GetTypeNameAndParams(i, wszBuffer, sizeof(wszBuffer)/sizeof(WCHAR));
ConvertToMBCS(wszBuffer, szBuffer, MAX_NAME_LEN);
LV_InsertItem(hWndFrom, i, COL_COLTYPENAME, szBuffer);
pCToTable->GetTypeNameAndParams(i, wszBuffer, sizeof(wszBuffer)/sizeof(WCHAR));
ConvertToMBCS(wszBuffer, szBuffer, MAX_NAME_LEN);
LV_InsertItem(hWndTo, i, COL_COLTYPENAME, szBuffer);
//COLTYPE (subitem)
ConvertToMBCS(GetDBTypeName(pCFromColDesc->wType), szBuffer, MAX_NAME_LEN);
LV_InsertItem(hWndFrom, i, COL_COLTYPE, szBuffer);
ConvertToMBCS(GetDBTypeName(pCToColDesc->wType), szBuffer, MAX_NAME_LEN);
LV_InsertItem(hWndTo, i, COL_COLTYPE, szBuffer);
//Ordinal (SubItem)
StringCchPrintfA(szBuffer, sizeof(szBuffer), "%d", pCFromColDesc->iOrdinal);
LV_InsertItem(hWndFrom, i, COL_COLORDINAL, szBuffer);
StringCchPrintfA(szBuffer, sizeof(szBuffer), "%d", pCToColDesc->iOrdinal);
LV_InsertItem(hWndTo, i, COL_COLORDINAL, szBuffer);
//ColumnSize (SubItem)
StringCchPrintfA(szBuffer, sizeof(szBuffer), "%d", pCFromColDesc->ulColumnSize);
LV_InsertItem(hWndFrom, i, COL_COLSIZE, szBuffer);
StringCchPrintfA(szBuffer, sizeof(szBuffer), "%d", pCToColDesc->ulColumnSize);
LV_InsertItem(hWndTo, i, COL_COLSIZE, szBuffer);
//Precision (SubItem)
StringCchPrintfA(szBuffer, sizeof(szBuffer), "%d", pCFromColDesc->bPrecision);
LV_InsertItem(hWndFrom, i, COL_COLPREC, szBuffer);
StringCchPrintfA(szBuffer, sizeof(szBuffer), "%d", pCToColDesc->bPrecision);
LV_InsertItem(hWndTo, i, COL_COLPREC, szBuffer);
//Scale (SubItem)
StringCchPrintfA(szBuffer, sizeof(szBuffer), "%d", pCFromColDesc->bScale);
LV_InsertItem(hWndFrom, i, COL_COLSCALE, szBuffer);
StringCchPrintfA(szBuffer, sizeof(szBuffer), "%d", pCToColDesc->bScale);
LV_InsertItem(hWndTo, i, COL_COLSCALE, szBuffer);
//ISFIXED (SubItem)
LV_InsertItem(hWndFrom, i, COL_COLISFIXED, pCFromColDesc->dwFlags & DBCOLUMNFLAGS_ISFIXEDLENGTH ? "TRUE" : "FALSE");
LV_InsertItem(hWndTo, i, COL_COLISFIXED, pCToColDesc->dwFlags & DBCOLUMNFLAGS_ISFIXEDLENGTH ? "TRUE" : "FALSE");
//ISLONG (SubItem)
LV_InsertItem(hWndFrom, i, COL_COLISLONG, pCFromColDesc->dwFlags & DBCOLUMNFLAGS_ISLONG ? "TRUE" : "FALSE");
LV_InsertItem(hWndTo, i, COL_COLISLONG, pCToColDesc->dwFlags & DBCOLUMNFLAGS_ISLONG ? "TRUE" : "FALSE");
//ISNULLABLE (SubItem)
LV_InsertItem(hWndFrom, i, COL_COLISNULLABLE, pCFromColDesc->dwFlags & DBCOLUMNFLAGS_ISNULLABLE ? "TRUE" : "FALSE");
LV_InsertItem(hWndTo, i, COL_COLISNULLABLE, pCToColDesc->dwFlags & DBCOLUMNFLAGS_ISNULLABLE ? "TRUE" : "FALSE");
//WRITE (SubItem)
LV_InsertItem(hWndFrom, i, COL_COLWRITE, pCFromColDesc->dwFlags & (DBCOLUMNFLAGS_WRITE | DBCOLUMNFLAGS_WRITEUNKNOWN) ? "TRUE" : "FALSE");
LV_InsertItem(hWndTo, i, COL_COLWRITE, pCToColDesc->dwFlags & (DBCOLUMNFLAGS_WRITE | DBCOLUMNFLAGS_WRITEUNKNOWN) ? "TRUE" : "FALSE");
//ISROWID (SubItem)
LV_InsertItem(hWndFrom, i, COL_COLISROWID, pCFromColDesc->dwFlags & DBCOLUMNFLAGS_ISROWID ? "TRUE" : "FALSE");
LV_InsertItem(hWndTo, i, COL_COLISROWID, pCToColDesc->dwFlags & DBCOLUMNFLAGS_ISROWID ? "TRUE" : "FALSE");
//ISROWVER (SubItem)
LV_InsertItem(hWndFrom, i, COL_COLISROWVER, pCFromColDesc->dwFlags & DBCOLUMNFLAGS_ISROWVER ? "TRUE" : "FALSE");
LV_InsertItem(hWndTo, i, COL_COLISROWVER, pCToColDesc->dwFlags & DBCOLUMNFLAGS_ISROWVER ? "TRUE" : "FALSE");
}
return TRUE;
}