⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lobdlg.cpp

📁 C++OCI,针对8.0.4以上的数据库
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// LOBDlg.cpp : implementation file
//

#include "stdafx.h"
#include "LOB.h"
#include "LOBDlg.h"
#include "direct.h"

#include "OraBase.h"
#include "Error.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

UINT InsertUnNull(LPVOID lpParam);
struct MyThreadData sThreadData;
/////////////////////////////////////////////////////////////////////////////
// CLOBDlg dialog

CLOBDlg::CLOBDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CLOBDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CLOBDlg)
	m_strTempDir = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CLOBDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CLOBDlg)
	DDX_Text(pDX, IDC_LOBDIR, m_strTempDir);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CLOBDlg, CDialog)
	//{{AFX_MSG_MAP(CLOBDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_LOGON, OnLogon)
	ON_BN_CLICKED(IDC_INSERT, OnInsert)
	ON_BN_CLICKED(IDC_BROWS, OnBrows)
	ON_BN_CLICKED(IDC_READLOB, OnReadlob)
	ON_BN_CLICKED(IDC_TEST, OnTest)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLOBDlg message handlers

BOOL CLOBDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// 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
	CListCtrl *pList = (CListCtrl *)GetDlgItem(IDC_LIST2);
	pList->SetExtendedStyle(pList->GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT); 
	pList->InsertColumn(0, "序号", LVCFMT_LEFT, 40);
	pList->InsertColumn(1, "信息", LVCFMT_LEFT,400);
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

// 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 CLOBDlg::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 CLOBDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

//录入LOB数据
void CLOBDlg::OnOK() 
{
	CString m_sPicNames;
	m_sPicNames = "f:\\abc.jpg;";
	CString NameTmp = m_sPicNames;
			NameTmp.TrimLeft();
			NameTmp.TrimRight();
			NameTmp.TrimLeft(';');
			NameTmp.TrimRight(';');

	int m_nPicNum=1;
	for(int k=0; k<m_nPicNum; k++)
	{
		int nPos = NameTmp.Find(";");
		CString ss;
		if(nPos>0)
		{
			ss = NameTmp.Left(nPos);
			NameTmp = NameTmp.Mid(nPos+1);
		}
		else{
			ss = NameTmp;
		}
	}

	//获得某个目录下的所有正常的文件名
	UpdateData(TRUE);
	if(m_strTempDir.IsEmpty())
	{
		MessageBox("没有指定数据文件存放的目录。", "提示", MB_OK|MB_ICONINFORMATION);
		return ;
	}

	char szDirArr[256];
	memset(szDirArr, 0, 256);
	try
	{
		strcpy(szDirArr, m_strTempDir.GetBuffer(m_strTempDir.GetLength()));
		m_strTempDir.ReleaseBuffer();
	}
	catch(CMemoryException *e)
	{
		e->ReportError();
		e->Delete();
		return ;
	}
	strcat(szDirArr, "*.*"); //形成搜索路径

	//定义搜索对象
	CFileFind oFF;
	if(!oFF.FindFile((LPCTSTR)szDirArr, 0))
	{
		MessageBox("指定的目录下没有数据文件", "提示", MB_OK|MB_ICONINFORMATION);
		return ;
	}

	//搜索文件
	CString strFileName;
	int nCount = 0;
	int rc = 0;
	while(oFF.FindNextFile())
	{
		if(!oFF.IsDirectory() && 
		   !oFF.IsDots() && 
		   !oFF.IsHidden() &&
		   !oFF.IsTemporary() &&
		   !oFF.IsSystem())
		{
			//把该文件写入数据库中
			strFileName = oFF.GetFilePath(); 
            rc = WriteDataToLOB(strFileName, m_oOCIBase.m_hOCI, nCount);
			nCount ++;
		}
	}	
}

