求关于易语言ACCESS数据库与高级表格的详细教程源码(用的是数据库连接与记录集)高分悬赏!!

求关于易语言ACCESS数据库与高级表格的详细教程源码(用的是数据库连接与记录集)高分悬赏!!,第1张

.版本 2

.子程序 建立mdb数据库, 整数型, 公开, 成功返回0,失败返回-1和-2。注意:已经存在的库和表,就不能再建立了。

.参数 路径, 文本型, , 要存放文件的路径

.参数 接收文件名, 文本型, , 要存放的库文件名

.参数 密码, 文本型, 可空, 库文件密码

.参数 数据表名, 文本型, , 表名

.参数 字段名, 文本型, , 个字段的名字、类型、长度的字符串

.参数 删除表, 逻辑型, 可空, 是否删除表,默认为假

.参数 删除字段, 逻辑型, 可空, 是否删除字段,默认为假

.局部变量 connad, 对象

.局部变量 conn, 对象

.局部变量 Connstr, 文本型

Connstr = “Provider=Microsoft.Jet.OLEDB.4.0Data Source=” + 路径 + “\” + 接收文件名 + 选择 (是否为空 (密码), “”, “Jet OLEDB:Database Password=” + 密码)

connad.清除 ()

conn.清除 ()

.如果 (connad.创建 (“ADOX.Catalog”, ) = 假)

    输出调试文本 (“ADOX.Catalog对象创建失败”)

    返回 (-1)

.否则

    connad.通用方法 (“Create”, Connstr)

.如果结束

' connad.查看 ()

.如果 (conn.创建 (“Adodb.Connection”, ) = 假)

    输出调试文本 (“Adodb.Connection对象创建失败”)

    返回 (-2)

.否则

    conn.方法 (“Open”, Connstr)

    .如果 (删除表 = 真)

        conn.对象型方法 (“Execute”, “DROP TABLE ” + 数据表名)  ' 删除表

        输出调试文本 (“删除成功”)

    .否则

        .如果 (删除字段 = 真)

            conn.对象型方法 (“Execute”, “ALTER TABLE [” + 数据表名 + “] DROP COLUMN [” + 字段名 + “]”)  ' 删除字段

            输出调试文本 (“zdm:” + 字段名)

        .否则

            conn.对象型方法 (“Execute”, “create table ” + 数据表名 + “(” + 字段名 + “)”)  ' 建立新表

        .如果结束

    .如果结束

.如果结束

conn.方法 (“Close”, )

删除表 = 假

删除字段 = 假

返回 (0)

.子程序 取字段类型名, 文本型, 公开, 取字段类型名返回中文

.参数 类型, 整数型, 可空

.局部变量 结果, 文本型

.判断开始 (类型 = 17)

    结果 = “数字[字节型](Byte)”

.判断 (类型 = 3)

    结果 = “数字[长整型](Long)”

.判断 (类型 = 2)

    结果 = “数字[整型](Short)”

.判断 (类型 = 4)

    结果 = “数字[单精度](Single)”

.判断 (类型 = 5)

    结果 = “数字[双精度](Double)”

.判断 (类型 = 6)

    结果 = “货币型(Currency)”

.判断 (类型 = 130)

    结果 = “文本型(Char)”

.判断 (类型 = 11)

    结果 = “逻辑型(BIT)”

.判断 (类型 = 204)

    结果 = “二进制型(Binary)”

.判断 (类型 = 3)

    结果 = “自动编号(Counter)”

.判断 (类型 = 203)

    结果 = “备注型(Memo)”

.判断 (类型 = 7)

    结果 = “日期/时间(Time)”

.判断 (类型 = 131)

    结果 = “小数型(Decimal)”

.判断 (类型 = 0)

    结果 = “#空白型字段(Empty)”

.默认

    结果 = “未知数据,可能会导致数据出错。”

.判断结束

返回 (结果)

.子程序 取表名, 逻辑型, 公开

.参数 路径文件名, 文本型

.参数 密码, 文本型, 可空

.参数 文件名, 文本型, , 文件名,无需写路径

.参数 表名数组, 文本型, 参考 数组

