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

📄 odbcsqlview.cpp

📁 经典C++书籍钱能C++书籍例子代码实例
💻 CPP
字号:
// odbcsqlView.cpp : implementation of the COdbcsqlView class
//

#include "stdafx.h"
#include "odbcsql.h"

#include "odbcsqlDoc.h"
#include "odbcsqlView.h"


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

/////////////////////////////////////////////////////////////////////////////
// COdbcsqlView

IMPLEMENT_DYNCREATE(COdbcsqlView, CFormView)

BEGIN_MESSAGE_MAP(COdbcsqlView, CFormView)
	//{{AFX_MSG_MAP(COdbcsqlView)
	ON_BN_CLICKED(IDC_RECORD_FIRST, OnRecordFirst)
	ON_BN_CLICKED(IDC_RECORD_LAST, OnRecordLast)
	ON_BN_CLICKED(IDC_RECORD_NEXT, OnRecordNext)
	ON_BN_CLICKED(IDC_RECORD_PREV, OnRecordPrev)
	ON_BN_CLICKED(IDC_SQL_OK, OnSqlOk)
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDC_RECORD_PLAY, OnRecordPlay)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COdbcsqlView construction/destruction

COdbcsqlView::COdbcsqlView()
	: CFormView(COdbcsqlView::IDD)
{
	//{{AFX_DATA_INIT(COdbcsqlView)
	m_id = 0;
	m_name = _T("");
	m_position = _T("");
	m_singer = _T("");
	m_writer = _T("");
	m_sql = "Select * from Table1";//_T("");
	m_item1 = _T("");
	m_item2 = _T("");
	m_item3 = _T("");
	m_item4 = _T("");
	m_item5 = _T("");
	//}}AFX_DATA_INIT

	m_set=NULL;

	m_NKey=0;
	m_DSOK=TRUE;

	m_Query="Select * from Table1";

}

COdbcsqlView::~COdbcsqlView()
{	  if(m_set != NULL)delete m_set;
}

void COdbcsqlView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(COdbcsqlView)
	DDX_Text(pDX, IDC_EDIT_ID, m_id);
	DDX_Text(pDX, IDC_EDIT_NAME, m_name);
	DDX_Text(pDX, IDC_EDIT_POSITION, m_position);
	DDX_Text(pDX, IDC_EDIT_SINGER, m_singer);
	DDX_Text(pDX, IDC_EDIT_WRITER, m_writer);
	DDX_Text(pDX, IDC_EDIT_SQL, m_sql);
	DDX_Text(pDX, IDC_ITEM1, m_item1);
	DDX_Text(pDX, IDC_ITEM2, m_item2);
	DDX_Text(pDX, IDC_ITEM3, m_item3);
	DDX_Text(pDX, IDC_ITEM4, m_item4);
	DDX_Text(pDX, IDC_ITEM5, m_item5);
	//}}AFX_DATA_MAP
}

BOOL COdbcsqlView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CFormView::PreCreateWindow(cs);
}

void COdbcsqlView::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();
	GetParentFrame()->RecalcLayout();
	ResizeParentToFit();
	//注册数据源
	
	 if(m_set==NULL)
	{
        if(!SQLConfigDataSource(
			NULL,                             //父窗口指针;
	        ODBC_ADD_DSN,                     //请求的类型;
			"Microsoft Access Driver (*.mdb)",//驱动程序名;属性:
            "DSN=msong\0"                     //数据源名称;
            "Description=dbdata  database\0"  //数据源的说明;
            "FileType=Microsoft Access\0"     //数据源文件类型说明;
			"DBQ=song.mdb\0"        //数据源文件全路径名;
            "MaxScanRows=8\0"  //在根据现有数据设置列的数据类型时所要扫描的行数。
							   //可以为 1 到 16,默认值为 8;如果设置为 0,
							   //将扫描所有行。如果数字超出界限,会返回一个错误 
     		))
		{
			AfxMessageBox("无法创建数据源!");
			m_DSOK=FALSE;
			return;
		}

		m_set=new CRecordset(&m_Db);
		if (!m_Db.OpenEx(_T("DSN=msong"),0))
		{
			AfxMessageBox("你选择了取消");
			return;
		}
	
		m_set->Open( CRecordset::dynaset, _T(m_Query));
       //数据源注册完毕
      
	   ReadDisplayFields(); //读出并显示数据库字段名
	   //2.添加行
	  if(m_set->IsEOF())
	  {
		AfxMessageBox("当前视图没有记录!");
		return;
	  }

	  m_set-> MoveFirst();
	 // GetDlgItem(IDC_EDIT_ID)->EnableWindow(true);
	  ReadDispalyRecord();
	 //	OnSetItemReadOnly(true);
	  UpdateData(false);
	}
}

void  COdbcsqlView::ReadDisplayFields(void)
 {	short i, nFields;
	CODBCFieldInfo Fi;
	nFields=m_set->GetODBCFieldCount();
	for(i=0;i<nFields;i++)
	{
		m_set->GetODBCFieldInfo(i,Fi);
	   	if(i==0)m_item1= Fi.m_strName;
		if(i==1)m_item2= Fi.m_strName;
		if(i==2)m_item3= Fi.m_strName;
		if(i==3)m_item4= Fi.m_strName;
		if(i==4)m_item5= Fi.m_strName;
 	}
}
   
void  COdbcsqlView::ReadDispalyRecord(void)
{
	
	if(m_set->IsEOF()==0)
	{	short j, nFields;
	    CString str;

		nFields=m_set->GetODBCFieldCount();
	  	for(j=0;j<nFields;j++)
		{	 
			m_set->GetFieldValue((short)j,str);//获取数据;
			if(j==0)m_id   = atol(str);

			if(j==1)m_name = str;
			if(j==2)m_singer  = str;
			if(j==3)m_writer=str;
			if(j==4)m_position  =str;
		}
	}
}

/////////////////////////////////////////////////////////////////////////////
// COdbcsqlView printing

BOOL COdbcsqlView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void COdbcsqlView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void COdbcsqlView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

void COdbcsqlView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/)
{
	// TODO: add customized printing code here
}

/////////////////////////////////////////////////////////////////////////////
// COdbcsqlView diagnostics

#ifdef _DEBUG
void COdbcsqlView::AssertValid() const
{
	CFormView::AssertValid();
}

void COdbcsqlView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}

COdbcsqlDoc* COdbcsqlView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(COdbcsqlDoc)));
	return (COdbcsqlDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// COdbcsqlView message handlers

void COdbcsqlView::OnRecordFirst() 
{
   m_set->MoveFirst();
	  
	ReadDispalyRecord();
	UpdateData(false);
}

void COdbcsqlView::OnRecordLast() 
{
   	m_set->MoveLast();
		
	ReadDispalyRecord();
	UpdateData(false);
}

void COdbcsqlView::OnRecordNext() 
{
	if(m_set->IsEOF())
	{	m_set->MoveLast();
		AfxMessageBox("当前视图没有记录!");
		return;
	}
	if(m_set->IsBOF())m_set->MoveFirst();
	else m_set->MoveNext();

	ReadDispalyRecord();
	UpdateData(false);

	
}

void COdbcsqlView::OnRecordPrev() 
{
	m_set->MovePrev();		 
	if(m_set->IsEOF())m_set->MoveLast();
	if(m_set->IsBOF())m_set->MoveFirst();
		  
	ReadDispalyRecord();
	UpdateData(false);

	
}

void COdbcsqlView::OnSqlOk() 
{	  
// 1. SELECT * FROM TABLE  
// 2. SELECT table1.name,table1.age from table1
// 3. SELECT table1.age,table1.name from table1 order by age desc
// 4. SELECT * from table1 where age<=33
// 5. SELECT table1.no,table2.name from table1 inner join table2 on table1.no=table2.no order by table2.age desc
// 6. update table1 set age=22,score=98 where name='hhhh'
	UpdateData(true);
	CString m_Statement=m_sql;
	if(	m_Statement == ""){MessageBox("没有SQL语句");return;}

	if(m_set->IsOpen())
		{
			m_set->Close();
		}
        CString OldStr;
		OldStr=m_Query;
		TRY
		{
			m_Statement.MakeUpper();
			if(m_Statement.Find("SELECT")==-1)
			{
			    m_set->m_pDatabase->ExecuteSQL(m_Statement);
			}
			else
			{
                m_Query = m_Statement;
			}
			if(!m_set->IsOpen())
			{
				m_set->Open(CRecordset::dynaset,m_Query);
			}
		}

		CATCH_ALL(e)
		{
			TCHAR Err[255];
			e->GetErrorMessage(Err,255);
			AfxMessageBox(Err);
			if(!m_set->IsOpen())
			{
				m_set->Open(CRecordset::dynaset,OldStr);
				m_Query=OldStr;
				m_Statement=OldStr;
			}
		}
		END_CATCH_ALL
		//1. 读出并显示数据库字段名
		ReadDisplayFields();
	
		//2. 添加行:
		 if(m_set->IsEOF())
	{
		AfxMessageBox("当前视图没有记录!");
		return;
	}

	m_set-> MoveFirst();

	ReadDispalyRecord();
	UpdateData(false);
//	OnSetItemReadOnly(true);

}

void COdbcsqlView::OnDestroy() 
{
	CFormView::OnDestroy();
	
	// TODO: Add your message handler code here
	
	if(m_DSOK==FALSE)
	{
		return;
	}
	if(m_Db.IsOpen())
	{
		m_Db.Close();
	}
	if(m_set->IsOpen())
	{
		m_set->Close();
	}

}

void COdbcsqlView::OnRecordPlay() 
{
    	CString strFileName = m_position;//set->FileDlg.GetPathName();
		char szFileName[_MAX_PATH];
		GetShortPathName((LPCSTR)strFileName, szFileName, _MAX_PATH);
		char szExt[8];
		 _splitpath((const char *)szFileName, NULL, NULL, NULL, szExt);

		// keep the open result
		MCIERROR mciError = 0;
		if (!stricmp(szExt, ".wav"))
			mciError = Open(szFileName, "waveaudio", "", m_hWnd);
		else if (!stricmp(szExt, ".mid"))
		 	mciError = Open(szFileName, "sequencer", "", m_hWnd);
		
		else if (!stricmp(szExt, ".avi"))
			mciError = Open(szFileName, "avivideo", "overlapped", m_hWnd);
		
		Play();
	
}


⌨️ 快捷键说明

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