您的位置:首页 > 数据库

SQL学习笔记:常用SQL语句操作

2009-08-21 08:13 761 查看
      在学习SQL的时候,本来预计花三天的时候掌握MS SQL这些基础,现在争取提前一天看完。总结沉底下来,其实也没有多少东西:

 

1、程序初始化前,先连接数据库

 

       MFC程序中添加记录的代码:

/************************************************************************/
/* 函数作用: 对话框默认初始化函数,连接SQL数据库、添加列表头
/* 函数参数: 无
/* 返 回 值: 成功返回TRUE,否则返回FALSE
/* 说    明: By Koma 2009-08-20 20:18 Edit
/************************************************************************/
BOOL CQDlg::OnInitDialog()
{
CDialog::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)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
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
//初始化COM接口
if (!AfxOleInit())
{
AfxMessageBox("初始化com接口失败");
}
HRESULT hr;
try
{
// 创建Connection对象
hr = m_pConnection.CreateInstance("ADODB.Connection");
if(SUCCEEDED(hr))
{
// 连接数据库成功
hr = m_pConnection->Open("Provider=SQLOLEDB;Server=koma.5166.info,1433;DataBase=student;UID=sa;PWD=","","",adModeUnknown);
}
}
catch(_com_error e)
{
// 捕捉异常
CString errormessage;
errormessage.Format("连接数据库失败!/r/n错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息
}

// 上下列表控件初始化XP风格
LONG lStyle = m_LineList.SendMessage(LVM_GETEXTENDEDLISTVIEWSTYLE);
lStyle |=  LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES;
m_LineList.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0,(LPARAM)lStyle);

//  添加ListBox列表头
m_LineList.InsertColumn(0,"姓名", NULL,80, -1);
m_LineList.InsertColumn(1,"班级", NULL,80,-1);
m_LineList.InsertColumn(2,"语文", NULL,80,-1);
m_LineList.InsertColumn(3,"数学", NULL,80, -1);
m_LineList.InsertColumn(4,"英语", NULL,80, -1);

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


 

2、选择表名

 

      例句:use student  这条语句一般在SQL查询分析器中需要使用到,而在程序中我觉得并不需要。

 

3、读取记录

 

      SQL查询分析器中例句:

 

      use student

 

      select * from db_info

 

      MFC程序中添加记录的代码:

/************************************************************************/
/* 函数作用: 读取SQL数据库记录,将内容写入ListBox
/* 函数参数: 无
/* 返 回 值: 无
/* 说    明: By Koma 2009-08-20 21:35 Edit
/************************************************************************/
void CQDlg::OnBtnRead()
{
// TODO: Add your control notification handler code here
//  清空列表框
m_LineList.DeleteAllItems();

int nItem;
_variant_t vName,vBanJi,vYuWen,vShuXue,vYinWen;
try
{
// 连接数据库,打开MainInfo表
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open("select * from db_info",_variant_t((IDispatch*)
m_pConnection,TRUE),adOpenStatic,adLockOptimistic,adCmdText);

// 判断记录集指针标志,是否读取完毕
while(!m_pRecordset->adoEOF)
{
// 获取记录集
vName	= m_pRecordset->GetCollect("姓名");
vBanJi	= m_pRecordset->GetCollect("班级");
vYuWen	= m_pRecordset->GetCollect("语文");
vShuXue	= m_pRecordset->GetCollect("数学");
vYinWen	= m_pRecordset->GetCollect("英语");

// 更新上面的ListBox
nItem = m_LineList.InsertItem(0xffff,(_bstr_t)vName);
m_LineList.SetItem(nItem,1,1,(_bstr_t)vBanJi,NULL,0,0,0);
m_LineList.SetItem(nItem,2,1,(_bstr_t)vYuWen,NULL,0,0,0);
m_LineList.SetItem(nItem,3,1,(_bstr_t)vShuXue,NULL,0,0,0);
m_LineList.SetItem(nItem,4,1,(_bstr_t)vYinWen,NULL,0,0,0);

// 移动记录集指针到下一条
m_pRecordset->MoveNext();
Sleep(5);
}
}
catch (_com_error e)
{
// 读取出数据库记录出错
CString strTemp;
strTemp.Format("读取数据库时出错,错误代码:『%s』",GetLastError());
AfxMessageBox(strTemp);
}
}


 

