使用vc ++ 6.0访问数据库 [英] access database with vc++ 6.0

查看:85
本文介绍了使用vc ++ 6.0访问数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

你好,



我在vc ++ 6.0中创建MFC项目。我在创建新项目时选择访问数据库以下步骤:



1]新 - > MFC应用程序向导(exe) - >多个文档 - >支持文件的数据库视图

2]数据源(选择) - > ODBC - > MS Access数据库 - > Database.accdb - >选择表格。



我的项目已成功创建。但现在我想将该访问数据库更改为同一VC ++ 6.0项目中的其他访问数据库。这是它的步骤。请帮助

解决方案

例如,在这里你必须改变DBQ = C:\\Users \\Comp\\Desktop \ \DB1.mdb; to DBQ = C:\\Users\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ > CString CMFCApplication1Set :: GetDefaultConnect()
{
return _T( DBQ = C:\\Users\\Comp\\Desktop\\DB1.mdb; DefaultDir = C:\\Users\\ Comp\\Desktop; Driver = {Driver do Microsoft Access(* .mdb)}; DriverId = 25; FIL = MS Access; FILEDSN = C:\\Users\\Comp\\Documents \\\TestDS_NEW.dsn; MAXBUFFERSIZE = 2048;的MaxScanRows = 8;将PageTimeout = 5; SafeTransactions = 0;线程= 3; UID =管理员; UserCommitSync =是;);
}





此外,如果您需要提供对多个数据库的访问权限,则必须手动添加类似的功能由VSS的项目向导生成的那个。



如果你需要这里的链接 ODBC API参考


  #define LVCOLUMNS 3 

static LVCOLUMN lpSampleDBListColumns [] =
{{LVCF_TEXT | LVCF_WIDTH, 0 30 ,_ T( CustID), 256 0 },
{LVCF_TEXT | LVCF_WIDTH, 0 30 ,_ T( CustName), 256 0 },
{LVCF_TEXT | LVCF_WIDTH, 0 30 ,_ T( CustQty), 256 0 }};

BOOL CSampleDBAppDlg :: OnInitDialog()
{
CDialogEx :: OnInitDialog();

// 将About ...菜单项添加到系统菜单。

// IDM_ABOUTBOX必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX& 0xFFF0)== IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX< 0xF000);

CMenu * pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu!= NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu-> AppendMenu(MF_SEPARATOR);
pSysMenu-> AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}

// 设置此对话框的图标。当应用程序的主窗口不是对话框时,框架会自动执行此操作
// span>
SetIcon(m_hIcon,TRUE); // 设置大图标
SetIcon(m_hIcon,FALSE); // 设置小图标

// TODO:在这里添加额外的初始化
CListCtrl * pListCtrl = NULL;
if ((pListCtrl =(CListCtrl *)GetDlgItem(IDC_SAMPLEDBLIST))!= NULL)
{
CRect lvRect; pListCtrl-> GetClientRect(安培; lvRect);
int nColumnsCount = sizeof (lpSampleDBListColumns)/ 的sizeof (LVCOLUMN);
for int iIndex = 0 ; iIndex!= nColumnsCount; iIndex ++)
{
lpSampleDBListColumns [iIndex] .cx = lvRect.Width()/ nColumnsCount;
pListCtrl-> InsertColumn(iIndex,& lpSampleDBListColumns [iIndex]);
}
}

CDatabase * pdb = new CDatabase();
if (!pdb-> OpenEx(_T( DBQ = E:\\SampleDB.mdb; DefaultDir = E:\\; Driver = {Driver do Microsoft Access(* .mdb)}; \
DriverId = 25; FIL = MS Access; FILEDSN = E:\\TestDB0.dsn; MaxBufferSize = 2048; MaxScanRows = 8; PageTimeout = 5; SafeTransactions = 0; Threads = 3; UID = admin; UserCommitSync = Yes;
) ))
{
TRACE0( 无法使用数据源连接到数据库);
}

CRecordset * pRecordSet = new CRecordset(pdb);
if (!pRecordSet-> Open(AFX_DB_USE_DEFAULT_TYPE,_T( SELECT * FROM CUSTOMERS)))
{
TRACE0( 无法打开记录集);
}

pRecordSet-> MoveFirst();
for int iRow = 0 ;!pRecordSet-> IsEOF(); iRow ++)
{
CDBVariant varField [ 3 ];
pRecordSet-> GetFieldValue(( short 0 ,varField [ 0 ]);

_TCHAR szField0 [ 256 ] = _T( \0);
wsprintf(szField0,_T( %d),varField [ 0 ] m_iVal)。
pListCtrl-> InsertItem(LVIF_TEXT | LVIF_STATE,iRow,szField0, 0 0 0 0 );

pRecordSet-> GetFieldValue(( short 1 ,varField [< span class =code-digit> 1
]);
pListCtrl-> SetItemText(iRow, 1 ,static_cast< const>(* varField [ 1 ] m_pstringW));

pRecordSet-> GetFieldValue(( short 2 ,varField [< span class =code-digit> 2
]);

_TCHAR szField2 [ 256 ] = _T( \0);
wsprintf(szField2,_T( %d),varField [ 2 ] m_iVal)。
pListCtrl-> SetItemText(iRow, 2 ,szField2);

pRecordSet-> MoveNext();
}

pRecordSet-> Close();
pdb-> Close();

return TRUE; // 除非您将焦点设置为控件
}< / const>否则返回TRUE


像这样:



 pRecordSet-> MoveFirst (); 
for int iRow = 0 ;!pRecordSet-> IsEOF(); iRow ++)
{
CDBVariant varField [ 3 ];
pRecordSet-> GetFieldValue(( short 0 ,varField [ 0 ]);

_TCHAR szField0 [ 256 ] = _T( \0);
wsprintf(szField0,_T( %d),varField [ 0 ] m_iVal)。
pListCtrl-> InsertItem(LVIF_TEXT | LVIF_STATE,iRow,szField0, 0 0 0 0 );

for short iField = 1 ; iField< 3 ; iField ++)
{
pRecordSet-> GetFieldValue(( short )iField,varField [iField]);
pListCtrl-> SetItemText(iRow,iField,
static_cast< const>(* varField [iField] .m_pstringW));
}

pRecordSet-> MoveNext();
}< / const>


Hello,

I am creating MFC project in vc++ 6.0. I choose access databse at the time of creation of new project following steps:

1] New ->MFC AppWizard(exe) -> Multiple document -> Database view with file support
2]Data Source (select) -> ODBC ->MS Access Database -> Database.accdb -> select table.

