VisualCpp之旅6——不配置DSN,只用Dialog也可以增删查改ODB

1、新建一个Dialog MFC项目 不需要数据库支持

2、将dialog界面设置为👇,list control添加变量为m_lst

3、双击这个新建的按钮,在xxxDialog.cpp中插入以下内容

#include<afxdb.h>
#include<odbcinst.h>
#pragma comment (lib,"odbccp32.lib")  //SQL driver

 在onbuttonclick函数中插入以下内容

	// TODO: Add your control notification handler code here
	CDatabase database;
	CString sSql;
	CString str1,str2,str3,str4;
	CString sDriver;
	CString sDsn;
	CString sFile = _T("4col.mdb");
	int i=0;	
	sDriver = _T("Microsoft Access Driver (*.mdb)");
	sDsn.Format(_T("ODBC;DRIVER={%s};DSN='''';DBQ=%s"),sDriver,sFile);

	database.Open(NULL,false,false,sDsn);//database: 库
	CRecordset resset(&database);//recordset:表

	sSql="SELECT 学号,姓名,手机号,学院 From List";
	resset.Open(CRecordset::forwardOnly,sSql,CRecordset::readOnly);

	while(!resset.IsEOF())
		{
			resset.GetFieldValue(_T("学号"),str1);
			resset.GetFieldValue(_T("姓名"),str2);
			resset.GetFieldValue(_T("手机号"),str3);
			resset.GetFieldValue(_T("学院"),str4);
			m_lst.InsertItem(i,_T(""));
			m_lst.SetItemText(i,0,str1);
			m_lst.SetItemText(i,1,str2);
			m_lst.SetItemText(i,2,str3);m_lst.SetItemText(i,3,str4);
			resset.MoveNext();
			i++;
		}
		database.Close();
		UpdateData();

在OnInitDialog()中添加如下代码:

    m_lst.ModifyStyle(0L,LVS_SHOWSELALWAYS);
	DWORD dwStyle = m_lst.GetExtendedStyle();
	dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
	dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的list control)
	dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
	m_lst.SetExtendedStyle(dwStyle);

	m_lst.InsertColumn(0,_T("学号"),LVCFMT_CENTER,150);
	m_lst.InsertColumn(1,_T("姓名"),LVCFMT_CENTER,150);
	m_lst.InsertColumn(2,_T("手机号"),LVCFMT_CENTER,150);
	m_lst.InsertColumn(3,_T("学院"),LVCFMT_CENTER,150);

对ListControl进行初始化。

4、插入combo box和list

class wizard添加变量m_Combo m_lst2

OnInitDialog添加

    m_Combo.AddString(_T("信息院"));
	m_Combo.AddString(_T("林学院"));
	m_Combo.AddString(_T("机电院"));
	m_Combo.SetCurSel(0);//默认显示第一个

把combo的sort属性改为False

5、给Combo添加响应事件。

void CNoDSNDlg::OnSelchangeCombo1()
{
	// TODO: Add your control notification handler code here
	CString str;
	m_Combo.GetLBText(m_Combo.GetCurSel(),str);
	int num = m_lst2.GetCount();
	for(int i=num;i>=0;i--)
		m_lst2.DeleteString(i);
	
	CDatabase database;
	CString sSql;
	CString str1,str2,str3,str4;
	CString sDriver;
	CString sDsn;
	CString sFile = _T("4col.mdb");
	int i=0;	
	sDriver = _T("Microsoft Access Driver (*.mdb)");
	sDsn.Format(_T("ODBC;DRIVER={%s};DSN='''';DBQ=%s"),sDriver,sFile);

	database.Open(NULL,false,false,sDsn);//database: 库
	CRecordset resset(&database);//recordset:表

	sSql="SELECT 学号,姓名,手机号,学院 From list WHERE 学院=";
	sSql = sSql + _T("'") + str + _T("'");//引号非常重要
	//MessageBox(sSql);
	resset.Open(CRecordset::forwardOnly,sSql,CRecordset::readOnly);

	while(!resset.IsEOF())
		{
			resset.GetFieldValue(_T("学号"),str1);
			resset.GetFieldValue(_T("姓名"),str2);
			resset.GetFieldValue(_T("手机号"),str3);
			resset.GetFieldValue(_T("学院"),str4);
			
			CString sstr;
			sstr = str1 +' ' + str2 +' ' + str3 +' ' + str4;
			m_lst2.AddString(sstr);

			resset.MoveNext();
			
		}
	database.Close();
	UpdateData();
}

6、把listbox的sort属性也改为false

以上,基本完成了数据库根据学院的查询操作。

接下来,如何将左边、右边两个list控件进行级联?目标为双击左边控件里的内容,在右边的控件进行详细展示。(略,输入到str作为中介CString str;m_lst2.GetText(m_lst2.GetCurSel(),str);)

7、增加删除右表所有数据的功能

void CNoDSNDlg::OnClickedButton4()
{
	// TODO: Add your control notification handler code here
	m_lst.DeleteAllItems();
}

 或者