4、添加记录

 

      SQL查询分析器中例句:

 

      insert into db_info ([姓名],[班级],[语文],[数学],[英语]) values ('邓丽君','二年三班','98','94','100') 

 

      MFC程序中添加记录的代码:

/************************************************************************/
/* 函数作用: 读取SQL数据库,添加记录集
/* 函数参数: 无
/* 返 回 值: 无
/* 说    明: By Koma 2009-08-20 22:45 Edit
/************************************************************************/
void CQDlg::OnBtnAdd()
{
// TODO: Add your control notification handler code here
try
{
UpdateData(TRUE);
CString sql;
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open("select * from db_info",_variant_t((IDispatch*)
m_pConnection,TRUE),adOpenStatic,adLockBatchOptimistic,adCmdText);
sql.Format("insert into db_info ([姓名],[班级],[语文],[数学],[英语]) values ('%s','%s','%d','%d','%d')",
m_Name,m_Class,m_Yuwen,m_Shuxue,m_English);

// 执行SQL语句
m_pConnection->Execute((_bstr_t)sql,NULL,adExecuteNoRecords);
MessageBox("添加成功!","提示");
}
catch(_com_error e)
{
// 添加出错
CString errormessage;
errormessage.Format("添加失败,请检查姓名『%s』是否已经存在!/n错误信息:『%s』",m_Name,e.ErrorMessage());
AfxMessageBox(errormessage);
}
}


 

5、修改记录

 

      SQL查询分析器中例句:

 

      update db_info set [姓名]='黄家駒',[班级]='三年三班',[语文]='97',[数学]='96',[英语]='98' where [姓名]='黄家驹'

 

      MFC程序中添加记录的代码:

/************************************************************************/
/* 函数作用: 读取SQL数据库,修改记录集
/* 函数参数: 无
/* 返 回 值: 无
/* 说    明: By Koma 2009-08-20 22:58 Edit
/************************************************************************/
void CQDlg::OnBtnEdit()
{
// TODO: Add your control notification handler code here
try
{
// 修改数据,以姓名为键
UpdateData(TRUE);
CString sql;
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open("select * from db_info",_variant_t((IDispatch*)
m_pConnection,TRUE),adOpenStatic,adLockBatchOptimistic,adCmdText);
sql.Format("update db_info set [姓名]='%s',[班级]='%s',[语文]='%d',[数学]='%d',[英语]='%d' where [姓名]='%s'",
m_Name,m_Class,m_Yuwen,m_Shuxue,m_English,m_OldName);

// 执行SQL语句
m_pConnection->Execute((_bstr_t)sql,NULL,adExecuteNoRecords);

// 刷新重新读取数据库
OnBtnRead();
MessageBox("修改成功!","提示");
}
catch(_com_error e)
{
// 修改失败
CString errormessage;
errormessage.Format("修改失败,错误信息:『%s』",e.ErrorMessage());
AfxMessageBox(errormessage);
}
}


 

6、删除记录

 

      SQL查询分析器中例句:

 

      delete from db_info where [姓名]='黄家驹'

 

      MFC程序中添加记录的代码:

/************************************************************************/
/* 函数作用: 读取SQL数据库,删除记录集
/* 函数参数: 无
/* 返 回 值: 无
/* 说    明: By Koma 2009-08-20 21:46 Edit
/************************************************************************/
void CQDlg::OnBtnDel()
{
// TODO: Add your control notification handler code here
try
{
UpdateData(TRUE);
CString sql;
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open("select * from db_info",_variant_t((IDispatch*)
m_pConnection,TRUE),adOpenStatic,adLockBatchOptimistic,adCmdText);

UpdateData(TRUE);
sql.Format("delete from db_info where [姓名]='%s'",m_Name);

// 执行SQL语句
m_pConnection->Execute((_bstr_t)sql,NULL,adExecuteNoRecords);

OnBtnRead();
MessageBox("删除成功!","提示");
}
catch(_com_error e)
{
CString errormessage;
errormessage.Format("删除失败,错误信息:『%s』",e.ErrorMessage());
AfxMessageBox(errormessage);
}
}


7、条件判断

     SQL脚本中,常用的关键词有:

     where、or、and、like、order by

      SQL查询分析器中例句:

      A、完全符合条件:select * from db_info where [姓名]='黄家强'

      B、比较符合条件:select * from db_info where [语文]>='80'

      C、按语文来排序:select * from db_info where [语文]>='80' order by [语文]

      D、符合关键字的:select * from db_info where [姓名] like '%黄%'

      E、组合条件查询:select * from db_info where [姓名] like '%黄%' and [语文]>=90

      F、组合条件查询:select * from db_info where [姓名] like '%黄%' or [语文]>=90

      MFC程序中添加记录的代码,上面的代码中除了带有%关键字比较麻烦,其他的应该没问题,这里举例以字段包含某关键字:

/************************************************************************/
/* 函数作用: 查询姓名字段包含某关键字的记录集
/* 函数参数: 默认
/* 返 回 值: 无
/* 说    明: By Koma 2009-08-20 23:10 Edit
/************************************************************************/
void CQDlg::OnBtnFind()
{
// TODO: Add your control notification handler code here
try
{
//  清空列表框
UpdateData(TRUE);
m_LineList.DeleteAllItems();

CString sql;
int		nItem;

_variant_t vName,vBanJi,vYuWen,vShuXue,vYinWen;
sql.Format("select * from db_info where [姓名] like /'%%%s%%/'",m_FindName);

m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)
m_pConnection,TRUE),adOpenStatic,adLockOptimistic,adCmdText);

// 判断记录集指针标志,是否读取完毕
while(!m_pRecordset->adoEOF)
{
// 获取记录集
vName	= m_pRecordset->GetCollect("姓名");
vBanJi	= m_pRecordset->GetCollect("班级");
vYuWen	= m_pRecordset->GetCollect("语文");
vShuXue	= m_pRecordset->GetCollect("数学");
vYinWen	= m_pRecordset->GetCollect("英语");

// 更新上面的ListBox
nItem = m_LineList.InsertItem(0xffff,(_bstr_t)vName);
m_LineList.SetItem(nItem,1,1,(_bstr_t)vBanJi,NULL,0,0,0);
m_LineList.SetItem(nItem,2,1,(_bstr_t)vYuWen,NULL,0,0,0);
m_LineList.SetItem(nItem,3,1,(_bstr_t)vShuXue,NULL,0,0,0);
m_LineList.SetItem(nItem,4,1,(_bstr_t)vYinWen,NULL,0,0,0);

// 移动记录集指针到下一条
m_pRecordset->MoveNext();
Sleep(5);
}
CString strTotal;
int nTotals=m_pRecordset->GetRecordCount();
strTotal.Format("查询完成,总共有%d条记录!",nTotals);

SetDlgItemText(IDC_STATIC_RESULT,strTotal);
}
catch (_com_error e)
{
// 读取出数据库记录出错
CString strTemp;
strTemp.Format("读取数据库时出错,错误代码:『%s』",GetLastError());
AfxMessageBox(strTemp);
}
}


8、总结

      个人觉得,在程序设计中上面的实例与代码应付一般的数据库操作都没什么问题,如果具体还需要更高级的操作的话,直接去查查联机手机吧,“中文”稍微好点的,应该没什么问题!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息