#include<string.h>
typedef struct{
char name[20]
int number
int grade
int class
float mark[10]
float average
}T
void show(T *student,int *tp,int n) /* 把成绩显示在屏幕上 */
{
int i,j
char a[3]=" "
printf("***********************************************************\n")
printf(" name number grade class average order\n")
for(i=0i<ni++)
{
printf("-----------------------------------------------------------\n")
printf("%d:\n",i+1)
printf(" %s %d %d %d %f %d\n",student[tp[i]].name,student[tp[i]].number,student[tp[i]].grade,student[tp[i]].class,student[tp[i]].average,tp[i]+1)
printf("mark:")
for(j=0j<2j++)
printf("%s%d:%f",a,j+1,student[tp[i]].mark[j])
printf("\n")
}
printf("***********************************************************\n")
printf("\n\n\n")
}
void writefile(T *student,int n) /* 把成绩存在磁盘上 */
{
FILE *fp
int i,j
if((fp=fopen("d:\\kanwei.txt","w+"))==NULL)
{
printf("can't open file")
exit(0)
}
for(i=0i<=ni++)
{
fprintf(fp,"%s %d %d %d ",student[i].name,student[i].number,student[i].grade,student[i].class)
for(j=0j<2j++)
fprintf(fp,"%f ",student[i].mark[j])
fprintf(fp,"%f\n",student[i].average)
}
fclose(fp)
}
void students(T *student,T *temp,int m,int n,int k) /* 实现两个结构体的拷贝 */
{
int i
if(k==0)
{
strcpy(student[n].name,temp[m].name)
student[n].number=temp[m].number
student[n].grade=temp[m].grade
student[n].class=temp[m].class
for(i=0i<2i++)
student[n].mark[i]=temp[m].mark[i]
student[n].average=temp[m].average
}
else if(k==1)
{
strcpy(temp[m].name,student[n].name)
temp[m].number=student[n].number
temp[m].grade=student[n].grade
temp[m].class=student[n].class
for(i=0i<2i++)
temp[m].mark[i]=student[n].mark[i]
temp[m].average=student[n].average
}
}
void addfile(T *student,int n) /* 加入新学生到文件 */
{
T temp[2]
int i,j=1
float ave=0.0
printf("Please input the student:\n")
printf(" name number grade class mark1 mark2\n")
printf("****************************************************\n")
scanf("%s",temp[0].name)
scanf("%d",&temp[0].number)
scanf("%d",&temp[0].grade)
scanf("%d",&temp[0].class)
for(i=0i<2i++)
{
scanf("%f",&temp[0].mark[i])
ave=ave+temp[0].mark[i]
}
temp[0].average=ave=ave/2
i=0
while(ave<=student[i].average&&i<n)
i++
students(student,temp,j%2,i,1)/* temp[j/2]=student[i]*/
students(student,temp,(j+1)%2,i,0)/* student[i]=stu*/
for(i<ni++)
{
j++
students(student,temp,j%2,i+1,1)/* temp[(i+2)/2]=student[i+1]*/
students(student,temp,(j+1)%2,i+1,0)/* student[i+1]=temp[(i+1)/2]*/
}
writefile(student,i)
}
void showall(T *student,int n) /* 显示文件中所有的学生 */
{
int i
int a[30]
for(i=0i<ni++)
a[i]=i
show(student,a,n)
}
int find(T *student,int n,int *tp) /* 在文件中查询学生可以多行查询 */
{
int k,im=0,i,m,num,gra,clas
char na[20]
float ord
printf("*******************************\n")
printf(" name n&g&c ave order\n")
printf(" 1 2 3 4 \n")
printf("*******************************\n")
scanf("%d",&k)
switch(k)
{
case 1:
scanf("%s",&na)
for(i=0i<ni++)
{
if(strcmp(student[i].name,na)==0)
{
tp[im++]=i
}
}
break
case 2:
scanf("%d%d%d",&num,&gra,&clas)
for(i=0i<ni++)
{
if(student[i].number==num&&student[i].grade==gra&&student[i].class==clas)
{
tp[im++]=i
}
}
break
case 3:
scanf("%f",&ord)
for(i=0i<ni++)
{
if(ord==student[i].average)
{
tp[im++]=i
}
}
break
case 4:
scanf("%d",&m)
if(m<=n)
{
tp[im++]=m-1
}
break
case 5:
break
default:
printf("error operate!\n")
exit(0)
}
if(im>=1)
show(student,tp,im)
if(im==0&&k<5&&k>=1)
printf("cant find!\n")
return(im)
}
dele(T *student,int n,int *tp) /* 对某个学生进行删除 */
{
int j
printf("choose the student:\n")
j=find(student,n,tp)
if(j>=1)
{
if(j>1)
{
printf("Which one do you want to choose?\n")
scanf("%d",&j)
j=tp[j-1]
}
else
j=tp[0]
for(j<n-1j++)
students(student,student,j+1,j,0)
writefile(student,j-1)
}
}
void modify(T *student,int n,int *tp) /* 对某个学生进行修改 */
{
dele(student,n,tp)
addfile(student,n-1)
}
void readfile(int m) /* 读取文件中的数据,程序的基础 */
{
FILE *fp
T student[30]
float mark[10],ave
int i=0,j,tp[20]
if((fp=fopen("d:\\kanwei.txt","a+t"))==NULL)
{
printf("can't open file")
exit(0)
}
while(fscanf(fp,"%s%d%d%d",student[i].name,&student[i].number,&student[i].grade,&student[i].class)!=EOF)
{
for(j=0j<2j++)
{
fscanf(fp,"%f",&mark[j])
student[i].mark[j]=mark[j]
}
fscanf(fp,"%f",&ave)
student[i].average=ave
i++
}
fclose(fp)
switch(m)
{
case 1:
find(student,i,tp)
break
case 2:
addfile(student,i)
break
case 3:
dele(student,i,tp)
break
case 4:
modify(student,i,tp)
break
case 5:
showall(student,i)
break
default:
exit(0)
}
}
main() /* 主程序 */
{
int i=1
while(i)
{
printf(" Choose the operate:\n")
printf("******************************************************\n")
printf(" find add delete modify showall exit\n")
printf(" 1 2 3 4 5 0\n")
printf("******************************************************\n")
scanf("%d",&i)
readfile(i)
}
}
(这是一个关于成绩系统的,下面的可以参照,我也不知道是做什么的。)
用ODBC吧,不过还是要用到MFC..知道创建数据源吗? 首先创建一个名为rsgl(举例而已,自己取个)的数据源连接数据库,然后写如下代码通过数据源访问数据库:
C/C++ code
#include "afxdb.h"
//---------------------------------------------------------------
// Create and open a database object
// do not load the cursor library
CDatabase db
//db.OpenEx( NULL, CDatabase::forceOdbcDialog )
db.OpenEx( "DSN=[color=#FF0000]rsgl[/color]UID=PWD=", CDatabase::noOdbcDialog )
// Create and open a recordset object
// directly from CRecordset. Note that a
// table must exist in a connected database.
// Use forwardOnly type recordset for best
// performance, since only MoveNext is required
CRecordset rs( &db )
rs.Open( CRecordset::forwardOnly,
_T( "SELECT * FROM system_table" ) )
// Create a CDBVariant object to
// store field data
CDBVariant varValue
// Loop through the recordset,
// using GetFieldValue and
// GetODBCFieldCount to retrieve
// data in all columns
short nFields = rs.GetODBCFieldCount( )
while( !rs.IsEOF( ) )
{
for( short index = 0index <nFieldsindex++ )
{
rs.GetFieldValue( index, varValue )
// do something with varValue
AfxMessageBox(*varValue.m_pstring)
}
rs.MoveNext( )
}
rs.Close( )
db.Close( )
(不知道有没有用,我其他地方找的。)
1、C/C++与数据库交互,像 mssql/ mysql / oracle 等,一般都有成熟的第三方库,这些库里面无非就是封装了与数据库通讯的方式和通讯协议搜一下要用的数据库相关的 API 文档,会说得很清楚任何文件都是二进制数据,关键是数据存储的组织方式通用扩展名的文件,像gif/doc/jpg/wav,格式都是固定的。
2、举个例子,连接SQL:
// 打开数据库strDBClass.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0Data Source=%sJet OLEDB:Database Password=%s"), m_strUnEntryptMdbFilePath,m_strMDBPassword)
// 创建连接
HRESULT hr = m_pConnection.CreateInstance(_uuidof(Connection))
_ConnectionPtr m_pConnection->Open(m_strDBClass,_T(""),_T(""),adConnectUnspecified)
// 声明表单指针
_RecordsetPtr pBandRecordset
pBandRecordset.CreateInstance(__uuidof(Recordset))
// 执行语句
CString strSQL(L"SELECT * FROM [Band]")
m_pConnection->Execute((LPCTSTR)strSQL,NULL,0)
// 提取某一项 例如BandInfo
int iBandInfo = wcscmp(colum, L"BandInfo")
while(!recordsetPtr->adoEOF)
{
var = recordsetPtr->GetCollect(colum)
if(var.vt != VT_NULL)
strName = (LPCSTR)_bstr_t(var)
recordsetPtr->MoveNext()
}
使用C++编程语言,连接对Access数据库进行 *** 作,常用的方法有DAO和ADO两种方式,本文将介绍采用ADO的方式方位Access数据库。先介绍一下ADO,ADO (ActiveX Data Objects) 是一个用于存取数据源的COM组建。它提供了编程语言和统一数据访问方式OLE DB的一个中间层。允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。
在程序的开始,首先导入所需要的库:#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF", "adoEOF") ,这里重命名EOF是必要的,因为典型的VC应用都已经定义了EOF作为常数-1。
完整的程序如下,以注释的形式来对程序进行解释:
_ConnectionPtr m_pConnection //连接access数据库的链接对象
_RecordsetPtr m_pRecordset //结果集对象
CoInitialize(NULL) //初始化
m_pConnection.CreateInstance(__uuidof(Connection))//实例化对象
//连到具体某个mdb ,此处的的Provider语句因Access版本的不同而有所不同。
try
{
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0Data Source=MyAccess.mdb","","", adModeUnknown)
}
catch(_com_error e)
{
AfxMessagebox(_T("数据库连接失败!"))
return
}
m_pRecordset.CreateInstance(__uuidof(Recordset))//实例化结果集对象
//执行sql语句
try
{
CString sql= _T("select * from Patient")
m_pRecordset->Open(sql, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText)
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage())
if(m_pConnection->State)
{
m_pConnection->Close()
m_pConnection= NULL
}
return
}
//处理结果集
try
{
//若结果为空,结束
if(m_pRecordset->BOF)
{
AfxMessageBox_T(("表内数据为空!"))
if(m_pConnection->State)
{
m_pRecordset->Close()
m_pRecordset = NULL
m_pConnection->Close()
m_pConnection= NULL
}
return
}
//游标定位到第一条记录
m_pRecordset->MoveFirst()
_variant_t var //从结果集中取出的数据放到var中
char *name
while(!m_pRecordset->adoEOF)
{
var= m_pRecordset->GetCollect("Name") //要取字段的名称。
if(var.vt != VT_NULL)
{
name= _com_util::ConvertBSTRToString((_bstr_t)var) //转换成char*类型
}
string MyName = name
m_pRecordset->MoveNext()
}
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMssage())
}
//退出程序时的处理 ,关闭数据库的相关 *** 作
if(m_pConnection->State)
{
m_pRecordset->Close()
m_pRecordset = NULL
m_pConnection->Close()
m_pConnection= NULL
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)