void CNoDSNDlg::OnClickedButton4()
{
	// TODO: Add your control notification handler code here
	//每次都删第一行
    int num = m_lst.GetItemCount();
    for(int i=0;i<num;i++)
        m_lst.DeleteItem(0);
}
void CNoDSNDlg::OnClickedButton4()
{
	// 或者每次都删除列
	while(m_lst.DeleteColumn(0));
}

8、重要的

按照手机号查找:新建edit box 赋给value型变量 m_FindPhone

双击按钮添加函数

void CNoDSNDlg::OnClickedButton3()
{
	// TODO: Add your control notification handler code here
	CString Phone;
	Phone = m_FindPhone;

	int num = m_lst2.GetCount();
	for(int i=num;i>=0;i--)
		m_lst2.DeleteString(i);
	
	CDatabase database;
	CString sSql;
	CString str1,str2,str3,str4;
	CString sDriver;
	CString sDsn;
	CString sFile = _T("4col.mdb");
	int i=0;	
	sDriver = _T("Microsoft Access Driver (*.mdb)");
	sDsn.Format(_T("ODBC;DRIVER={%s};DSN='''';DBQ=%s"),sDriver,sFile);

	database.Open(NULL,false,false,sDsn);//database: 库
	CRecordset resset(&database);//recordset:表

	sSql="SELECT 学号,姓名,手机号,学院 From list WHERE 手机号 like ";
	sSql = sSql + _T("'%%") + Phone + _T("%%'");//引号非常重要
	
	resset.Open(CRecordset::forwardOnly,sSql,CRecordset::readOnly);

	while(!resset.IsEOF())
		{
			resset.GetFieldValue(_T("学号"),str1);
			resset.GetFieldValue(_T("姓名"),str2);
			resset.GetFieldValue(_T("手机号"),str3);
			resset.GetFieldValue(_T("学院"),str4);
			
			CString sstr;
			sstr = str1 +' ' + str2 +' ' + str3 +' ' + str4;
			m_lst2.AddString(sstr);

			resset.MoveNext();
			
		}
	database.Close();
	UpdateData();


}

按照姓名查找:控件,m_FindName,代码

void CNoDSNDlg::OnBnClickedButton2()
{
	// TODO: Add your control notification handler code here
	CString Name;
	Name = m_FindName;

	int num = m_lst2.GetCount();
	for(int i=num;i>=0;i--)
		m_lst2.DeleteString(i);
	
	CDatabase database;
	CString sSql;
	CString str1,str2,str3,str4;
	CString sDriver;
	CString sDsn;
	CString sFile = _T("4col.mdb");
	int i=0;	
	sDriver = _T("Microsoft Access Driver (*.mdb)");
	sDsn.Format(_T("ODBC;DRIVER={%s};DSN='''';DBQ=%s"),sDriver,sFile);

	database.Open(NULL,false,false,sDsn);//database: 库
	CRecordset resset(&database);//recordset:表

	sSql="SELECT 学号,姓名,手机号,学院 From list WHERE 姓名 like ";
	sSql = sSql + _T("'%%") + Name + _T("%%'");//引号非常重要
	
	resset.Open(CRecordset::forwardOnly,sSql,CRecordset::readOnly);

	while(!resset.IsEOF())
		{
			resset.GetFieldValue(_T("学号"),str1);
			resset.GetFieldValue(_T("姓名"),str2);
			resset.GetFieldValue(_T("手机号"),str3);
			resset.GetFieldValue(_T("学院"),str4);
			
			CString sstr;
			sstr = str1 +' ' + str2 +' ' + str3 +' ' + str4;
			m_lst2.AddString(sstr);

			resset.MoveNext();
			
		}
	database.Close();
	UpdateData();

}

增加新数据:新建一个Dialog,见上次的记录。

参考了以下链接:

https://blog.csdn.net/yueliangge910101/article/details/17347405?_t=t&utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase

https://www.cnblogs.com/jcss2008/archive/2009/01/20/1379060.html

https://blog.csdn.net/weixin_30681615/article/details/97710118

void CNoDSNDlg::OnBnClickedButton6()
{
	// TODO: Add your control notification handler code here

	CAddRecord addRec;

	addRec.DoModal();
	CString Name, Sno,Phone,Depart;
	Sno = addRec.AddSno;
	Name = addRec.AddName;
	Phone = addRec.AddPhone;
	Depart = addRec.AddDepart;

	CDatabase database;
	CString sSql;
	CString str1,str2,str3,str4;
	CString sDriver;
	CString sDsn;
	CString sFile = _T("4col.mdb");
	int i=0;	
	sDriver = _T("Microsoft Access Driver (*.mdb)");
	sDsn.Format(_T("ODBC;DRIVER={%s};DSN='''';DBQ=%s"),sDriver,sFile);

	database.Open(NULL,false,false,sDsn);//database: 库
	//CRecordset resset(&database);//recordset:表

	sSql="INSERT INTO list([学号],[姓名],[手机号],[学院]) VALUES('";//"INSERT INTO list(学号,姓名,手机号,学院) VALUES('"
	
	sSql = sSql + Sno + _T("','") + Name + _T("','") + Phone + _T("','") + Depart + _T("')");
	//MessageBox(sSql);

	//resset.Open(CRecordset::forwardOnly,sSql,CRecordset::appendOnly);
	if(Sno != "")
		database.ExecuteSQL(sSql);
	database.Close();

}