void CLOBDlg::OnLogon() 
{
	UpdateData(TRUE);

	bool bVersion = true;
    CButton *pctrlButt = (CButton *)GetDlgItem(IDC_V733);
    if(1 == pctrlButt->GetCheck())
		bVersion = false;

	pctrlButt = (CButton *)GetDlgItem(IDC_V8I);
	if(1 == pctrlButt->GetCheck())
		bVersion = true;

	CEdit *pctrlEdit = (CEdit *)GetDlgItem(IDC_USER);
	char szUIDArr[256];
	memset(szUIDArr, 0, 256); //用户名
	pctrlEdit->GetWindowText((LPTSTR)szUIDArr, 256);
	
	char szPWDArr[256];
	memset(szPWDArr, 0, 256); //密码
	pctrlEdit = (CEdit *)GetDlgItem(IDC_PWD);
    pctrlEdit->GetWindowText((LPTSTR)szPWDArr, 256);

	char szHostArr[256];
	memset(szHostArr, 0, 256);//服务名
	pctrlEdit = (CEdit *)GetDlgItem(IDC_SVC);
    pctrlEdit->GetWindowText((LPTSTR)szHostArr, 256);

	char szPortArr[256];
	memset(szPortArr, 0, 256);//服务器端口
	pctrlEdit = (CEdit *)GetDlgItem(IDC_PORT);
    pctrlEdit->GetWindowText((LPTSTR)szPortArr, 256);

    int rc = 0;
	if(bVersion)
	{
		rc = m_oOCIBase.OCIInit(); //初始化OCI环境
	}
    
//	rc = m_oOCIBase.OCILogin(szHostArr, szPortArr, szUIDArr, szPWDArr, bVersion); 
	rc = m_oOCIBase.OCILogin("trs", "", "system", "manager", bVersion); 
	if(GW_SUCCESS == rc)
	{
		pctrlButt = (CButton *)GetDlgItem(IDC_INFO);
		pctrlButt->SetWindowText("登录成功!"); 
	}

	//关闭OCI环境
	//m_oOCIBase.OCITerminateProcMemory(); 
	
	UpdateData(FALSE);	
}

void CLOBDlg::OnInsert() 
{
	CButton *pctrlButt = (CButton *)GetDlgItem(IDC_INFO);
	char szInfoStrArr[256];
	char szErrInfoArr[512];
	int nErrCode = 0; //错误号
    int rc = 0;

	//SQL语句
	char szSQLArr[1000];  //普通的SQL语句
	int i = 0;
	DWORD dwStart = GetTickCount();
	for(i = 0; i < 6; i++)  //6000万的数据 60000000
	{
		UpdateData(TRUE);
		sprintf(szInfoStrArr, "Oracle正在处理第 %d 条记录,请等候…", i);
		pctrlButt->SetWindowText(szInfoStrArr);
		UpdateData(FALSE);
		memset(szSQLArr, 0, 1000);
		sprintf(szSQLArr, "INSERT INTO lu_1(id, str) VALUES(%d, '%s')", i, szInfoStrArr);
		rc = OCIStmtPrepare(m_oOCIBase.m_hOCI.phStmt,
		                    m_oOCIBase.m_hOCI.phErr,
						    (text *)szSQLArr,
						    (ub4)strlen((char *)szSQLArr),
						    (ub4) OCI_NTV_SYNTAX, 
	  				        (ub4) OCI_DEFAULT);
		if(OCI_SUCCESS != rc)
		{
			//获取错误信息
			m_oOCIBase.GetOCIErrInfo(m_oOCIBase.m_hOCI.phErr, nErrCode, szInfoStrArr, 256);
			sprintf(szErrInfoArr,"\n在取临时表的记录时,无法解释SQL语句,错误号ORA-%d;错误信息为:%s\n", nErrCode, szInfoStrArr);
			pctrlButt->SetWindowText(szErrInfoArr);
			UpdateData(FALSE);
			return ;
		}
		rc = OCIStmtExecute(m_oOCIBase.m_hOCI.phService,
			                m_oOCIBase.m_hOCI.phStmt,
			                m_oOCIBase.m_hOCI.phErr,
			                (ub4)1,
			                (ub4)0,
			                (CONST OCISnapshot*)0,
			                (OCISnapshot *)0,
			                (ub4)OCI_DEFAULT);
		if(OCI_SUCCESS != rc && OCI_SUCCESS_WITH_INFO != rc )
		{
			//获取错误信息
			m_oOCIBase.GetOCIErrInfo(m_oOCIBase.m_hOCI.phErr, nErrCode, szInfoStrArr, 256);
			sprintf(szErrInfoArr,"\n在取临时表的记录时,无法解释SQL语句,错误号ORA-%d;错误信息为:%s\n", nErrCode, szInfoStrArr);
			pctrlButt->SetWindowText(szErrInfoArr);
			UpdateData(FALSE);
			return ;
		}
		//if(0 == (i % 20000) || 59999999 == i) //没20000一提交事务
		//{
			rc = OCITransCommit(m_oOCIBase.m_hOCI.phService, m_oOCIBase.m_hOCI.phErr, (ub4) 0);
			if(OCI_SUCCESS != rc && OCI_SUCCESS_WITH_INFO != rc )
			{
				//获取错误信息
				m_oOCIBase.GetOCIErrInfo(m_oOCIBase.m_hOCI.phErr, nErrCode, szInfoStrArr, 256);
				sprintf(szErrInfoArr,"\n在取临时表的记录时,无法解释SQL语句,错误号ORA-%d;错误信息为:%s\n", nErrCode, szInfoStrArr);
				pctrlButt->SetWindowText(szErrInfoArr);
				UpdateData(FALSE);
				return ;
			}
		//}
		if(0 == (i + 1) % 1000000)
		{
			sprintf(szInfoStrArr, "处理100万条记录,耗时:%d 毫秒", GetTickCount() - dwStart);
			pctrlButt->SetWindowText(szInfoStrArr);
			UpdateData(FALSE);
		}
		Sleep(400);//----lu 2003-06-02
	} //循环结束
	rc = OCITransCommit(m_oOCIBase.m_hOCI.phService, m_oOCIBase.m_hOCI.phErr, (ub4) 0);
	sprintf(szInfoStrArr, "处理 %d 条记录,共耗时:%d 毫秒,循环结束!", i, GetTickCount() - dwStart);
	pctrlButt->SetWindowText(szInfoStrArr);
	UpdateData(FALSE);
}

