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();
}