www.pudn.com > 使用ADO执行存储过程.zip > ImportDlg.cpp


// ImportDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#import "C:\Program Files\Common Files\System\ado\msado10.dll" no_namespace rename( "EOF", "adoEOF" ) 
 
 
#include "Import.h" 
#include "ImportDlg.h" 
#include "ByteImport.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CAboutDlg dialog used for App About 
 
_variant_t  vtEmpty (DISP_E_PARAMNOTFOUND, VT_ERROR); 
_variant_t  vtEmpty2(DISP_E_PARAMNOTFOUND, VT_ERROR); 
_bstr_t     bstrEmpty(L""); 
 
// Connection and SQL Strings 
_bstr_t    bstrAccessConnect        ( L"DRIVER={Microsoft Access Driver (*.mdb)};" 
                                      L"DBQ=ADODEMO.MDB;"                          
                                      L"DefaultDir=;"                              
                                      L"UID=admin;PWD=;" ); 
_bstr_t    bstrOpenAccess           ( L"SELECT * FROM Authors" ); 
_bstr_t    bstrOpenAccessWithParam  ( L"SELECT * FROM Authors WHERE Au_ID < ?" ); 
_bstr_t    bstrSQLCreate            ( L"create proc sp_AdoTest( @InParam int, @OutParam int OUTPUT ) " 
                                      L"as "  
                                      L"select @OutParam = @InParam + 10SELECT * FROM Authors WHERE "   
                                      L"State <> 'CA' "  
                                      L"return @OutParam +10" ); 
_bstr_t    bstrSQLDrop              ( L"if exists "  
                                      L"(select * from sysobjects where "  
                                      L"id = object_id('dbo.sp_AdoTest') and " 
                                      L"sysstat & 0xf = 4)"  
                                      L"drop procedure dbo.sp_AdoTest" ); 
_bstr_t    bstrStoredProc           ( L"sp_Adotest" ); 
 
