📄 myadodlg.cpp
字号:
}
m_adoRecordSet.MoveFirst ();
m_adoRecordSet1.Close();
UpdateRecord();
}
}
void CMyAdoDlg::OnButtonExport()
{
static char BASED_CODE szFilter[] = "XML Files (*.xml)|*.xml|All Files (*.*)|*.*||";
CFileDialog dlg(FALSE,"XML",NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
if (dlg.DoModal() == IDOK)
{
CString strfilename = dlg.GetPathName();
m_adoRecordSet.Save(LPCTSTR(strfilename));
}
/*CString sql;
sql="insert into openrowset('Microsoft.Jet.OLEDB.4.0','x:\A.mdb';'admin';'',A表)
select * from 数据库名..B表";*/
}
void CMyAdoDlg::OnButtonUpdateinfo()
{
CString strText;
strText.Format("[状态: 0x%x ] ", m_adoRecordSet.GetState());
m_strInfo = strText + "\r\n 0: adStateClosed 指示 Recordset 对象为关闭状态"
"\r\n 1: adStateOpen 指示 Recordset 对象为打开状态"
"\r\n 2: adStateConnecting 指示 Recordset 对象正在连接. "
"\r\n 4: adStateExecuting 指示 Recordset 对象正在执行命令. "
"\r\n 8: adStateFetching 指示 Recordset 对象的行正在被读取.";
strText.Format("\r\n\r\n[状态2: 0x%x ] ", m_adoRecordSet.GetStatus());
m_strInfo += strText;
strText.Format("\r\n\r\n[每页记录数: %d ] ", m_adoRecordSet.GetPageSize());
m_strInfo += strText;
strText.Format("\r\n\r\n[总页数: %d ] ", m_adoRecordSet.GetPageCount());
m_strInfo += strText;
strText.Format("\r\n\r\n[记录数目: %d ] ", m_adoRecordSet.GetRecordCount());
m_strInfo += strText;
strText.Format("\r\n\r\n[字段数目: %d ]", m_adoRecordSet.GetFieldsCount());
m_strInfo += strText;
strText.Format("\r\n\r\n[是否记录集头: %d ] ", m_adoRecordSet.IsEOF());
m_strInfo += strText;
strText.Format("\r\n\r\n[是否记录集尾: %d ] ", m_adoRecordSet.IsBOF());
m_strInfo += strText;
strText.Format("\r\n\r\n[当前页: %d ] ", m_adoRecordSet.GetAbsolutePage());
m_strInfo += strText;
strText.Format("\r\n\r\n[当前位置: %d ] ", m_adoRecordSet.GetAbsolutePosition());
m_strInfo += strText + "\r\n -1: adPosUnknown Recordset 为空,当前位置未知,或者提供者不支持 AbsolutePage 属性。 "
"\r\n -2: adPosBOF 当前记录指针位于 BOF(即 BOF 属性为 True)。 "
"\r\n -3: adPosEOF 当前记录指针位于 EOF(即 EOF 属性为 True)。";
strText.Format("\r\n\r\n[光标位置: %d ] ", m_adoRecordSet.GetCursorLocation());
m_strInfo += strText + "\r\n 1: adUseNone 没有使用游标服务。(该常量已过时并且只为了向后兼容才出现)。 "
"\r\n 3: adUseClient 使用由本地游标库提供的客户端游标。本地游标服务通常允许使用的许多功能可能是驱动程序提供的游标无法使用的,因此使用该设置对于那些将要启用的功能是有好处的。AdUseClient 具有向后兼容性,也支持同义的 adUseClientBatch。 "
"\r\n 2: adUseServer 默认值。使用数据提供者的或驱动程序提供的游标。这些游标有时非常灵活,对于其他用户对数据源所作的更改具有额外的敏感性。但是,Microsoft Client Cursor Provider(如已断开关联的记录集)的某些功能无法由服务器端游标模拟,通过该设置将无法使用这些功能。 ";
strText.Format("\r\n\r\n[光标类型: %d ] ", m_adoRecordSet.GetCursorType());
m_strInfo += strText + "\r\n-1: adOpenUnspecified"
"\r\n 0: adOpenForwardOnly 仅向前游标,默认值。除了只能在记录中向前滚动外,与静态游标相同。当只需要在记录集中单向移动时,使用它可提高性能。"
"\r\n 1: adOpenKeyset 键集游标。尽管从您的记录集不能访问其他用户删除的记录,但除无法查看其他用户添加的记录外,键集游标与动态游标相似。仍然可以看见其他用户更改的数据。"
"\r\n 2: adOpenDynamic 动态游标。可以看见其他用户所作的添加、更改和删除。允许在记录集中进行所有类型的移动,但不包括提供者不支持的书签操作。"
"\r\n 3: adOpenStatic = 3;静态游标。可以用来查找数据或生成报告的记录集合的静态副本。另外,对其他用户所作的添加、更改或删除不可见。";
strText.Format("\r\n\r\n[最大记录数: %d ] ", m_adoRecordSet.GetMaxRecordCount());
m_strInfo += strText + "\r\n 0 表示没有限制";
strText.Format("\r\n\r\n[编辑模试: %d ] ", m_adoRecordSet.GetEditMode());
m_strInfo += strText + "\r\n 0: adEditNone 指示当前没有编辑操作"
"\r\n 1: adEditInProgress 指示当前记录中的数据已被修改但未保存"
"\r\n 2: adEditAdd 指示 AddNew 方法已被调用,且复制缓冲区中的当前记录是尚未保存到数据库中的新记录"
"\r\n 3: adEditDelete 指示当前记录已被删除";
GetDlgItem(IDC_DBINFO)->SetWindowText(m_strInfo);
}
void CMyAdoDlg::OnButtonBack2()
{
if (m_adoRecordSet.IsEOF() && m_adoRecordSet.IsBOF()) return;
m_adoRecordSet.MoveFirst();
m_strPathName = "";
UpdateRecord();
}
void CMyAdoDlg::OnButtonForward2()
{
if (m_adoRecordSet.IsEOF() && m_adoRecordSet.IsBOF()) return;
m_adoRecordSet.MoveLast();
m_strPathName = "";
UpdateRecord();
}
void CMyAdoDlg::OnButtonUpdatefieldinfo()
{
CString strText;
m_strInfo = " 字段名 定义长度 实际长度 属性 数据类型\r\n";
m_strInfo += "-----------------------------------------------------------------------\r\n";
for (long i = 0; i < m_adoRecordSet.GetFieldsCount(); i++)
{
strText.Format("%12s", m_adoRecordSet.GetFieldName(i));
m_strInfo += strText;
strText.Format("%12d ", m_adoRecordSet.GetFieldDefineSize(i));
m_strInfo += strText;
strText.Format("%12d", m_adoRecordSet.GetFieldActualSize(i));
m_strInfo += strText;
strText.Format("%12x", m_adoRecordSet.GetFieldAttributes(i));
m_strInfo += strText;
strText.Format("%12d", m_adoRecordSet.GetFieldType(i));
m_strInfo += strText;
m_strInfo += "\r\n";
}
m_strInfo += "\r\n 各字段的值\r\n[字段名] - [通过GetCollect方法取得的值] - [字段实际值] - [字段数据类型]:";
long count = m_adoRecordSet.GetFieldsCount();
int lvalue = 0;
m_strInfo += "\r\n [整型值]:-----------------------------------------";
for (i = 0; i < count; i++)
{
if (!m_adoRecordSet.GetCollect(i, lvalue)) lvalue = 0;
strText.Format("\r\n%8s: %20d", m_adoRecordSet.GetFieldName(i), lvalue);
m_strInfo += strText;
_variant_t vt;
try
{
vt = m_adoRecordSet.GetRecordset()->GetCollect(_variant_t(i));
lvalue = long(vt);
strText.Format("%20d", lvalue);
m_strInfo += " : " + strText;
}
catch (...)
{
}
strText.Format(" 变体值类型(VT_...): %5d", vt.vt);
m_strInfo += strText;
}
double dbvalue = 0;
m_strInfo += "\r\n [双精度值]:-----------------------------------------";
for (i = 0; i < count; i++)
{
try
{
if (!m_adoRecordSet.GetCollect(i, dbvalue)) dbvalue = 0;
strText.Format("\r\n%8s: %16.4f", m_adoRecordSet.GetFieldName(i), dbvalue);
m_strInfo += strText;
_variant_t vt = m_adoRecordSet.GetRecordset()->GetCollect(_variant_t(i));
dbvalue = double(vt);
strText.Format("%16.4f", dbvalue);
m_strInfo += " : " + strText;
strText.Format(" 变体值类型(VT_...): %5d", vt.vt);
m_strInfo += strText;
}
catch (...)
{
}
}
CString strvalue = "";
m_strInfo += "\r\n [字符串]:-----------------------------------------";
for (i = 0; i < count; i++)
{
try
{
if (!m_adoRecordSet.GetCollect(i, strvalue)) strvalue = "";
strText.Format("\r\n%8s: %20s", m_adoRecordSet.GetFieldName(i), strvalue);
m_strInfo += strText;
_variant_t vt = m_adoRecordSet.GetRecordset()->GetCollect(_variant_t(i));
strvalue = LPCTSTR(_bstr_t(vt));
strText.Format("%20s", strvalue);
m_strInfo += " : " + strText;
strText.Format(" 变体值类型(VT_...): %5d", vt.vt);
m_strInfo += strText;
}
catch (...)
{
}
}
GetDlgItem(IDC_DBINFO)->SetWindowText(m_strInfo);
}
void CMyAdoDlg::OnButtonUpdateconnect()
{
CString strText;
m_strInfo = _T("数据库引擎名称: ") + m_adoConnection.GetProviderName() + "\r\n";
m_strInfo += _T("ADO版本: ") + m_adoConnection.GetVersion() +"\r\n";
strText.Format("Mode: 0x%x\r\n", m_adoConnection.GetMode());
m_strInfo += strText;
strText.Format("State: 0x%x\r\n", m_adoConnection.GetState());
m_strInfo += strText;
strText.Format("TimeOut: %d\r\n", m_adoConnection.GetConnectTimeOut());
m_strInfo += strText;
GetDlgItem(IDC_DBINFO)->SetWindowText(m_strInfo);
}
void CMyAdoDlg::OnReset()
{
if (!m_adoRecordSet.Resync())
{
AfxMessageBox("_adoRecordSet");
}
m_strPathName = "";
UpdateRecord();
}
void CMyAdoDlg::OnFind()
{
UpdateData();
if (m_adoRecordSet.Find(LPCTSTR(m_strOther)))
UpdateRecord();
}
void CMyAdoDlg::OnFindnext()
{
UpdateData();
if (m_adoRecordSet.FindNext())
UpdateRecord();
}
void CMyAdoDlg::OnGrid()
{
CGridDlg dlg;
dlg.m_adoRecordSet = &m_adoRecordSet;
dlg.DoModal();
}
bool CMyAdoDlg::WriteWindowToDIB(LPTSTR szFile, CBitmap *pCBitmap)
{
// 如果设备支持调色板,创建调色板
CPalette pal;
HANDLE hDIB = DDBToDIB( pCBitmap, BI_RGB, &pal );// 转换Bitmap 到DIB
if( hDIB == NULL )
return FALSE;
WriteDIB( szFile, hDIB );//将DIB保存到文件
GlobalFree( hDIB );//释放DIB对象所占空间
return TRUE;
}
HANDLE CMyAdoDlg::DDBToDIB(CBitmap *pbitmap, DWORD dwCompression, CPalette *pPal)
{BITMAP bm;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
DWORD dwLen;
HANDLE hDIB;
HANDLE handle;
HDC hDC;
HPALETTE hPal;
ASSERT( pbitmap->GetSafeHandle() );
if( dwCompression == BI_BITFIELDS )//位图是否压缩
return NULL;
hPal = (HPALETTE) pPal->GetSafeHandle();//选择调色板
if (hPal==NULL)
hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE);
pbitmap->GetObject(sizeof(bm),(LPSTR)&bm);//获取位图的属性信息
// 初始化位图文件头结构
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bm.bmWidth;
bi.biHeight = bm.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = bm.bmPlanes * bm.bmBitsPixel;
bi.biCompression = dwCompression;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
// 计算位图信息结构和位图颜色表的大小
int nColors = (1 << bi.biBitCount);
if( nColors > 256 )
nColors = 0;
dwLen = bi.biSize + nColors * sizeof(RGBQUAD);
// 为DIB创建一个设备环境
hDC = ::GetDC(NULL);
//hDC = ::GetDC(this);
hPal = SelectPalette(hDC,hPal,FALSE);
RealizePalette(hDC);
// 为位图信息头结构和颜色表分配内存
hDIB = GlobalAlloc(GMEM_FIXED,dwLen);
if (!hDIB){
SelectPalette(hDC,hPal,FALSE);
::ReleaseDC(NULL,hDC);
return NULL;
}
lpbi = (LPBITMAPINFOHEADER)hDIB;
*lpbi = bi;
// 计算位图字节数
GetDIBits(hDC, (HBITMAP)pbitmap->GetSafeHandle(), 0L, (DWORD)bi.biHeight,
(LPBYTE)NULL, (LPBITMAPINFO)lpbi, (DWORD)DIB_RGB_COLORS);
bi = *lpbi;
// 如果biSizeImage为0,重新计算
if (bi.biSizeImage == 0){
bi.biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8)
* bi.biHeight;
if (dwCompression != BI_RGB)//如果为图压缩
bi.biSizeImage = (bi.biSizeImage * 3) / 2;
}
// 给最终的位图尺寸分配内存块,包括位图信息头结构和颜色表与位图字节数
dwLen += bi.biSizeImage;
if (handle = GlobalReAlloc(hDIB, dwLen, GMEM_MOVEABLE))
hDIB = handle;
else{
GlobalFree(hDIB);
// 重新选择原始调色板
SelectPalette(hDC,hPal,FALSE);
::ReleaseDC(NULL,hDC);
return NULL;
}
lpbi = (LPBITMAPINFOHEADER)hDIB;
BOOL bGotBits = GetDIBits( hDC, (HBITMAP)pbitmap->GetSafeHandle(),
0L, // Start scan line
(DWORD)bi.biHeight, // # of scan lines
(LPBYTE)lpbi // address for bitmap bits
+ (bi.biSize + nColors * sizeof(RGBQUAD)),
(LPBITMAPINFO)lpbi, // address of bitmapinfo
(DWORD)DIB_RGB_COLORS); // Use RGB for color table
if( !bGotBits )
{
GlobalFree(hDIB);
SelectPalette(hDC,hPal,FALSE);
::ReleaseDC(NULL,hDC);
return NULL;
}
SelectPalette(hDC,hPal,FALSE);
::ReleaseDC(NULL,hDC);
return hDIB;
}
BOOL CMyAdoDlg::WriteDIB(LPTSTR szFile, HANDLE hDIB)
{
BITMAPFILEHEADER hdr;
LPBITMAPINFOHEADER lpbi;
if (!hDIB)
return FALSE;
CFile file;
if( !file.Open( szFile, CFile::modeWrite|CFile::modeCreate) )
return FALSE;
lpbi = (LPBITMAPINFOHEADER)hDIB;
int nColors = 1 << lpbi->biBitCount;
// 填充为图文件头结构
hdr.bfType = ((WORD) ('M' << 8) | 'B'); // "BM"标志
hdr.bfSize=::GlobalSize (hDIB) + sizeof( hdr );
hdr.bfReserved1=0;
hdr.bfReserved2=0;
hdr.bfOffBits=(DWORD) (sizeof( hdr ) + lpbi->biSize +nColors * sizeof(RGBQUAD));
file.Write( &hdr, sizeof(hdr) );
// DIB头结构和位图像素数据存盘
file.Write( lpbi, GlobalSize(hDIB) );
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -