VC通过ADO打开SQL SERVER数据库,并将其中的表、字段、数据显示出来的小程序
2014-04-21 16:03
501 查看
VC通过ADO打开SQL SERVER数据库,并将其中的表、字段、数据显示出来的小程序
//1、连接数据库类
BOOL CSqlDlg::Ado(CString strConn)
{
::CoInitialize(NULL); // 初始化OLE/COM库环境
try
{
m_pConn.CreateInstance("ADODB.Connection"); //创建Connection对象
m_pConn->ConnectionTimeout=5; //设置超时时间为5秒
m_pConn->Open((_bstr_t)strConn,"", "", adModeUnknown);//连接数据库
}
catch(_com_error e)
{
CATCH_ERROR;
return false;
}
return true;
}
//2、执行strSQL的SQL语句,返回集录集
_RecordsetPtr& CSqlDlg::GetRS(CString strSQL)
{
try
{
m_pRS.CreateInstance(__uuidof(Recordset));
m_pRS->Open((_bstr_t)strSQL,m_pConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);//执行SQL语句
}
catch(_com_error e)
{
CATCH_ERROR
}
return m_pRS;
}
//3、获取所有表名-SQL SERVER
_RecordsetPtr pRS = GetRS("select name from sysobjects where xtype='U'");
CString user;
int x=0;
strArry.RemoveAll();
try
{
while (pRS->adoEOF==0)
{
strArry.Add((LPCSTR)(_bstr_t)pRS->GetCollect(_variant_t((long)x)));
pRS->MoveNext();
}
}
catch(_com_error e)
{
CATCH_ERROR
return;
}
//4、将表名写入列表中
for(int i=0; i<strArry.GetSize(); i++)
{
m_list2.AddString(strArry.GetAt(i));
}
//5、连接设置为不可用,断开设置为可用
GetDlgItem(IDC_LIST)->EnableWindow(0);
GetDlgItem(IDC_OPEN)->EnableWindow(1);
//列表控件双击事件读出表中记录
//6、
m_list1.DeleteAllItems();
UpdateData(1);
int q=0;
//获取记录条数
q=GetNum(m_str_list);
//获取字段个数======================================
CString strSql1;
strSql1="select * from";
strSql1+=" ";
strSql1+=m_str_list;
_RecordsetPtr m_pRS2 = GetRS(strSql1);
dataSize=GetFieldsCount(m_pRS2);
//==================================================
if (dataSize==0)
{
return;
}
//获取字段名strName==================================
CString *strName=new CString[dataSize];
for (int bb=0;bb<dataSize;bb++)
{
GetFieldsName(m_pRS,bb,*(strName+bb));
}
//====================================================
//清空表头
while(m_list1.DeleteColumn(0));
//将字段显示出来
for (int cc=0;cc<dataSize;cc++)
{
m_list1.InsertColumn(cc, *(strName+cc), LVCFMT_LEFT, 150);
}
if (q==0)
{
return;
}
CString strSql;
strSql="select * from";
strSql+=" ";
strSql+=m_str_list;
_RecordsetPtr pRS = GetRS(strSql);
CStringArray *strdataArray=new CStringArray[dataSize];
//获取字段内容,并存入strdataArray+aa中==============
try{
for (int aa=0;aa<dataSize;aa++)
{
while (pRS->adoEOF ==0)
{
CString str1;
_variant_t varTemp;
// str1.Format("%s",(LPCSTR)(_bstr_t)pRS->GetCollect(_variant_t((long)aa)));
//判断数据库中的NULL值
varTemp=pRS->GetCollect(_variant_t((long)aa));
if(varTemp.vt ==VT_NULL)
str1="<NULL>";
else
str1.Format("%s",(LPCSTR)(_bstr_t)pRS->GetCollect(_variant_t((long)aa)));
(strdataArray+aa)->Add(str1);
pRS->MoveNext();
}
pRS->MoveFirst();
}
}
catch(_com_error e)
{
CATCH_ERROR
return;
}
//=================================================== CString str="";
CString str;
for (int tt=0;tt<q;tt++)
{
m_list1.InsertItem(q,"1",0);//插入行
for(int i=0; i<dataSize; i++)
{
str =(strdataArray+i)->GetAt(tt);
TRACE(" 行:%d, 列:%d,数据:%s\n",tt,i,str);
m_list1.SetItemText(tt,i,str);//插入内容
// MessageBox(str);
}
}
delete []strName;
delete []strdataArray; //释放申请的空间
}
//得到记录条数函数
int CSqlDlg::GetNum(CString strc)
{
int nSize=0;
CString strSql;
strSql="select count(*) from";
strSql+=" ";
strSql+=strc;
_RecordsetPtr pRS = GetRS(strSql);
CString s=(LPCSTR)(_bstr_t)pRS->GetCollect(_variant_t((long)0));
char *ch=new char[s.GetLength()];
ch=(LPSTR)(LPCTSTR)s;
nSize=atoi(ch);
return nSize;
delete []ch;
}
//获取字段名函数
BOOL CSqlDlg::GetFieldsName(_RecordsetPtr RcdPtr, int nField, CString & strFieldName)
{
if(NULL == RcdPtr || nField >= RcdPtr->GetFields()->Count)
return FALSE;
_variant_t vt((long)nField);
strFieldName.Format(_T("%s"), (char*)(RcdPtr->GetFields()->Item[vt]->Name));
return true;
}
//获取字段个数函数
int CSqlDlg::GetFieldsCount(_RecordsetPtr RcdPtr)
{
int nCount=0;
if(NULL != RcdPtr)
{
nCount = RcdPtr->GetFields()->Count;
}
return nCount;
}
//断开连接
void CSqlDlg::OnOpen()
{
// TODO: Add your control notification handler code here
GetDlgItem(IDC_LIST)->EnableWindow(1);
GetDlgItem(IDC_OPEN)->EnableWindow(0);
//清空数据
m_list1.DeleteAllItems();
//清空list列表
while(m_list2.GetCount())
m_list2.DeleteString(0);
//释放ADO环境
m_pConn->Close();
m_pConn = NULL;
::CoUninitialize();
}
相关文章推荐
- mysql两张表相同数据查询显示其中一张表的字段
- 保存在数据中image字段的图片文件显示出来
- list集合转换成json数据,ajax请求返回json数据,再通过循环显示出来
- ListUI中增加了分录的字段后,query中的sql语句显示出来的是按照顺序显示出来的,而ListUI中显示出来的数据确实乱的
- 基于Ado.net Entity Framework 通过系统运行时动态编译实现数据表字段的增删
- MFC VC ADO链接SQL Server数据库 操作数据库数据
- 在VC中把一个int类型的数据显示出来。
- 要查找相同数据并且要把这些数据显示出来 编个程序
- 在webform1中打开webform2选择数据,最后还要把webform2中选择的数据传回webform1显示出来
- xml接口类型的数据(把其中的数据显示出来)
- xml接口类型的数据(把其中的数据显示出来)
- VC中用ADO和DataGrid控件显示和更新数据库中的数据
- 在例13.17的基础上,修改程序,将存放在c数组中的数据读入并显示出来
- 关于用java对excel数据扫描到数据库中然后在导出来后用excel打开的程序:
- VC++中向txt文档中写入16进制数据然后以16进制数显示出来
- 让VC编译出来的程序不显示CMD黑色窗口
- 练习1-10 编写一个将输入复制到输出的的程序,并将其中的制表符替换成\t,把回退符替换成\b,把反斜杠\替换成\\,这样可以将制表符和回退符以可见的方式显示出来。
- 练习 1- 10 编写一个将输入复制到输出的程序,并将其中的制表符替换成 \t,把回退符替换成\b,把反斜杠替换为\\。 这样就可以将制表符和退格符以可见的方式显示出来。
- 【微信小程序+ES6新特性应用】通过对类的操作来处理数据后显示在视图界面
- 编写一个程序,将输入复制到输出,并将其中的制表符替换为\t,把回退符替换为\b,把反斜杠替换为\\,这样可以把制表符和回退符以可见的方式显示出来。