My project is created successfully . But now I want to change that access database to other access database in the same VC++ 6.0 project. Which are the steps for it. Please help

解决方案

For example, Here you'll have to change DBQ=C:\\Users\\Comp\\Desktop\\DB1.mdb; to DBQ=C:\\Users\\Comp\\Desktop\\DB_NEW.mdb;

CString CMFCApplication1Set::GetDefaultConnect()
{
return _T("DBQ=C:\\Users\\Comp\\Desktop\\DB1.mdb;DefaultDir=C:\\Users\\Comp\\Desktop;Driver={Driver do Microsoft Access (*.mdb)};DriverId=25;FIL=MS Access;FILEDSN=C:\\Users\\Comp\\Documents\\TestDS_NEW.dsn;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;");
}



Also, if you need to provide access to multiple databases, you'll have to manually add similar functionality to the one generated by VSS's project wizard.

Also if you need here's link to ODBC API Reference


#define LVCOLUMNS 3

static LVCOLUMN lpSampleDBListColumns[] = 
	{ { LVCF_TEXT | LVCF_WIDTH, 0, 30, _T("CustID"),   256, 0 },
	  { LVCF_TEXT | LVCF_WIDTH, 0, 30, _T("CustName"), 256, 0 },
	  { LVCF_TEXT | LVCF_WIDTH, 0, 30, _T("CustQty"),  256, 0 } };

BOOL CSampleDBAppDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 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)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		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
	CListCtrl* pListCtrl = NULL;
	if ((pListCtrl = (CListCtrl*)GetDlgItem(IDC_SAMPLEDBLIST)) != NULL)
	{
		CRect lvRect; pListCtrl->GetClientRect(&lvRect);
		int nColumnsCount = sizeof(lpSampleDBListColumns) / sizeof(LVCOLUMN);
		for (int iIndex = 0; iIndex != nColumnsCount; iIndex++)
		{
			lpSampleDBListColumns[iIndex].cx = lvRect.Width() / nColumnsCount;
			pListCtrl->InsertColumn(iIndex, &lpSampleDBListColumns[iIndex]);
		}
	}

	CDatabase* pdb = new CDatabase();
	if (!pdb->OpenEx(_T("DBQ=E:\\SampleDB.mdb;DefaultDir=E:\\;Driver={Driver do Microsoft Access (*.mdb)}; \
		DriverId=25;FIL=MS Access;FILEDSN=E:\\TestDB0.dsn;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;")))
	{
		TRACE0("Unable to connect to database using the data source");
	}

	CRecordset* pRecordSet = new CRecordset(pdb);
	if (!pRecordSet->Open(AFX_DB_USE_DEFAULT_TYPE, _T("SELECT * FROM CUSTOMERS")))
	{
		TRACE0("Unable to open recordset");
	}

	pRecordSet->MoveFirst();
	for (int iRow = 0; !pRecordSet->IsEOF(); iRow++)
	{
		CDBVariant varField[3];
		pRecordSet->GetFieldValue((short)0, varField[0]);

		_TCHAR szField0[256] = _T("\0");
		wsprintf(szField0, _T("%d"), varField[0].m_iVal);
		pListCtrl->InsertItem(LVIF_TEXT | LVIF_STATE, iRow, szField0, 0, 0, 0, 0);

		pRecordSet->GetFieldValue((short)1, varField[1]);
		pListCtrl->SetItemText(iRow, 1, static_cast<const>(*varField[1].m_pstringW));

		pRecordSet->GetFieldValue((short)2, varField[2]);

		_TCHAR szField2[256] = _T("\0");
		wsprintf(szField2, _T("%d"), varField[2].m_iVal);
		pListCtrl->SetItemText(iRow, 2, szField2);

		pRecordSet->MoveNext();
	}

	pRecordSet->Close();
	pdb->Close();

	return TRUE;  // return TRUE  unless you set the focus to a control
}</const>


Like this:

pRecordSet->MoveFirst();
for (int iRow = 0; !pRecordSet->IsEOF(); iRow++)
{
     CDBVariant varField[3];
     pRecordSet->GetFieldValue((short)0, varField[0]);

     _TCHAR szField0[256] = _T("\0");
     wsprintf(szField0, _T("%d"), varField[0].m_iVal);
     pListCtrl->InsertItem(LVIF_TEXT | LVIF_STATE, iRow, szField0, 0, 0, 0, 0);

     for (short iField = 1; iField < 3; iField++)
     {
	  pRecordSet->GetFieldValue((short)iField, varField[iField]);
	  pListCtrl->SetItemText(iRow, iField, 
            static_cast<const>(*varField[iField].m_pstringW));
     }

     pRecordSet->MoveNext();
}</const>


这篇关于使用vc ++ 6.0访问数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