void CLOBDlg::OnBrows() 
{
	LPITEMIDLIST lpItemIdList = NULL;
	char szDirArr[MAX_PATH +1];
	memset(szDirArr, 0, MAX_PATH + 1);
	
	BROWSEINFO stuBI;       //浏览结构信息
	stuBI.hwndOwner = NULL;
	stuBI.pidlRoot = NULL;
	stuBI.pszDisplayName = (LPTSTR)szDirArr;
	stuBI.lpszTitle = "选择目录:";
	stuBI.ulFlags = BIF_RETURNONLYFSDIRS;
	stuBI.lpfn = NULL;
	stuBI.lParam = NULL;
    lpItemIdList = SHBrowseForFolder(&stuBI);
	if(NULL == lpItemIdList)
	{
		MessageBox("没有指定暂时存放数据的目录!", "提示", MB_OK|MB_ICONINFORMATION);
		memset(szDirArr, 0, MAX_PATH + 1);
		if(0 == GetTempPath(MAX_PATH, szDirArr))
		{
			MessageBox("无法自动选择系统指定的临时目录!", "提示", MB_OK|MB_ICONSTOP);
			return ;
		}
	}
	else
	{		
		if(!SHGetPathFromIDList(lpItemIdList, szDirArr))
		{
			MessageBox("无法选择目录", "提示", MB_OK|MB_ICONSTOP);
			GlobalFree(lpItemIdList);
			return ;
		}
		GlobalFree(lpItemIdList);
	}
	m_strTempDir = szDirArr;
	int nLen = m_strTempDir.GetLength();
	if('\\' != m_strTempDir.GetAt(nLen - 1))
		m_strTempDir += '\\';
	UpdateData(FALSE);
}

//读出LOB数据
void CLOBDlg::OnReadlob() 
{
	//获得某个目录
	UpdateData(TRUE);
	if(m_strTempDir.IsEmpty())
	{
		MessageBox("没有指定数据文件存放的目录。", "提示", MB_OK|MB_ICONINFORMATION);
		return ;
	}

	char szDirArr[256];
	memset(szDirArr, 0, 256);
	try
	{
		strcpy(szDirArr, m_strTempDir.GetBuffer(m_strTempDir.GetLength()));
		m_strTempDir.ReleaseBuffer();
		strcat(szDirArr, "read\\");
		//创建目录
		_mkdir(szDirArr);
	}
	catch(CMemoryException *e)
	{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -