📄 odbcsqlview.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 + -