c与数据库访问技术
你搞清楚本机的数据库是怎么访问了,访问其他的机器是一样的
在控制面板里找到odbc管理器,在里面创建数据源
❷ C++中ADO访问数据库方法
一、ADO概述
ADO是Microsoft为最新和最强大的数据访问范例 OLE DB 而设计的,是一个便于使用的应用程序层接口。ADO 使您能够编写应用程序以通过 OLE. DB 提供者访问和操作数据库服务器中的数据。ADO 最主要的优点是易于使用、速度快、内存支出少和磁盘遗迹小。ADO 在关键的应用方案中使用最少的网络流量,并且在前端和数据源之间使用最少的层数,所有这些都是为了提供轻量、高性能的接口。之所以称为 ADO,是用了一个比较熟悉的暗喻,OLE 自动化接口。
OLE DB是一组”组件对象模型”(COM) 接口,是新的数据库低层接口,它封装了ODBC的功能,并以统一的方式访问存储在不同信息源中的数据。OLE DB是Microsoft UDA(Universal Data Access)策略的技术基础。OLE DB 为任何数据源提供了高性能的访问,这些数据源包括关系和非关系数据库、电子邮件和文件系统、文本和图形、自定义业务对象等等。也就是说,OLE DB 并不局限于 ISAM、Jet 甚至关系数据源,它能够处理任何类型的数据,而不考虑它们的格式和存储方法。在实际应用中,这种多样性意味着可以访问驻留在 Excel 电子数据表、文本文件、电子邮件/目录服务甚至邮件服务器,诸如 Microsoft Exchange 中的数据。但是,OLE DB 应用程序编程接口的目的是为各种应用程序提供最佳的功能,它并不符合简单化的要求。您需要的API 应该是一座连接应用程序和OLE DB 的桥梁,这就是 ActiveX Data Objects (ADO)。
二、在VC中使用ADO(开发步骤如下:)
1、引入ADO库文件
使用ADO前必须在工程的stdafx.h头文件里用直接引入符号#import引入ADO库文件,以使编译器能正确编译。代码如下所示:
用#import引入ADO库文件
#import "c:\program files\common files\system\ado\msado15.dll"no_namespaces rename("EOF" adoEOF")
这行语句声明在工程中使用ADO,但不使用ADO的名字空间,并且为了避免常数冲突,将常数EOF改名为adoEOF。现在不需添加另外的头文件,就可以使用ADO接口了。
2、初始化OLE/COM库环境
必须注意的是,ADO库是一组COM动态库,这意味应用程序在调用ADO前,必须初始化OLE/COM库环境。在MFC应用程序里,一个比较好的方法是在应用程序主类的InitInstance成员函数里初始化OLE/COM库环境。
BOOL CMyAdoTestApp::InitInstance()
{
if(!AfxOleInit())//这就是初始化COM库
{
AfxMessageBox(“OLE初始化出错!”);
return FALSE;
}
……
}
3、ADO接口简介
ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。
_ConnectionPtr接口返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的sql语句,如一个存储过程。使用_ConnectionPtr接口返回一个记录集不是一个好的使用方法。对于要返回记录的操作通常用_RecordserPtr来实现。而用_ConnectionPtr操作时要想得到记录条数得遍历所有记录,而用_RecordserPtr时不需要。
_CommandPtr接口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,你可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。如果你只执行一次或几次数据访问操作,后者是比较好的选择。但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr接口执行存储过程和SQL语句。
_RecordsetPtr是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给_RecordsetPtr的connection成员变量,让它自己创建数据连接。如果你要使用多个记录集,最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口
,然后使用_RecordsetPtr执行存储过程和SQL语句。
4、使用_ConnectionPtr接口
_ConnectionPtr主要是一个连接接口,取得与数据库的连接。它的连接字符串可以是自己直接写,也可以指向一个ODBC DSN。
_ConnectionPtr pConn;
if (FAILED(pConn.CreateInstance("ADODB.Connection")))
{
AfxMessageBox("Create Instance failed!");
return;
}
CString strSRC;
strSRC="Driver=SQL Server;Server=";
strSRC+="suppersoft";
strSRC+=";Database=";
strSRC+="mydb";
strSRC+=";UID=SA;PWD=";
CString strSQL = "Insert into student(no,name,sex,address) values(3,'aaa','male','beijing')";
_variant_t varSRC(strSRC);
_variant_t varSQL(strSQL);
_bstr_t bstrSRC(strSRC);
if (FAILED(pConn->Open(bstrSRC,"","",-1)))
{
AfxMessageBox("Can not open Database!");
pConn.Release();
return;
}
COleVariant vtOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
pConn->Execute(_bstr_t(strSQL),&vtOptional,-1);
pConn.Release();
AfxMessageBox("ok!");
5、使用_RecordsetPtr接口(以连接SQL Server为例)
_RecordsetPtr pPtr;
if (FAILED(pPtr.CreateInstance("ADODB.Recordset")))
{
AfxMessageBox("Create Instance failed!");
return FALSE;
}
CString strSRC;
strSRC="Driver=SQL Server;Server=";
strSRC+="210.46.141.145";
strSRC+=";Database=";
strSRC+="mydb";
strSRC+=";UID=sa;PWD=";
strSRC+="sa";
CString strSQL = "select id,name,gender,address from personal";
_variant_t varSRC(strSRC);
_variant_t varSQL(strSQL);
if(FAILED(pPtr->Open(varSQL,varSRC,adOpenStatic,adLockOptimistic,adCmdText)))
{
AfxMessageBox("Open table failed!");
pPtr.Release();
return FALSE;
}
while(!pPtr->GetadoEOF())
{
_variant_t varNo;
_variant_t varName;
_variant_t varSex;
_variant_t varAddress;
varNo = pPtr->GetCollect ("id");
varName = pPtr->GetCollect ("name");
varSex = pPtr->GetCollect ("gender");
varAddress = pPtr->GetCollect ("address");
CString strNo =(char *)_bstr_t(varNo);
CString strName =(char *)_bstr_t(varName);
CString strSex =(char *)_bstr_t(varSex);
CString strAddress =(char *)_bstr_t(varAddress);
strNo.TrimRight();
strName.TrimRight();
strSex.TrimRight();
strAddress.TrimRight();
int nCount = m_list.GetItemCount();
int nItem = m_list.InsertItem (nCount,_T(""));
m_list.SetItemText (nItem,0,strNo);
m_list.SetItemText (nItem,1,strName);
m_list.SetItemText (nItem,2,strSex);
m_list.SetItemText (nItem,3,strAddress);
pPtr->MoveNext();
}
pPtr->Close();
pPtr.Release();
6、使用_CommandPtr接口
_CommandPtr接口返回一个Recordset对象,并且提供了更多的记录集控制功能,以下代码示例了使用_CommandPtr接口的方法:
代码:使用_CommandPtr接口获取数据
_CommandPtr pCommand;
_RecordsetPtr pRs;
pCommand.CreateInstance(__uuidof(Command));
pCommand->ActiveConnection=pConn;
pCommand->CommandText="select * from student";
pCommand->CommandType=adCmdText;
pCommand->Parameters->Refresh();
pRs=pCommand->Execute(NULL,NULL,adCmdUnknown);
_variant_t varValue = pRs->GetCollect("name");
Cstring strValue=(char*)_bstr_t(varValue);
7、关于数据类型转换由于COM对象是跨平台的,它使用了一种通用的方法来处理各种类型的数据,因此Cstring 类和COM对象是不兼容的,我们需要一组API来转换COM对象和C++类型的数据。_vatiant_t和_bstr_t就是这样两种对象。它们提供了通用的方法转换COM对象和C++类型的数据。
详情请见 http://hi..com/lninglove/blog/item/3f6cec22959e4ca34723e833.html
❸ 用c语言怎么连接数据库呢
25.2.2. C API函数概述
这里归纳了C API可使用的函数,并在下一节详细介绍了它们。请参见25.2.3节,“C API函数描述”。
函数
描述
mysql_affected_rows()
返回上次UPDATE、DELETE或INSERT查询更改/删除/插入的行数。
mysql_autocommit()
切换 autocommit模式,ON/OFF
mysql_change_user()
更改打开连接上的用户和数据库。
mysql_charset_name()
返回用于连接的默认字符集的名称。
mysql_close()
关闭服务器连接。
mysql_commit()
提交事务。
mysql_connect()
连接到MySQL服务器。该函数已不再被重视,使用mysql_real_connect()取代。
mysql_create_db()
创建数据库。该函数已不再被重视,使用SQL语句CREATE DATABASE取而代之。
mysql_data_seek()
在查询结果集中查找属性行编号。
mysql_debug()
用给定的字符串执行DBUG_PUSH。
mysql_drop_db()
撤销数据库。该函数已不再被重视,使用SQL语句DROP DATABASE取而代之。
mysql_mp_debug_info()
让服务器将调试信息写入日志。
mysql_eof()
确定是否读取了结果集的最后一行。该函数已不再被重视,可以使用mysql_errno()或mysql_error()取而代之。
mysql_errno()
返回上次调用的MySQL函数的错误编号。
mysql_error()
返回上次调用的MySQL函数的错误消息。
mysql_escape_string()
为了用在SQL语句中,对特殊字符进行转义处理。
mysql_fetch_field()
返回下一个表字段的类型。
mysql_fetch_field_direct()
给定字段编号,返回表字段的类型。
mysql_fetch_fields()
返回所有字段结构的数组。
mysql_fetch_lengths()
返回当前行中所有列的长度。
mysql_fetch_row()
从结果集中获取下一行
mysql_field_seek()
将列光标置于指定的列。
mysql_field_count()
返回上次执行语句的结果列的数目。
mysql_field_tell()
返回上次mysql_fetch_field()所使用字段光标的位置。
mysql_free_result()
释放结果集使用的内存。
mysql_get_client_info()
以字符串形式返回客户端版本信息。
mysql_get_client_version()
以整数形式返回客户端版本信息。
mysql_get_host_info()
返回描述连接的字符串。
mysql_get_server_version()
以整数形式返回服务器的版本号。
mysql_get_proto_info()
返回连接所使用的协议版本。
mysql_get_server_info()
返回服务器的版本号。
mysql_info()
返回关于最近所执行查询的信息。
mysql_init()
获取或初始化MYSQL结构。
mysql_insert_id()
返回上一个查询为AUTO_INCREMENT列生成的ID。
mysql_kill()
杀死给定的线程。
mysql_library_end()
最终确定MySQL C API库。
mysql_library_init()
初始化MySQL C API库。
mysql_list_dbs()
返回与简单正则表达式匹配的数据库名称。
mysql_list_fields()
返回与简单正则表达式匹配的字段名称。
mysql_list_processes()
返回当前服务器线程的列表。
mysql_list_tables()
返回与简单正则表达式匹配的表名。
mysql_more_results()
检查是否还存在其他结果。
mysql_next_result()
在多语句执行过程中返回/初始化下一个结果。
mysql_num_fields()
返回结果集中的列数。
mysql_num_rows()
返回结果集中的行数。
mysql_options()
为mysql_connect()设置连接选项。
mysql_ping()
检查与服务器的连接是否工作,如有必要重新连接。
mysql_query()
执行指定为“以Null终结的字符串”的SQL查询。
mysql_real_connect()
连接到MySQL服务器。
mysql_real_escape_string()
考虑到连接的当前字符集,为了在SQL语句中使用,对字符串中的特殊字符进行转义处理。
mysql_real_query()
执行指定为计数字符串的SQL查询。
mysql_refresh()
刷新或复位表和高速缓冲。
mysql_reload()
通知服务器再次加载授权表。
mysql_rollback()
回滚事务。
mysql_row_seek()
使用从mysql_row_tell()返回的值,查找结果集中的行偏移。
mysql_row_tell()
返回行光标位置。
mysql_select_db()
选择数据库。
mysql_server_end()
最终确定嵌入式服务器库。
mysql_server_init()
初始化嵌入式服务器库。
mysql_set_server_option()
为连接设置选项(如多语句)。
mysql_sqlstate()
返回关于上一个错误的SQLSTATE错误代码。
mysql_shutdown()
关闭数据库服务器。
mysql_stat()
以字符串形式返回服务器状态。
mysql_store_result()
检索完整的结果集至客户端。
mysql_thread_id()
返回当前线程ID。
mysql_thread_safe()
如果客户端已编译为线程安全的,返回1。
mysql_use_result()
初始化逐行的结果集检索。
mysql_warning_count()
返回上一个SQL语句的告警数。 详见:http://dev.mysql.com/doc/refman/5.1/zh/apis.html#c-api-function-overview
http://dev.mysql.com/doc/refman/5.0/en/c.html
❹ 如何用C实现对SQL数据库的操作
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "util.h" #include <sqlca.h>`` EXEC SQL INCLUDE SQLCA;main(){EXEC SQL BEGIN DECLARE SECTION; char firstname[13]; char userid[9]; char passwd[19]; EXEC SQL END DECLARE SECTION; EXEC SQL CONNECT TO sample; EXEC SQL SELECT FIRSTNME INTO :firstname FROM employee WHERE LASTNAME = 'JOHNSON'; printf( "First name = %s\n", firstname ); EXEC SQL CONNECT RESET;return 0;}上面是一个简单的静态嵌入SQL语句的应用程序。它包括了嵌入SQL的主要部分: (1)中的include SQLCA语句定义并描述了SQLCA的结构。SQLCA用于应用程序和数据库之间的通讯,其中的SQLCODE返回SQL语句执行后的结果状态。 (2)在BEGIN DECLARE SECTION和END DECLARE SECTION之间定义了宿主变量。宿主变量可被SQL语句引用,也可以被C语言语句引用。它用于将程序中的数据通过SQL语句传给数据库管理器,或从数据库管理器接收查询的结果。在SQL语句中,主变量前均有“:”标志以示区别。 (3)在每次访问数据库之前必须做CONNECT操作,以连接到某一个数据库上。这时,应该保证数据库实例已经启动。 (4)是一条选择语句。它将表employee中的LASTNAME为“JOHNSON”的行数据的FIRSTNAME查出,并将它放在firstname变量中。该语句返回一个结果。可以通过游标返回多个结果。当然,也可以包含update、insert和delete语句。 (5)最后断开数据库的连接。 从上例看出,每条嵌入式SQL语句都用EXEC SQL开始,表明它是一条SQL语句。这也是告诉预编译器在EXEC SQL和“;”之间是嵌入SQL语句。
❺ C语言连接Access数据库如何实现标准的c语言
1、C/C++与数据库交互,像 mssql/ mysql / oracle 等,一般都有成熟的第三方库,这些库里面无非就是封装了与数据库通讯的方式和通讯协议搜一下要用的数据库相关的 API 文档,会说得很清楚任何文件都是二进制数据,关键是数据存储的组织方式通用扩展名的文件,像gif/doc/jpg/wav,格式都是固定的。
2、举个例子,连接SQL:
//打开数据库
strDBClass.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=%s;JetOLEDB:DatabasePassword=%s"),m_strUnEntryptMdbFilePath,m_strMDBPassword);
//创建连接
HRESULThr=m_pConnection.CreateInstance(_uuidof(Connection));
_ConnectionPtrm_pConnection->Open(m_strDBClass,_T(""),_T(""),adConnectUnspecified);
//声明表单指针
_RecordsetPtrpBandRecordset;
pBandRecordset.CreateInstance(__uuidof(Recordset));
//执行语句
CStringstrSQL(L"SELECT*FROM[Band]");
m_pConnection->Execute((LPCTSTR)strSQL,NULL,0);
//提取某一项例如BandInfo
intiBandInfo=wcscmp(colum,L"BandInfo");
while(!recordsetPtr->adoEOF)
{
var=recordsetPtr->GetCollect(colum);
if(var.vt!=VT_NULL)
strName=(LPCSTR)_bstr_t(var);
recordsetPtr->MoveNext();
}
❻ 如何在c语言中编程访问数据库
第一种,数据库厂商提供的C变种,比如oracle的proc-c,简单点说,就是在C嵌入sql代码来实现数据库的访问。
第二种,数据库厂商提供的api,比如oracle的OCI。
❼ C++或C程序如何与数据库建立连接
当然能.
以比较流行的ORACLE为例,它就专门为C提供了专门的编程接口.OCI(oracle call interface).让C/C++代码更高效的访问ORACLE.不用其它方的连接缓存,最大的方便C开发人员.
同样DB2、Sysbase也有其专门访问接口,方便大应用级别的访问.
因为相对比较低级,所以要学的东西很多.
❽ 在C++中一般用什么技术连接数据库
要么用数据库的C API接口,要么用数据库的嵌入C扩充语言! 具体怎么写法,根据数据库不同而不同!!!
我知道的Visual C++的几种访问数据库,就有:
ODBC(Open DataBase Connectivity)
MFC ODBC(Microsoft Foundation Classes ODBC)
DAO (Data Access Object)
OLE DB(Object Link and Embedding DataBase)
ADO(ActiveX Data Object)
对不同的数据库有些区别的呀...
Access 和Server2000就大致一样,而Oracle有点不同(其实大概也差不了多少)
具体的问题还要具体的问好..
C++连接数据库有一个比较好的方法,使用OTL类库。
它已经封装了平常大多数关系数据库的连接操纵方式,如Oracle,MySQL,DB2,MS SQL等
官网:http://otl.sourceforge.net/
最主要它是跨平台,开源的。
我这儿有mysql的,使用的是for c的api,需要安装mysql,并加载mysql相应的库。
int main()
{
mySS ss;
ss.x = 5;
ss.y = 65;
cout << aa( &ss );
MYSQL *pdata;
MYSQL pp;
mysql_get_server_info( &pp );
MYSQL_RES *result;
MYSQL_ROW row;
//init
pdata = mysql_init( NULL );
if ( NULL == pdata ) cout << "Init failed.";
//connect
pdata = mysql_real_connect( pdata,"localhost", "root", "123", "test", MYSQL_PORT, NULL, 0 );
if ( NULL == pdata ) cout << "Connect failed.";
//query
int iq = mysql_query( pdata, "select * from www" );
if ( iq != 0 ) cout << "Query failed.";
//get result
result = mysql_store_result( pdata );
if ( NULL == result ) cout << " Get result failed.";
//fetch row
row = mysql_fetch_row( result );
if ( NULL == result ) cout << " Fetch row failed.";
//show field content
int iNum = mysql_num_fields(result);
for ( int ix=0; ix < iNum; ++ix )
{
cout << row[ ix ] << " ";
}
//fetch row
row = mysql_fetch_row( result );
if ( NULL == result ) cout << " Fetch row failed.";
for ( ix=0; ix < iNum; ++ix )
{
cout << row[ ix ] << " ";
}
mysql_free_result( result );
mysql_close( pdata );
return 0;
}
C 连Oracle
EXEC SQL BEGIN DECLARE SECTION;
char username[25];
char password[15];
char last_name[15];
EXEC SQL END DECLARE SECTION;
void sqlerr();
main()
{
EXEC SQL WHENEVER SQLERROR D0 sqlerr();
strcpy(username,"hello");
strcpy(password,"12345");
EXEC SQL CONNECT :username IDENTIFIED BY :password;
printf("connect database by [ %s ] successful ...",username);
}
sqlerror()
{
EXEC SQL WHENEVER SQLERROR CONTINUE;
fprintf(stderr,"\n database connect error !");
fprintf(stderr,"%s",sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACE WORK RELEASE;
exit(-1);
}
❾ 用C语言怎么实现与数据库的连接
#include<mysql/mysql.h>
#include<stdio.h>
intmain()
{
MYSQL*conn;
MYSQL_RES*res;
MYSQL_ROWrow;
char*server="localhost";//本地连接
char*user="root";//
char*password="525215980";//mysql密码
char*database="student";//数据库名
char*query="select*fromclass";//需要查询的语句
intt,r;
conn=mysql_init(NULL);
if(!mysql_real_connect(conn,server,user,password,database,0,NULL,0))
{
printf("Errorconnectingtodatabase:%s ",mysql_error(conn));
}else{
printf("Connected... ");
}
t=mysql_query(conn,query);
if(t)
{
printf("Errormakingquery:%s ",mysql_error(conn));
}else{
printf("Querymade... ");
res=mysql_use_result(conn);
if(res)
{
while((row=mysql_fetch_row(res))!=NULL)
{
//printf("num=%d ",mysql_num_fields(res));//列数
for(t=0;t<mysql_num_fields(res);t++)
printf("%8s",row[t]);
printf(" ");
}
}
mysql_free_result(res);
}
mysql_close(conn);
return0;
}
(9)c与数据库访问技术扩展阅读
C语言使用注意事项:
1、指针是c语言的灵魂,一定要灵活的使用它:
(1)、指针的声明,创建,赋值,销毁等
(2)、指针的类型转换,传参,回调等
2、递归调用也会经常用到:
(1)、递归遍历树结构
(2)、递归搜索
❿ 谁知道在C语言和数据库间进行数据传送,急!!!
你说的是纯C?
纯C可以嵌套sql,即pro*c,我所了解到的,C嵌入sql可以访问oracl,mysql,其他的没接触过,不清楚。oracle的以前写过,需要引入oracle的一个dll。
写出的代码是这样的:
exec
sql
include
sqlca
exec
sql
begin
declare
section
char
prname[20];
char
proctno[8];
exec
sql
end
declare
section
printf("Input
procno:");
scanf("%s",&procno);
exec
sql
select
prname
from
proct
where
proctno=:proctno
into
:prname;
printf("Proctname:
%s\n",prname);