CString GetPropertyAttributes( PropertyAttributesEnum e ) 
{ 
   CString strTmp(""); 
 
   if ( e & adPropNotSupported)  strTmp += "NotSupported "; 
   if ( e & adPropRequired)      strTmp += "Required "; 
   if ( e & adPropOptional)      strTmp += "Optional "; 
   if ( e & adPropRead)          strTmp += "Read "; 
   if ( e & adPropWrite)         strTmp += "Write "; 
 
   return strTmp; 
} 
 
 
CString GetType( int e ) 
{ 
   CString strTmp; 
 
   switch( e ) 
   { 
   case adBigInt: 
      strTmp = "(adBigInt) An 8-byte signed integer"; 
      break; 
   case adBinary: 
      strTmp = "(adBinary) A binary value"; 
      break; 
   case adBoolean: 
      strTmp = "(adBoolean) A Boolean value"; 
      break; 
   case adBSTR: 
      strTmp = "(adBSTR) A null-terminated character string (Unicode)"; 
      break; 
   case adChar: 
      strTmp = "(adChar) A String value"; 
      break; 
   case adCurrency: 
      strTmp = "(adCurrency) A currency value (8-byte signed integer scaled by 10,000)"; 
      break; 
   case adDate: 
      strTmp = "(adDate) A Date value"; 
      break; 
   case adDBDate: 
      strTmp = "(adDBDate) A date value (yyyymmdd)"; 
      break; 
   case adDBTime: 
      strTmp = "(adDBTime) A time value (hhmmss)"; 
      break; 
   case adDBTimeStamp: 
      strTmp = "(adDBTimeStamp) A date-time stamp (yyyymmddhhmmss plus a fraction in billionths)"; 
      break; 
   case adDecimal: 
      strTmp = "(adDecimal) An exact numeric value with a fixed precision and scale"; 
      break; 
   case adDouble: 
      strTmp = "(adDouble) A double-precision floating point value"; 
      break; 
   case adEmpty: 
      strTmp = "(adEmpty) No value was specified"; 
      break; 
   case adError: 
      strTmp = "(adError) A 32-bit Error code"; 
      break; 
   case adGUID: 
      strTmp = "(adGUID) A globally unique identifier (GUID)"; 
      break; 
   case adIDispatch: 
      strTmp = "(adIDispatch) A pointer to an IDispatch interface on an OLE object"; 
      break; 
   case adInteger: 
      strTmp = "(adInteger) A 4-byte signed integer"; 
      break; 
   case adIUnknown: 
      strTmp = "(adIUnknown) A pointer to an IUnknown interface on an OLE object"; 
      break; 
   case adLongVarBinary: 
      strTmp = "(adLongVarBinary) A long binary value (Parameter object only)"; 
      break; 
   case adLongVarChar: 
      strTmp = "(adLongVarChar) A long String value (Parameter object only)"; 
      break; 
   case adLongVarWChar: 
      strTmp = "(adLongVarWChar) A long null-terminated string value (Parameter object only)"; 
      break; 
   case adNumeric: 
      strTmp = "(adNumeric) An exact numeric value with a fixed precision and scale"; 
      break; 
   case adSingle: 
      strTmp = "(adSingle) A single-precision floating point value"; 
      break; 
   case adSmallInt: 
      strTmp = "(adSmallInt) A 2-byte signed integer"; 
      break; 
   case adTinyInt: 
      strTmp = "(adTinyInt) A 1-byte signed integer"; 
      break; 
   case adUnsignedBigInt: 
      strTmp = "(adUnsignedBigInt) An 8-byte unsigned integer"; 
      break; 
   case adUnsignedInt: 
      strTmp = "(adUnsignedInt) A 4-byte unsigned integer"; 
      break; 
   case adUnsignedSmallInt: 
      strTmp = "(adUnsignedSmallInt) A 2-byte unsigned integer"; 
      break; 
   case adUnsignedTinyInt: 
      strTmp = "(adUnsignedTinyInt) A 1-byte unsigned integer"; 
      break; 
   case adUserDefined: 
      strTmp = "(adUserDefined) A user-defined variable"; 
      break; 
   case adVarBinary: 
      strTmp = "(adVarBinary) A binary value (Parameter object only)"; 
      break; 
   case adVarChar: 
      strTmp = "(adVarChar) A String value (Parameter object only)"; 
      break; 
   case adVariant: 
      strTmp = "(adVariant) An OLE Automation Variant"; 
      break; 
   case adVarWChar: 
      strTmp = "(adVarWChar) A null-terminated Unicode character string (Parameter object only)"; 
      break; 
   case adWChar: 
      strTmp = "(adWChar) A null-terminated Unicode character string"; 
      break; 
   default:    
      strTmp.Format( "%d = = Unrecognized Type", e ); 
   } 
    
   return strTmp; 
} 
 
///////////////////////////////////////////////////////////////////////////// 
//  
// CrackStrVariant()  Taken from the CCrack::strVariant method found in the 
//      DAOVIEW sample that ships with Visual C++ 4.X/5.0 
//   
// Parameters:  var - Reference to an instance of COleVariant. 
// 
// Returns:     An instance of CString with the value of COleVariant  
//              (if possible).  Otherwise a string containing the type  
//              of data contained by COleVariant. 
// 
///////////////////////////////////////////////////////////////////////////// 
 
