【openGauss && MFC】Opengauss加密解密函数, 右键菜单, MFC的Table中打印SQL执行结果, radiobutton再次点击取消选中

1 radio button 取消选中

双击控件添加变量,顺便把“点击已阅读协议后激活登入按钮”的功能实现了

CWnd* GetDlgItem(int nID) //根据控件的ID,获取控件对象,记得转换类型

使用变量标记是否是第一次选中

static BOOL flag = 0;
void CloginDlg::OnBnClickedReadRadio()
{
	// TODO: 在此添加控件通知处理程序代码
	int isChecked = ((CButton*)GetDlgItem(IDC_READ_RADIO))->GetCheck();
	((CButton*)GetDlgItem(IDC_SIGNIN_BUTTON))->EnableWindow(TRUE);
	if (isChecked && flag)
	{
		((CButton*)GetDlgItem(IDC_READ_RADIO))->SetCheck(FALSE);
		((CButton*)GetDlgItem(IDC_SIGNIN_BUTTON))->EnableWindow(FALSE);
		flag = FALSE;
		return;
	}
	flag = TRUE;
}

在这里插入图片描述

2 combo box 的使用

2.1 控件添加数据

2.1.1 直接在属性中添加

设置ComboBox的data属性,不同的选项用 “;” 隔开

在这里插入图片描述

2.1.2 通过变量添加

m_combo.AddString(L"IS");
m_combo.AddString(L"CS");
m_combo.AddString(L"MA");

// 在自定义位置处添加
m_combo.InsertString(0, L"IS");
m_combo.InsertString(1, L"CS");
m_combo.InsertString(2, L"MA");

2.2 设置默认值

int SetCurSel(int nSelect);
// nSelect 下标

3 创建右键菜单

在资源视图添加菜单资源,给窗口消息WM_CONTEXTMENU添加处理程序

void CedusysDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
	// TODO: 在此处添加消息处理程序代码
	//从资源文件中加载指定ID的菜单
	CMenu t_menu;
	t_menu.LoadMenu(IDR_MENU_RIGHT);
	//获得指定ID菜单的所有子菜单
	CMenu* t_pMenu;
	t_pMenu = t_menu.GetSubMenu(0);
	//EnableMenuItem的意思是允许、禁止或变灰指定的菜单条目。
	//为每一个子菜单设置状态
	t_pMenu->EnableMenuItem(ID_HELP_VIEW, MF_BYCOMMAND | MF_ENABLED);//激活转态
	t_pMenu->EnableMenuItem(ID_HELP_UPIN, MF_BYCOMMAND | MF_ENABLED);//激活转态
	t_pMenu->EnableMenuItem(ID_HELP_ABOUT, MF_BYCOMMAND | MF_ENABLED);//激活转态
	t_pMenu->EnableMenuItem(ID_HELP_CHECK, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
	//禁用状态,灰色
	//在鼠标点击处的位置加载出来菜单项
	t_pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
	t_pMenu->Detach();
	t_menu.DestroyMenu();
}

4 创建函数加密和解密

把这个函数定义删光光之后 秘钥你就看不见啦
将功能封装成函数 秘钥就能保密啦

CREATE OR REPLACE FUNCTION public.func_encrypt(x character, OUT y text)
 RETURNS text
 LANGUAGE plpgsql
 NOT FENCED NOT SHIPPABLE
AS $$
begin
 SELECT gs_encrypt_aes128(x, 'Asdf1234') into y;
end; $$;
/

注册登入函数 flag=0的时候是注册,其他时候是登入

CREATE OR REPLACE FUNCTION public.func_InOrUp(x TEXT, y TEXT, flag INTEGER)
 RETURNS INTEGER
 LANGUAGE plpgsql
 NOT FENCED NOT SHIPPABLE
AS $$
DECLARE
  xx CHAR(5);
  yy VARCHAR(20);
  xxx CHAR(5);
  yyy VARCHAR(20);
  i TEXT;
  j TEXT;
BEGIN
  SELECT gs_decrypt_aes128(x, 'Asdf1234') INTO xx;
  SELECT gs_decrypt_aes128(y, 'Asdf1234') INTO yy;

  -- 循环判断加密后用户信息表里有无记录
  FOR i, j IN (SELECT eid, epwd FROM en_user_info) LOOP
    SELECT gs_decrypt_aes128(i,'Asdf1234') INTO xxx;
    SELECT gs_decrypt_aes128(j,'Asdf1234') INTO yyy;
    IF xx=xxx AND yy=yyy THEN RETURN 1;-- 有记录的话就可以溜了
    END IF;
  END LOOP;
  -- if flag=0 -> signup
  -- 没记录而且是注册操作 就往用户表里添加加密后的信息
  IF flag=0 THEN INSERT INTO en_user_info VALUES (x, y);
  END IF;
  RETURN 0;
END;
$$;
/

5 获取表头

使用ListControl打印SQL执行结果需要获取结果的表头

SELECT a.attname AS field
FROM pg_class c, pg_attribute a
    LEFT JOIN pg_description b
    ON a.attrelid = b.objoid
        AND a.attnum = b.objsubid, pg_type t
WHERE c.relname = '表名'
    AND a.attnum > 0
    AND a.attrelid = c.oid
    AND a.atttypid = t.oid
ORDER BY a.attnum;

使用EditControl接受用户输入,EditControl需要将"Want return"属性设置为TRUE
重载虚函数PreTranslateMessage,判断按键消息类型和焦点,实现当按下Ctrl+Enter组合键时运行SQL结果打印函数

void CedusysDlg::PrintSQLResult()
{
	// TODO: 在此处添加实现代码.
	m_listStu.DeleteAllItems();// 清空所有表项
	while (m_listStu.DeleteColumn(0));// 清空所有表头
	CString t_sql, t_editSQL, t_str;
	((CEdit*)GetDlgItem(IDC_EDIT_SQL))->GetWindowTextW(t_editSQL);
	if (t_editSQL.IsEmpty()) {// 如果控件内容为空就返回
		return;
	}
	TRY{
	
		CRecordset t_set(&g_db);
	// 去除语句中的‘;’,不然会报错,本函数只支持运行一条SQL语句并打印
	if (t_editSQL.ReverseFind(L';') == t_editSQL.GetLength() - 1) {
		t_editSQL = t_editSQL.Left(t_editSQL.GetLength() - 1);
	}
	/*t_editSQL.Replace(L";", L"");*/// error: 这会导致忽略某些语法错误
	t_sql.Format(L"drop table if exists temp_table;\
				 select * into temp_table from (%s);", t_editSQL);
	// 使用执行的结果创建一个表(如果表在操作前存在,就删除)
	g_db.ExecuteSQL(t_sql);
	t_sql = L"SELECT a.attname AS field\
			    FROM pg_class c, pg_attribute a\
		   LEFT JOIN pg_description b\
				  ON a.attrelid = b.objoid\
				 AND a.attnum = b.objsubid, pg_type t\
			   WHERE c.relname = 'temp_table'\
				 AND a.attnum > 0\
				 AND a.attrelid = c.oid\
				 AND a.atttypid = t.oid";// 获取表头
	int i = 0;
	if (t_set.Open(AFX_DB_USE_DEFAULT_TYPE, t_sql)) {
		if (t_set.IsBOF()) {
			AfxMessageBox(L"该表格数据集为空");
			return;
		}
		while (!t_set.IsEOF()) {
			t_set.GetFieldValue((short)0, t_str);
			m_listStu.InsertColumn(i++, t_str, LVCFMT_LEFT, 100);// 插入表头
			t_set.MoveNext();// 这一句是必须的,移动指针
		}
		m_listStu.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
	}
	t_set.Close();// 这一句是必须的,CRecordset类变量必须处于关闭才能打开
	if (t_set.Open(AFX_DB_USE_DEFAULT_TYPE, t_editSQL)) {
		if (t_set.IsBOF()) {
			AfxMessageBox(L"该表格数据集为空");
			return;
		}
		int k = 0;
		while (!t_set.IsEOF()) {
			t_set.GetFieldValue((short)0, t_str);
			m_listStu.InsertItem(k, t_str);// 必须先创建行才能往行中插入元素
			for (int j = i - 1; j > 0; j--)	{
				t_set.GetFieldValue((short)(i - j), t_str);
				m_listStu.SetItemText(k, i - j, t_str);
			}
			k++;
			t_set.MoveNext();
		}
		t_set.Close();
	}
	g_db.ExecuteSQL(L"drop table if exists temp_table;");
	}
		CATCH(CDBException, error) {
		AfxMessageBox(L"Database error: " + error->m_strError);
	}
	END_CATCH;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

维他命C++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值