.局部变量 Mycat对象, 对象

.局部变量 Tables对象, 对象

.局部变量 连接文本, 文本型

.局部变量 i, 整数型

.局部变量 表数量, 整数型

.局部变量 表名, 文本型

.如果真 (Mycat对象.创建 (“ADOX.Catalog”, ) = 假)

    信息框 (“你的机器上没有安装ADO。文件位置是C:\Program Files\Common Files\System\ado\Msado.dll”, 0, )

    结束 ()

.如果真结束

连接文本 = “Provider=MicroSoft.Jet.OLEDB.4.0Data Source=” + 文件名 + 选择 (是否为空 (密码), “”, “Jet OLEDB:Database Password=” + 密码)

Mycat对象.写属性 (“ActiveConnection”, 连接文本)

Tables对象 = Mycat对象.读对象型属性 (“Tables”, )

表数量 = Tables对象.读数值属性 (“Count”, )

.计次循环首 (表数量, i)

    表名 = Tables对象.读对象型属性 (“Item”, i - 1).读文本属性 (“Name”, )  ' 序号从0开始

    .如果真 (取文本左边 (表名, 4) ≠ “MSys”)  ' 过虑掉系统表名

        加入成员 (表名数组, 表名)

        ' 输出调试文本 (“表名:” + 表名)

    .如果真结束

.计次循环尾 ()

Tables对象.清除 ()

Mycat对象.清除 ()

返回 (真)

.子程序 显示字段信息, 整数型, 公开

.参数 路径, 文本型, , 要存放文件的路径

.参数 接收文件名, 文本型, , 要存放的库文件名

.参数 密码, 文本型, 可空, 库文件密码

.参数 数据表名, 文本型, , 表名

.局部变量 连接对象, 对象

.局部变量 表对象, 对象

.局部变量 连接文本, 文本型

.局部变量 表数计次, 整数型

.局部变量 表数量, 整数型

.局部变量 表名, 文本型

.局部变量 字段数量, 整数型

.局部变量 字段名, 文本型

.局部变量 字段计次, 整数型

.局部变量 字段类型, 整数型

.局部变量 字段长度, 整数型

.如果真 (连接对象.创建 (“ADOX.Catalog”, ) = 假)

    信息框 (“你的机器上没有安装ADO。文件位置是C:\Program Files\Common Files\System\ado\Msado.dll”, 0, )

    结束 ()

.如果真结束

连接文本 = “Provider=Microsoft.Jet.OLEDB.4.0Data Source=” + 路径 + “\” + 接收文件名 + 选择 (是否为空 (密码), “”, “Jet OLEDB:Database Password=” + 密码)

输出调试文本 (密码)

输出调试文本 (密码)

连接对象.写属性 (“ActiveConnection”, 连接文本)

表对象 = 连接对象.读对象型属性 (“Tables”, )

' 表数量 = Tables对象.读数值属性 (“Count”, )

表名 = 数据表名

字段数量 = 表对象.读对象型属性 (“Item”, 表名).读对象型属性 (“Columns”, ).读数值属性 (“Count”, )

.计次循环首 (字段数量, 字段计次)

    字段名 = 表对象.读对象型属性 (“Item”, 表名).读对象型属性 (“Columns”, ).读对象型属性 (“Item”, 字段计次 - 1).读文本属性 (“Name”, )

    字段类型 = 表对象.读对象型属性 (“Item”, 表名).读对象型属性 (“Columns”, ).读对象型属性 (“Item”, 字段计次 - 1).读数值属性 (“Type”, )

    字段长度 = 表对象.读对象型属性 (“Item”, 表名).读对象型属性 (“Columns”, ).读对象型属性 (“Item”, 字段计次 - 1).读数值属性 (“DefinedSize”, )

    ' 输出调试文本 (到文本 (字段长度))

    ' 输出调试文本 (取类型名 (字段类型))

    ' 输出调试文本 (到文本 (字段类型))

.计次循环尾 ()

表对象.清除 ()

连接对象.清除 ()

返回 (0)

.子程序 取字段类型1, 文本型, 公开, 取字段类型名返回英文

.参数 类型, 文本型, 可空

.局部变量 结果, 文本型

.判断开始 (类型 = “数字[字节型]”)

    结果 = “Byte”

.判断 (类型 = “数字[长整型]”)

    结果 = “Long”

.判断 (类型 = “数字[整型]”)

    结果 = “Short”

.判断 (类型 = “数字[单精度]”)

    结果 = “Single”

.判断 (类型 = “数字[双精度]”)

    结果 = “Double”

.判断 (类型 = “货币型”)

    结果 = “Currency”

.判断 (类型 = “文本型”)

    结果 = “Char”

.判断 (类型 = “文本1”)

    结果 = “Text(n)”

.判断 (类型 = “逻辑型”)

    结果 = “BIT”

.判断 (类型 = “二进制型”)

    结果 = “Binary”

.判断 (类型 = “自动编号”)

    结果 = “Counter”

.判断 (类型 = “备注型”)

    结果 = “Memo”

.判断 (类型 = “日期/时间”)

    结果 = “Time”

.判断 (类型 = “小数型”)

    结果 = “Decimal”

.判断 (类型 = “”)

    结果 = “”

.默认

    结果 = “未知数据,可能会导致数据出错。”

.判断结束

返回 (结果)

.子程序 取Access密码, 逻辑型, 公开, 取Access密码,成功返回真,失败返回假

.参数 路径文件名, 文本型

.参数 密码, 文本型

.参数 版本, 文本型

.局部变量 文件号

.局部变量 加密标志, 整数型

.局部变量 PassSource97, 字节型, , "13"

.局部变量 PassSource2k, 字节型, , "13"

.局部变量 i

.局部变量 temp, 字节型

.局部变量 a

.局部变量 标志, 逻辑型

.局部变量 结果文本, 文本型

PassSource97 = { 134, 251, 236, 55, 93, 68, 156, 250, 198, 94, 40, 230, 19 }

PassSource2k = { 161, 236, 122, 156, 225, 40, 52, 138, 115, 123, 210, 223, 80 }  ' 加密标志是0x13(19)

文件号 = 打开文件 (路径文件名, 1, )

移动读写位置 (文件号, #文件首, 20)  ' / 0x42处

读入数据 (文件号, temp)

.判断开始 (到数值 (temp) = 0)

    版本 = “ACCESS_97”

    .变量循环首 (1, 13, 1, i)

        移动读写位置 (文件号, #文件首, 65 + i)  ' 0x42处

        读入数据 (文件号, temp)

        a = 位异或 (到数值 (temp), PassSource97 [i])

        .如果真 (a = 0)

            密码 = “密码为空”

        .如果真结束

        结果文本 = 结果文本 + 字符 (a)

    .变量循环尾 ()

.默认

    版本 = “ACCESS_2K”

    移动读写位置 (文件号, #文件首, 98)  ' 0x62处

    读入数据 (文件号, temp)

    标志 = 假

    加密标志 = 位异或 (到数值 (temp), 19)

    .变量循环首 (1, 26, 2, i)

        移动读写位置 (文件号, #文件首, 65 + i)  ' 0x42处

        读入数据 (文件号, temp)

        .如果真 (到数值 (temp) = 0)

            跳出循环 ()

        .如果真结束

        标志 = 取反 (标志)

        .判断开始 (标志)

            a = 位异或 (位异或 (到数值 (temp), PassSource2k [(i + 1) ÷ 2]), 加密标志)

            .如果真 (a < 32 或 a > 126)

                密码 = “密码为空”

            .如果真结束

        .默认

            a = 位异或 (到数值 (temp), PassSource2k [(i + 1) ÷ 2])

        .判断结束

        结果文本 = 结果文本 + 字符 (a)

    .变量循环尾 ()

.判断结束

密码 = 结果文本

关闭文件 (文件号)

返回 (真)

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()

}

#include<stdio.h>

#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( )

(不知道有没有用,我其他地方找的。)


欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/sjk/9915043.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-03
下一篇2023-05-03

发表评论

登录后才能评论

评论列表(0条)

    保存