选中List Control中的行,从数据库删除数据:

void CNoDSNDlg::OnBnClickedButton5()
{
	// TODO: Add your control notification handler code here

	POSITION p = m_lst.GetFirstSelectedItemPosition();
	if (p == NULL)
	{
		MessageBox(_T("没有行被选中!"));
		return;
	}
	int index = m_lst.GetNextSelectedItem(p);
	
	CString Sno;
	Sno = m_lst.GetItemText(index,0);
	
	//MessageBox(strValue);

	CDatabase database;
	CString sSql;
	CString str1,str2,str3,str4;
	CString sDriver;
	CString sDsn;
	CString sFile = _T("4col.mdb");
	int i=0;	
	sDriver = _T("Microsoft Access Driver (*.mdb)");
	sDsn.Format(_T("ODBC;DRIVER={%s};DSN='''';DBQ=%s"),sDriver,sFile);

	database.Open(NULL,false,false,sDsn);//database: 库
	//CRecordset resset(&database);//recordset:表

	sSql = "DELETE FROM list WHERE 学号=";
	sSql = sSql + _T("'") + Sno + _T("'");
	//MessageBox(sSql);
	database.ExecuteSQL(sSql);
	database.Close();
	m_lst.DeleteItem(index);
}

▲▲▲对查询手机号、姓名的窗口添加 EN_CHANGE函数,加入UpdateData();//这样才能实时获得输入内容!!!

PS:添加登录界面:见下一次记录。

好的,下面是使用ODBC在C++中连接SQL Server数据并进行增删查改操作的基本步骤: 1. 引入头文件:您需要在代码中引入以下头文件: ``` #include <windows.h> #include <sql.h> #include <sqlext.h> ``` 2. 连接到数据:使用ODBC API连接到SQL Server数据,例如: ``` SQLHANDLE henv, hdbc; SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0); SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); char* dsn = "your_dsn"; char* user = "your_username"; char* pass = "your_password"; SQLConnect(hdbc, (SQLCHAR*)dsn, SQL_NTS, (SQLCHAR*)user, SQL_NTS, (SQLCHAR*)pass, SQL_NTS); ``` 在这个例子中,我们使用SQLAllocHandle函数分配了环境句柄和连接句柄,然后使用SQLSetEnvAttr函数设置ODBC版本,最后使用SQLConnect函数连接到数据。 3. 执行SQL语句:使用ODBC API执行SQL语句,例如: ``` char* sql = "SELECT * FROM table_name"; SQLHANDLE hstmt; SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); SQLExecDirect(hstmt, (SQLCHAR*)sql, SQL_NTS); ``` 在这个例子中,我们使用SQLAllocHandle函数分配了语句句柄,然后使用SQLExecDirect函数执行SQL语句。 4. 处理结果集:如果您执行的SQL语句返回一个结果集,您需要使用ODBC API来处理该结果集,例如: ``` while (SQLFetch(hstmt) == SQL_SUCCESS) { int id, value; SQLGetData(hstmt, 1, SQL_C_LONG, &id, 0, NULL); SQLGetData(hstmt, 2, SQL_C_LONG, &value, 0, NULL); // 处理结果 } ``` 在这个例子中,我们使用SQLFetch函数获取结果集中的行,然后使用SQLGetData函数获取每个行的列的数据。 5. 实现增删查改:您可以将上述步骤组合起来,实现一个简单的增删查改功能,例如: ``` // 查询数据 char* sql = "SELECT * FROM table_name WHERE id = ?"; SQLHANDLE hstmt; SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); SQLPrepare(hstmt, (SQLCHAR*)sql, SQL_NTS); int id = 1; SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &id, 0, NULL); SQLExecute(hstmt); int value; if (SQLFetch(hstmt) == SQL_SUCCESS) { SQLGetData(hstmt, 2, SQL_C_LONG, &value, 0, NULL); } // 插入数据 sql = "INSERT INTO table_name (id, value) VALUES (?, ?)"; SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); SQLPrepare(hstmt, (SQLCHAR*)sql, SQL_NTS); id = 2; value = 10; SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &id, 0, NULL); SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &value, 0, NULL); SQLExecute(hstmt); // 更新数据 sql = "UPDATE table_name SET value = ? WHERE id = ?"; SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); SQLPrepare(hstmt, (SQLCHAR*)sql, SQL_NTS); value = 20; id = 2; SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &value, 0, NULL); SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &id, 0, NULL); SQLExecute(hstmt); // 删除数据 sql = "DELETE FROM table_name WHERE id = ?"; SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); SQLPrepare(hstmt, (SQLCHAR*)sql, SQL_NTS); id = 2; SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &id, 0, NULL); SQLExecute(hstmt); ``` 在这个例子中,我们使用了一个SELECT语句来查找需要操作的数据,然后使用INSERT、UPDATE和DELETE语句进行了相应的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值