CString CrackStrVariant(const _variant_t&  var) 
{ 
    CString strRet; 
    strRet = _T("Fish"); 
    switch(var.vt){ 
        case VT_EMPTY: 
        case VT_NULL: 
            strRet = _T("NULL"); 
            break; 
        case VT_I2: 
            strRet.Format(_T("%hd"),V_I2(&var)); 
            break; 
        case VT_I4: 
            strRet.Format(_T("%d"),V_I4(&var)); 
            break; 
        case VT_R4: 
            strRet.Format(_T("%e"),(double)V_R4(&var)); 
            break; 
        case VT_R8: 
            strRet.Format(_T("%e"),V_R8(&var)); 
            break; 
        case VT_CY: 
            strRet = COleCurrency(var).Format(); 
            break; 
        case VT_DATE: 
            strRet = COleDateTime(var).Format(_T("%m %d %y")); 
            break; 
        case VT_BSTR: 
            strRet = V_BSTR( &var ); 
            break; 
        case VT_DISPATCH: 
            strRet = _T("VT_DISPATCH"); 
            break; 
        case VT_ERROR: 
            strRet = _T("VT_ERROR"); 
            break; 
        case VT_BOOL: 
            return ( V_BOOL(&var) ? _T("TRUE") : _T("FALSE")); 
        case VT_VARIANT: 
            strRet = _T("VT_VARIANT"); 
            break; 
        case VT_UNKNOWN: 
            strRet = _T("VT_UNKNOWN"); 
            break; 
        case VT_I1: 
            strRet = _T("VT_I1"); 
            break; 
        case VT_UI1: 
            strRet.Format(_T("0x%02hX"),(unsigned short)V_UI1(&var)); 
            break; 
        case VT_UI2: 
            strRet = _T("VT_UI2"); 
            break; 
        case VT_UI4: 
            strRet = _T("VT_UI4"); 
            break; 
        case VT_I8: 
            strRet = _T("VT_I8"); 
            break; 
        case VT_UI8: 
            strRet = _T("VT_UI8"); 
            break; 
        case VT_INT: 
            strRet = _T("VT_INT"); 
            break; 
        case VT_UINT: 
            strRet = _T("VT_UINT"); 
            break; 
        case VT_VOID: 
            strRet = _T("VT_VOID"); 
            break; 
        case VT_HRESULT: 
            strRet = _T("VT_HRESULT"); 
            break; 
        case VT_PTR: 
            strRet = _T("VT_PTR"); 
            break; 
        case VT_SAFEARRAY: 
            strRet = _T("VT_SAFEARRAY"); 
            break; 
        case VT_CARRAY: 
            strRet = _T("VT_CARRAY"); 
            break; 
        case VT_USERDEFINED: 
            strRet = _T("VT_USERDEFINED"); 
            break; 
        case VT_LPSTR: 
            strRet = _T("VT_LPSTR"); 
            break; 
        case VT_LPWSTR: 
            strRet = _T("VT_LPWSTR"); 
            break; 
        case VT_FILETIME: 
            strRet = _T("VT_FILETIME"); 
            break; 
        case VT_BLOB: 
            strRet = _T("VT_BLOB"); 
            break; 
        case VT_STREAM: 
            strRet = _T("VT_STREAM"); 
            break; 
        case VT_STORAGE: 
            strRet = _T("VT_STORAGE"); 
            break; 
        case VT_STREAMED_OBJECT: 
            strRet = _T("VT_STREAMED_OBJECT"); 
            break; 
        case VT_STORED_OBJECT: 
            strRet = _T("VT_STORED_OBJECT"); 
            break; 
        case VT_BLOB_OBJECT: 
            strRet = _T("VT_BLOB_OBJECT"); 
            break; 
        case VT_CF: 
            strRet = _T("VT_CF"); 
            break; 
        case VT_CLSID: 
            strRet = _T("VT_CLSID"); 
            break; 
    } 
    WORD vt = var.vt; 
    if(vt & VT_ARRAY){ 
        vt = vt & ~VT_ARRAY; 
        strRet = _T("Array of "); 
    } 
    if(vt & VT_BYREF){ 
        vt = vt & ~VT_BYREF; 
        strRet += _T("Pointer to "); 
    } 
    if(vt != var.vt){ 
        switch(vt){ 
            case VT_EMPTY: 
                strRet += _T("VT_EMPTY"); 
                break; 
            case VT_NULL: 
                strRet += _T("VT_NULL"); 
                break; 
            case VT_I2: 
                strRet += _T("VT_I2"); 
                break; 
            case VT_I4: 
                strRet += _T("VT_I4"); 
                break; 
            case VT_R4: 
                strRet += _T("VT_R4"); 
                break; 
            case VT_R8: 
                strRet += _T("VT_R8"); 
                break; 
            case VT_CY: 
                strRet += _T("VT_CY"); 
                break; 
            case VT_DATE: 
                strRet += _T("VT_DATE"); 
                break; 
            case VT_BSTR: 
                strRet += _T("VT_BSTR"); 
                break; 
            case VT_DISPATCH: 
                strRet += _T("VT_DISPATCH"); 
                break; 
            case VT_ERROR: 
                strRet += _T("VT_ERROR"); 
                break; 
            case VT_BOOL: 
                strRet += _T("VT_BOOL"); 
                break; 
            case VT_VARIANT: 
                strRet += _T("VT_VARIANT"); 
                break; 
            case VT_UNKNOWN: 
                strRet += _T("VT_UNKNOWN"); 
                break; 
            case VT_I1: 
                strRet += _T("VT_I1"); 
                break; 
            case VT_UI1: 
                strRet += _T("VT_UI1"); 
                break; 
            case VT_UI2: 
                strRet += _T("VT_UI2"); 
                break; 
            case VT_UI4: 
                strRet += _T("VT_UI4"); 
                break; 
            case VT_I8: 
                strRet += _T("VT_I8"); 
                break; 
            case VT_UI8: 
                strRet += _T("VT_UI8"); 
                break; 
            case VT_INT: 
                strRet += _T("VT_INT"); 
                break; 
            case VT_UINT: 
                strRet += _T("VT_UINT"); 
                break; 
            case VT_VOID: 
                strRet += _T("VT_VOID"); 
                break; 
            case VT_HRESULT: 
                strRet += _T("VT_HRESULT"); 
                break; 
            case VT_PTR: 
                strRet += _T("VT_PTR"); 
                break; 
            case VT_SAFEARRAY: 
                strRet += _T("VT_SAFEARRAY"); 
                break; 
            case VT_CARRAY: 
                strRet += _T("VT_CARRAY"); 
                break; 
            case VT_USERDEFINED: 
                strRet += _T("VT_USERDEFINED"); 
                break; 
            case VT_LPSTR: 
                strRet += _T("VT_LPSTR"); 
                break; 
            case VT_LPWSTR: 
                strRet += _T("VT_LPWSTR"); 
                break; 
            case VT_FILETIME: 
                strRet += _T("VT_FILETIME"); 
                break; 
            case VT_BLOB: 
                strRet += _T("VT_BLOB"); 
                break; 
            case VT_STREAM: 
                strRet += _T("VT_STREAM"); 
                break; 
            case VT_STORAGE: 
                strRet += _T("VT_STORAGE"); 
                break; 
            case VT_STREAMED_OBJECT: 
                strRet += _T("VT_STREAMED_OBJECT"); 
                break; 
            case VT_STORED_OBJECT: 
                strRet += _T("VT_STORED_OBJECT"); 
                break; 
            case VT_BLOB_OBJECT: 
                strRet += _T("VT_BLOB_OBJECT"); 
                break; 
            case VT_CF: 
                strRet += _T("VT_CF"); 
                break; 
            case VT_CLSID: 
                strRet += _T("VT_CLSID"); 
                break; 
        } 
    } 
    return strRet; 
} 
 
 
 
 
 
 
 
class CAboutDlg : public CDialog 
{ 
public: 
	CAboutDlg(); 
 
// Dialog Data 
	//{{AFX_DATA(CAboutDlg) 
	enum { IDD = IDD_ABOUTBOX }; 
	//}}AFX_DATA 
 
	// ClassWizard generated virtual function overrides 
	//{{AFX_VIRTUAL(CAboutDlg) 
	protected: 
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support 
	//}}AFX_VIRTUAL 
 
// Implementation 
protected: 
	//{{AFX_MSG(CAboutDlg) 
	//}}AFX_MSG 
	DECLARE_MESSAGE_MAP() 
}; 
 
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 
{ 
	//{{AFX_DATA_INIT(CAboutDlg) 
	//}}AFX_DATA_INIT 
} 
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAboutDlg) 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
	//{{AFX_MSG_MAP(CAboutDlg) 
		// No message handlers 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CImportDlg dialog 
 
CImportDlg::CImportDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CImportDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CImportDlg) 
	m_sdatasource = _T(""); 
	m_sfilename = _T(""); 
	m_status = _T(""); 
	m_sUserID = _T(""); 
	m_sPassword = _T(""); 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 
 
void CImportDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CImportDlg) 
	DDX_Text(pDX, IDC_DATASOURCE, m_sdatasource); 
	DDX_Text(pDX, IDC_FILENAME, m_sfilename); 
	DDX_Text(pDX, IDC_STATUS, m_status); 
	DDX_Text(pDX, IDC_USERID, m_sUserID); 
	DDX_Text(pDX, IDC_PASSWORD, m_sPassword); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CImportDlg, CDialog) 
	//{{AFX_MSG_MAP(CImportDlg) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_BN_CLICKED(IDC_IMPORT, OnImport) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CImportDlg message handlers 
 
BOOL CImportDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
	::CoInitialize(NULL); 
 
	// Add "About..." menu item to system menu. 
 
	// IDM_ABOUTBOX must be in the system command range. 
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
	ASSERT(IDM_ABOUTBOX < 0xF000); 
 
	CMenu* pSysMenu = GetSystemMenu(FALSE); 
	if (pSysMenu != NULL) 
	{ 
		CString strAboutMenu; 
		strAboutMenu.LoadString(IDS_ABOUTBOX); 
		if (!strAboutMenu.IsEmpty()) 
		{ 
			pSysMenu->AppendMenu(MF_SEPARATOR); 
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
		} 
	} 
 
	// Set the icon for this dialog.  The framework does this automatically 
	//  when the application's main window is not a dialog 
	SetIcon(m_hIcon, TRUE);			// Set big icon 
	SetIcon(m_hIcon, FALSE);		// Set small icon 
	 
	// TODO: Add extra initialization here 
	 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
void CImportDlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
	if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
	{ 
		CAboutDlg dlgAbout; 
		dlgAbout.DoModal(); 
	} 
	else 
	{ 
		CDialog::OnSysCommand(nID, lParam); 
	} 
} 
 
// If you add a minimize button to your dialog, you will need the code below 
//  to draw the icon.  For MFC applications using the document/view model, 
//  this is automatically done for you by the framework. 
 
void CImportDlg::OnPaint()  
{ 
	if (IsIconic()) 
	{ 
		CPaintDC dc(this); // device context for painting 
 
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 
 
		// Center icon in client rectangle 
		int cxIcon = GetSystemMetrics(SM_CXICON); 
		int cyIcon = GetSystemMetrics(SM_CYICON); 
		CRect rect; 
		GetClientRect(&rect); 
		int x = (rect.Width() - cxIcon + 1) / 2; 
		int y = (rect.Height() - cyIcon + 1) / 2; 
 
		// Draw the icon 
		dc.DrawIcon(x, y, m_hIcon); 
	} 
	else 
	{ 
		CDialog::OnPaint(); 
	} 
} 
 
// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR CImportDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
void CImportDlg::OnImport()  
{ 
	// TODO: Add your control notification handler code here 
	UpdateData(TRUE); 
	ByteImport x( (LPTSTR)(LPCTSTR)m_sfilename); 
	if( !x.IsFileopen() ) 
	{ 
		UpdateData( FALSE ); 
		return; 
	} 
	CString strTmp; 
   /* strTmp.Format( "driver={sql server};" 
                           "server=%s;" 
                           "Database=%s;""UID=%s;""PWD=%s;", 
                           m_server,m_sdatasource,m_sUserID,m_sPassword );*/ 
 
	strTmp.Format( "dsn=%s;""UID=%s;""PWD=%s;",m_sdatasource,m_sUserID,m_sPassword ); 
    _bstr_t         bstrSQLServerConnect; 
	_bstr_t bstrProc =( L"sp_StartByteImport" );; 
	_variant_t Final; 
     bstrSQLServerConnect = (LPCTSTR) strTmp; 
	m_status="Empty File"; 
	_ConnectionPtr  Conn1; 
    _CommandPtr     Cmd1; 
    _RecordsetPtr   Rs1; 
	bool            bvalid = false; 
	_bstr_t bstrProc2 ="sp_AddAccountingInfo"; 
	try 
    { 
	  	Conn1.CreateInstance( __uuidof( Connection ) ); 
		Conn1->ConnectionString = bstrSQLServerConnect; 
		Conn1->Open( bstrEmpty, bstrEmpty, bstrEmpty ); 
		Cmd1.CreateInstance( __uuidof( Command ) ); 
		Cmd1->ActiveConnection = Conn1; 
		Cmd1->CommandText      = _bstr_t( bstrProc ); 
		Cmd1->CommandType      = adCmdStoredProc; 
		Cmd1->Parameters->Refresh(); 
		Cmd1->Parameters->Item[ _variant_t( (long) 1 ) ]->Value = _variant_t( (LPCTSTR)m_sfilename ); 
		Rs1 = Cmd1->Execute( &vtEmpty, &vtEmpty2, adCmdUnknown ); 
		bvalid = true; 
		Final = Rs1->Fields->GetItem( _variant_t( 0L ) )->Value; 
		strTmp.Format( "%s", CrackStrVariant( Final) ); 
    } 
    catch( CException *e ) 
    { 
		TCHAR    szCause[255];     
        e->GetErrorMessage(szCause, 255); 
		m_status=szCause; 
    } 
    catch( _com_error &e ) 
    { 
		m_status=e.ErrorMessage( ); 
    } 
    catch(...) 
    { 
		m_status="Error while executing the Import"; 
 
    } 
 
	while ( x.next() && bvalid) 
	{ 
		if ( x.isValidRecord() ) 
		{ 
			try 
			{ 
				Cmd1->CommandText      = bstrProc2; 
				Cmd1->CommandType      = adCmdStoredProc; 
				Cmd1->Parameters->Refresh(); 
				Cmd1->Parameters->Item[ _variant_t( (long) 1 ) ]->Value = Final; 
				Cmd1->Parameters->Item[ _variant_t( (long) 2 ) ]->Value = _variant_t( (LPCTSTR)x.pcDate ); 
				Cmd1->Parameters->Item[ _variant_t( (long) 3 ) ]->Value = _variant_t( (LPCTSTR)x.pcURL ); 
				Cmd1->Parameters->Item[ _variant_t( (long) 4 ) ]->Value = _variant_t( (LPCTSTR)x.pcTop ); 
				Cmd1->Parameters->Item[ _variant_t( (long) 5 ) ]->Value = _variant_t( (LPCTSTR)x.pcQueryString ); 
				Cmd1->Parameters->Item[ _variant_t( (long) 6 ) ]->Value = _variant_t( (long)x.pcBytes ); 
				Cmd1->Parameters->Item[ _variant_t( (long) 7 ) ]->Value = _variant_t( (long)x.pcRequests ); 
				Cmd1->Execute( &vtEmpty, &vtEmpty2, adCmdUnknown ); 
				m_status.Format("Elapsed Time %d second(s) for %d records",x.ElapsedTime(),x.GetRecordCount()); 
 
			} 
			catch( CException *e ) 
			{ 
				TCHAR    szCause[255];     
				e->GetErrorMessage(szCause, 255); 
				m_status=szCause; 
			} 
			catch( _com_error &e ) 
			{ 
				m_status=e.ErrorMessage( ); 
			} 
			catch(...) 
			{ 
				m_status="Error while executing the Import"; 
 
			} 
			 
		} 
		else 
		{ 
			m_status.Format(" %d bad records out of %d records",x.GetErrorCount(),x.GetRecordCount()); 
		} 
	} 
	UpdateData(FALSE); 
    if( Rs1                != NULL )  Rs1->Close();    
    if( Conn1              != NULL )  Conn1->Close();  
	Rs1 = Conn1 = NULL; 
 
} 
 
void CImportDlg::OnOK()  
{ 
	// TODO: Add extra validation here 
	::CoUninitialize(); 
 
	CDialog::OnOK(); 
}