当前位置:首页 » 服务存储 » c和存储过程怎么连接数据库
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c和存储过程怎么连接数据库

发布时间: 2022-07-05 09:28:42

⑴ C++连接数据库的时候怎么调用存储过程

给个例子给你看下:
...
_CommandPtr
m_cmdptr;
m_cmdptr.CreateInstance(__uuidof(
Command
)
);
_ParameterPtr
inParam2=NULL;
_ParameterPtr
inParam3=NULL;
_ParameterPtr
inParam4=NULL;
_ParameterPtr
outParam1=NULL;
_ParameterPtr
outParam2=NULL;
_ParameterPtr
outParam3=NULL;
inParam2.CreateInstance(__uuidof(Parameter));
inParam3.CreateInstance(__uuidof(Parameter));
inParam4.CreateInstance(__uuidof(Parameter));
outParam1.CreateInstance(__uuidof(Parameter));
outParam2.CreateInstance(__uuidof(Parameter));
outParam3.CreateInstance(__uuidof(Parameter));
m_cmdptr->ActiveConnection=m_pConnection;
m_cmdptr->CommandType=adCmdStoredProc;
m_cmdptr->CommandText=_bstr_t("proc_XXX");//存储过程的名称
//输入参数
inParam2=m_cmdptr->CreateParameter(_bstr_t("@P1"),adVarChar,adParamInput,32,_bstr_t(P1));
m_cmdptr->Parameters->Append(inParam2);
inParam3=m_cmdptr->CreateParameter(_bstr_t("@P2"),adVarChar,adParamInput,20,_bstr_t(P2));
m_cmdptr->Parameters->Append(inParam3);
//输出参数
outParam1=m_cmdptr->CreateParameter("@P4",adInteger,adParamOutput,sizeof(int));
m_cmdptr->Parameters->Append(outParam1);
outParam2=m_cmdptr->CreateParameter("@P5",adInteger,adParamOutput,sizeof(int));
m_cmdptr->Parameters->Append(outParam2);
outParam3=m_cmdptr->CreateParameter(_bstr_t("@P6"),adVarChar,adParamOutput,20,_bstr_t(P6));
m_cmdptr->Parameters->Append(outParam3);
//执行
m_cmdptr->Execute(NULL,NULL,adCmdStoredProc);
//取返回值
long
p1=m_cmdptr->Parameters->GetItem("@P4")->Value;
long
p2=m_cmdptr->Parameters->GetItem("@P5")->Value;
VARIANT
vtP6
=m_cmdptr->Parameters->GetItem("@P6")->Value;
if
(vtP6.vt
!=
VT_NULL)
strcpy(tp,(_bstr_t)vtP6);
m_cmdptr.Detach;

⑵ 关于存储过程中连接数据库问题

存储过程的概念
sql Server提供了一种方法,它可以将一些固定的操作集中起来由SQL Server数据库服务器来完成,以实现某个任务,这种方法就是存储过程。
存储过程是SQL语句和可选控制流语句的预编译集合,存储在数据库中,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其他强大的编程功能。
在SQL Server中存储过程分为两类:即系统提供的存储过程和用户自定义的存储过程。

可以出于任何使用SQL语句的目的来使用存储过程,它具有以下优点:
可以在单个存储过程中执行一系列SQL语句。
可以从自己的存储过程内引用其他存储过程,这可以简化一系列复杂语句。
存储过程在创建时即在服务器上进行编译,所以执行起来比单个SQL语句快,而且减少网络通信的负担。
安全性更高。
创建存储过程

在SQL Server中,可以使用三种方法创建存储过程 :
①使用创建存储过程向导创建存储过程。
②利用SQL Server 企业管理器创建存储过程。
③使用Transact-SQL语句中的CREATE PROCEDURE命令创建存储过程。

下面介绍使用Transact-SQL语句中的CREATE PROCEDURE命令创建存储过程
创建存储过程前,应该考虑下列几个事项:
①不能将 CREATE PROCEDURE 语句与其它 SQL 语句组合到单个批处理中。
②存储过程可以嵌套使用,嵌套的最大深度不能超过32层。
③创建存储过程的权限默认属于数据库所有者,该所有者可将此权限授予其他用户。
④存储过程是数据库对象,其名称必须遵守标识符规则。
⑤只能在当前数据库中创建存储过程。
⑥ 一个存储过程的最大尺寸为128M。

使用CREATE PROCEDURE创建存储过程的语法形式如下:

QUOTE:
CREATE PROC[EDURE]procere_name[;number][;number]
[{@parameter data_type}[VARYING][=default][OUTPUT]][,...n]
WITH
{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}]
[FOR REPLICATION]
AS sql_statement [ ...n ]

用CREATE PROCEDURE创建存储过程的语法参数的意义如下:

procere_name:用于指定要创建的存储过程的名称。
number:该参数是可选的整数,它用来对同名的存储过程分组,以便用一条 DROP PROCEDURE 语句即可将同组的过程一起除去。
@parameter:过程中的参数。在 CREATE PROCEDURE 语句中可以声明一个或多个参数。
data_type:用于指定参数的数据类型。
VARYING:用于指定作为输出OUTPUT参数支持的结果集。
Default:用于指定参数的默认值。
OUTPUT:表明该参数是一个返回参数。

例如:下面创建一个 简单的存储过程proctinfo,用于检索产品信息。
USE Northwind
if exists(select name from sysobjects
where name='proctinfo' and type = 'p')
drop procere proctinfo
GO

create procere proctinfo
as
select * from procts
GO
通过下述sql语句执行该存储过程:execute proctinfo
即可检索到产品信息。

执行存储过程

直接执行存储过程可以使用EXECUTE命令来执行,其语法形式如下:
[[EXEC[UTE]]
{ [@return_status=]
{procere_name[;number]|@procere_name_var} [[@parameter=]{value|@variable[OUTPUT]|[DEFAULT]}
[,...n]
[ WITH RECOMPILE ]

使用 EXECUTE 命令传递单个参数,它执行 showind 存储过程,以 titles 为参数值。showind 存储过程需要参数 (@tabname),它是一个表的名称。其程序清单如下:
EXEC showind titles
当然,在执行过程中变量可以显式命名:
EXEC showind @tabname = titles
如果这是 isql 脚本或批处理中第一个语句,则 EXEC 语句可以省略:
showind titles或者showind @tabname = titles

下面的例子使用了默认参数
USE Northwind
GO
CREATE PROCEDURE insert_Procts_1
( @SupplierID_2 int,
@CategoryID_3 int,
@ProctName_1 nvarchar(40)='无')
AS INSERT INTO Procts
(ProctName,SupplierID,CategoryID)
VALUES
(@ProctName_1,@SupplierID_2,@CategoryID_3)
GO
exec insert_Procts_1 1,1
Select * from Procts where SupplierID=1 and CategoryID=1
GO

下面的例子使用了返回参数
USE Northwind
GO
CREATE PROCEDURE query_procts
( @SupplierID_1 int,
@ProctName_2 nvarchar(40) output)
AS
select @ProctName_2 = ProctName from procts
where SupplierID = @SupplierID_1

执行该存储过程来查询SupplierID为1的产品名:
declare @proct nvarchar(40)
exec query_procts 1,@proct output
select '产品名'= @proct
go

查看存储过程
存储过程被创建之后,它的名字就存储在系统表sysobjects中,它的源代码存放在系统表syscomments中。可以使用使用企业管理器或系统存储过程来查看用户创建的存储过程。

使用企业管理器查看用户创建的存储过程

在企业管理器中,打开指定的服务器和数据库项,选择要创建存储过程的数据库,单击存储过程文件夹,此时在右边的页框中显示该数据库的所有存储过程。用右键单击要查看的存储过程,从弹出的快捷菜单中选择属性选项,此时便可以看到存储过程的源代码。

使用系统存储过程来查看用户创建的存储过程

可供使用的系统存储过程及其语法形式如下:
sp_help:用于显示存储过程的参数及其数据类型
sp_help [[@objname=] name]
参数name为要查看的存储过程的名称。
sp_helptext:用于显示存储过程的源代码
sp_helptext [[@objname=] name]
参数name为要查看的存储过程的名称。
sp_depends:用于显示和存储过程相关的数据库对象
sp_depends [@objname=]’object’
参数object为要查看依赖关系的存储过程的名称。
sp_stored_proceres:用于返回当前数据库中的存储过程列表

修改存储过程

存储过程可以根据用户的要求或者基表定义的改变而改变。使用ALTER PROCEDURE语句可以更改先前通过执行 CREATE PROCEDURE 语句创建的过程,但不会更改权限,也不影响相关的存储过程或触发器。其语法形式如下:
ALTERPROC[EDURE]procere_name[;number]
[{@parameterdata_type}
[VARYING][=default][OUTPUT]][,...n] [WITH
{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}]
[FOR REPLICATION]
AS
sql_statement [ ...n ]

重命名和删除存储过程

1. 重命名存储过程
修改存储过程的名称可以使用系统存储过程sp_rename,其语法形式如下:
sp_rename 原存储过程名称,新存储过程名称
另外,通过企业管理器也可以修改存储过程的名称。

删除存储过程

删除存储过程可以使用DROP命令,DROP命令可以将一个或者多个存储过程或者存储过程组从当前数据库中删除,其语法形式如下:
drop procere {procere} [,…n]
当然,利用企业管理器也可以很方便地删除存储过程。

存储过程的重新编译

在我们使用了一次存储过程后,可能会因为某些原因,必须向表中新增加数据列或者为表新添加索引,从而改变了数据库的逻辑结构。这时,需要对存储过程进行重新编译,SQL Server提供三种重新编译存储过程的方法 :
1、在建立存储过程时设定重新编译
语法格式:CREATE PROCEDURE procere_name WITH RECOMPILE AS sql_statement
2、在执行存储过程时设定重编译
语法格式: EXECUTE procere_name WITH RECOMPILE
3、通过使用系统存储过程设定重编译
语法格式为: EXEC sp_recompile OBJECT

系统存储过程与扩展存储过程

1.系统存储过程
系统存储过程存储在master数据库中,并以sp_为前缀,主要用来从系统表中获取信息,为系统管理员管理SQL Server提供帮助,为用户查看数据库对象提供方便。比如用来查看数据库对象信息的系统存储过程sp_help、显示存储过程和其它对象的文本的存储过程sp_helptext等。

2.扩展存储过程:
扩展存储过程以xp_为前缀,它是关系数据库引擎的开放式数据服务层的一部分,其可以使用户在动态链接库(DLL)文件所包含的函数中实现逻辑,从而扩展了Transact-SQL的功能,并且可以象调用Transact-SQL过程那样从Transact-SQL语句调用这些函数。
例: 利用扩展存储过程xp_cmdshell为一个操作系统外壳执行指定命令串,并作为文本返回任何输出。
执行代码:
use master
exec xp_cmdshell 'dir *.exe'
执行结果返回系统目录下的文件内容文本信息。

最后给大家举一个例子:

QUOTE:
/**
1、 在Northwind数据库中,创建一个带查询参数的存储过程,
要求在输入一个定购金额总额@total时,查询超出该值的所
有产品的相关信息,包括产品名称和供应商名称、单位数量、
单价、以及该产品的定购金额总额,并通过一个输出参数返回
满足查询条件的产品数
**/

IF exists (select * from SysObjects where name='more_than_total' and type='p')
drop procere more_than_total
go
CREATE PROCEDURE More_Than_Total
@total money = 0
AS
Declare @amount smallint
BEGIN
select distinct
P.proctName,
S.contactName,
P.UnitPrice

from Procts P inner join [order Details] O
on p.proctID=o.proctID inner join suppliers s
on p.supplierID=s.SupplierID
where O.proctID in
(select proctID
from [order Details]
group by proctId
having sum(quantity*unitprice)>@total
)
END
GO

⑶ 用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;

}

(3)c和存储过程怎么连接数据库扩展阅读

C语言使用注意事项:

1、指针是c语言的灵魂,一定要灵活的使用它:

(1)、指针的声明,创建,赋值,销毁等

(2)、指针的类型转换,传参,回调等

2、递归调用也会经常用到:

(1)、递归遍历树结构

(2)、递归搜索

⑷ 怎样使c#和存储过程连接将数据添加到数据库

你的意思是用c#调用存储过程了吧!
public static int ExecuteInsertStoreProcere(SqlParameter[] param,string storeName)
{
int result = 0;
using (SqlConnection con = getConnection())
{
con.Open();
SqlCommand cmd = new SqlCommand(storeName,con);
cmd.CommandType = CommandType.StoredProcere;
foreach(SqlParameter parm in param)
{
cmd.Parameters.Add(parm);
}

result=cmd.ExecuteNonQuery();
con.Close();
}
return result;
}

⑸ vc++与数据库连接的简单问题

可以用 ADO 连接数据库,下面是转自于VC知识库网站的文档。

ADO(Active Data Object,活动数据对象)实际上是一种基于COM(组件对象模型)的自动化接口(IDispatch)技术,并以OLE DB(对象连接和镶入的数据库)为基础,经过OLE DB精心包装后的数据库访问技术,利用它可以快速的创建数据库应用程序。 ADO提供了一组非常简单,将一般通用的数据访问细节进行封装的对象。由于ODBC数据源也提供了一般的OLE DB Privider,所以ADO不仅可以应用自身的OLE DB Privider,而且还可以应用所有的ODBC驱动程序。关于OLE DB和ADO的其它详细情况,读者可以自行查阅相关书籍或MSDN,这里就不一一说明了。让我们直接步入主题:如何掌握ADO这种数据库访问技术。ADO的操作方法和前面讲过的DAO的操作在很多方面存在相似之处,在这里,笔者为了更有效的说明它的使用方法,用VC6.0做了一个示例程序——AdoRWAccess,这个示例程序可以直接通过ADO来操作Access数据库,示例程序的运行效果如下图所示:

在示例程序中我们仍采用原库结构,数据库名Demo.mdb,库内表名DemoTable,表内字段名为Name(姓名)和Age(年龄)的两个字段,来构造示例程序操作所需的Access数据库,这也和上两篇文章的示例源码中的库结构相兼容。
下面让我们看看ADO数据库访问技术使用的基本步骤及方法:
首先,要用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序(DLL、EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dll的附属资源中,只需要直接用#import引用它既可。可以直接在Stdafx.h文件中加入下面语句来实现:

#import "c:\program files\common files\system\ado\msado15.dll" \
no_namespace \
rename ("EOF", "adoEOF")
其中路径名可以根据自己系统安装的ADO支持文件的路径来自行设定。当编译器遇到#import语句时,它会为引用组件类型库中的接口生成包装类,#import语句实际上相当于执行了API涵数LoadTypeLib()。#import语句会在工程可执行程序输出目录中产生两个文件,分别为*.tlh(类型库头文件)及*.tli(类型库实现文件),它们分别为每一个接口产生智能指针,并为各种接口方法、枚举类型,CLSID等进行声明,创建一系列包装方法。语句no_namespace说明ADO对象不使用命名空间,rename ("EOF", "adoEOF")说明将ADO中结束标志EOF改为adoEOF,以避免和其它库中命名相冲突。
其次,在程序初始过程中需要初始化组件,一般可以用CoInitialize(NULL);来实现,这种方法在结束时要关闭初始化的COM,可以用下面语句CoUnInitialize();来实现。在MFC中还可以采用另一种方法来实现初始化COM,这种方法只需要一条语句便可以自动为我们实现初始化COM和结束时关闭COM的操作,语句如下所示: AfxOleInit();
接着,就可以直接使用ADO的操作了。我们经常使用的只是前面用#import语句引用类型库时,生成的包装类.tlh中声明的智能指针中的三个,它们分别是_ConnectionPtr、_RecordsetPtr和_CommandPtr。下面分别对它们的使用方法进行介绍:
1、_ConnectionPtr智能指针,通常用于打开、关闭一个库连接或用它的Execute方法来执行一个不返回结果的命令语句(用法和_CommandPtr中的Execute方法类似)。
——打开一个库连接。先创建一个实例指针,再用Open打开一个库连接,它将返回一个IUnknown的自动化接口指针。代码如下所示: _ConnectionPtr m_pConnection;
// 初始化COM,创建ADO连接等操作
AfxOleInit();
m_pConnection.CreateInstance(__uuidof(Connection));

// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
// 因为它有时会经常出现一些意想不到的错误。jingzhou xu
try
{
// 打开本地Access库Demo.mdb
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Demo.mdb","","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox("数据库连接失败,确认数据库Demo.mdb是否在当前路径下!");
return FALSE;
}
——关闭一个库连接。如果连接状态有效,则用Close方法关闭它并赋于它空值。代码如下所示: if(m_pConnection->State)
m_pConnection->Close();
m_pConnection= NULL;
2、_RecordsetPtr智能指针,可以用来打开库内数据表,并可以对表内的记录、字段等进行各种操作。
——打开数据表。打开库内表名为DemoTable的数据表,代码如下: _RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));

// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
// 因为它有时会经常出现一些意想不到的错误。jingzhou xu
try
{
m_pRecordset->Open("SELECT * FROM DemoTable", // 查询DemoTable表中所有字段
theApp.m_pConnection.GetInterfacePtr(), // 获取库接库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
——读取表内数据。将表内数据全部读出并显示在列表框内,m_AccessList为列表框的成员变量名。如果没有遇到表结束标志adoEOF,则用GetCollect(字段名)或m_pRecordset->Fields->GetItem(字段名)->Value方法,来获取当前记录指针所指的字段值,然后再用MoveNext()方法移动到下一条记录位置。代码如下所示: _variant_t var;
CString strName,strAge;
try
{
if(!m_pRecordset->BOF)
m_pRecordset->MoveFirst();
else
{
AfxMessageBox("表内数据为空");
return;
}

// 读入库中各字段并加入列表框中
while(!m_pRecordset->adoEOF)
{
var = m_pRecordset->GetCollect("Name");
if(var.vt != VT_NULL)
strName = (LPCSTR)_bstr_t(var);
var = m_pRecordset->GetCollect("Age");
if(var.vt != VT_NULL)
strAge = (LPCSTR)_bstr_t(var);

m_AccessList.AddString( strName + " --> "+strAge );

m_pRecordset->MoveNext();
}

// 默认列表指向第一项,同时移动记录指针并显示
m_AccessList.SetCurSel(0);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
——插入记录。可以先用AddNew()方法新增一个空记录,再用PutCollect(字段名,值)输入每个字段的值,最后再Update()更新到库中数据既可。其中变量m_Name和m_Age分别为姓名及年龄编辑框的成员变量名。代码所下所示: try
{
// 写入各字段值
m_pRecordset->AddNew();
m_pRecordset->PutCollect("Name", _variant_t(m_Name));
m_pRecordset->PutCollect("Age", atol(m_Age));
m_pRecordset->Update();

AfxMessageBox("插入成功!");
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
——移动记录指针。移动记录指针可以通过MoveFirst()方法移动到第一条记录、MoveLast()方法移动到最后一条记录、MovePrevious()方法移动到当前记录的前一条记录、MoveNext()方法移动到当前记录的下一条记录。但我们有时经常需要随意移动记录指针到任意记录位置时,可以使用Move(记录号)方法来实现,注意: Move()方法是相对于当前记录来移动指针位置的,正值向后移动、负值向前移动,如:Move(3),当前记录是3时,它将从记录3开始往后再移动3条记录位置。代码如下所示: try
{
int curSel = m_AccessList.GetCurSel();
// 先将指针移向第一条记录,然后就可以相对第一条记录来随意移动记录指针
m_pRecordset->MoveFirst();
m_pRecordset->Move(long(curSel));

}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
——修改记录中字段值。可以将记录指针移动到要修改记录的位置处,直接用PutCollect(字段名,值)将新值写入并Update()更新数据库既可。可以用上面方法移动记录指针,修改字段值代码如下所示: try
{
// 假设对第二条记录进行修改
m_pRecordset->MoveFirst();
m_pRecordset->Move(1); // 从0开始
m_pRecordset->PutCollect("Name", _variant_t(m_Name));
m_pRecordset->PutCollect("Age", atol(m_Age));
m_pRecordset->Update();
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
——删除记录。删除记录和上面修改记录的操作类似,先将记录指针移动到要修改记录的位置,直接用Delete()方法删除它并用Update()来更新数据库既可。代码如下所示: try
{
// 假设删除第二条记录
m_pRecordset->MoveFirst();
m_pRecordset->Move(1); // 从0开始
m_pRecordset->Delete(adAffectCurrent); // 参数adAffectCurrent为删除当前记录
m_pRecordset->Update();
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
——关闭记录集。直接用Close方法关闭记录集并赋于其空值。代码如下所示: m_pRecordset->Close();
m_pRecordset = NULL;
3、CommandPtr智能指针,可以使用_ConnectionPtr或_RecordsetPtr来执行任务,定义输出参数,执行存储过程或SQL语句。
——执行SQL语句。先创建一个_CommandPtr实例指针,再将库连接和SQL语句做为参数,执行Execute()方法既可。代码如下所示: _CommandPtr m_pCommand;
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->ActiveConnection = m_pConnection; // 将库连接赋于它
m_pCommand->CommandText = "SELECT * FROM DemoTable"; // SQL语句
m_pRecordset = m_pCommand->Execute(NULL, NULL,adCmdText); // 执行SQL语句,返回记录集
——执行存储过程。执行存储过程的操作和上面执行SQL语句类似,不同点仅是CommandText参数中不再是SQL语句,而是存储过程的名字,如Demo。另一个不同点就是在Execute()中参数由adCmdText(执行SQL语句),改为adCmdStoredProc来执行存储过程。如果存储过程中存在输入、输出参数的话,需要使用到另一个智能指针_ParameterPtr来逐次设置要输入、输出的参数信息,并将其赋于_CommandPtr中Parameters参数来传递信息,有兴趣的读者可以自行查找相关书籍或MSDN。执行存储过程的代码如下所示: _CommandPtr m_pCommand;
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->ActiveConnection = m_pConnection; // 将库连接赋于它
m_pCommand->CommandText = "Demo";
m_pCommand->Execute(NULL,NULL, adCmdStoredProc);

⑹ 如何进行C#连接Access数据库的细节操作

许多学者总会面对于数据库的知识,以下的例子讲述到Access数据库说明,用C#的DataSet类访问数据库的一些操作方法。


操作涉及的主要C#类有:
DataSet:对应数据库表的一个集合,实际上是数据库表在内存中的一个缓存
DataTable:对应数据库表,是数据库表行的集合
DataRow:对应数据库表行
OleDbConnection:建立数据库连接
OleDbDataAdapter:由数据库生成DataSet,并负责DataSet与数据库的同步
OleDbCommandBuilder:生成更新数据库所需的指令www.kmxxfk.com

DataSet、DataTable、DataRow用于数据在缓存中的操作,这上面的操作只有更新到数据库中,修改结果才会被永久保存。OleDbConnection 是用OLEDB方法连接数据库所必需的。OleDbDataAdapter和OleDbCommandBuilder用来生成DataSet,完成数据库更新。与OleDbDataAdapter和OleDbCommandBuilder相对应,SqlDataAdapter和SqlCommandBuilder也可以完成用SQL语言为指令的数据库更新。

假设在D:盘创建了Access数据库,其路径为d:\0DBAcs\account.mdb,数据库中有一张名为kai的数据库表。表结构如下:
表名;Kai
字段Field Name类型说明
1开支IDkzID长整型自动编号
2开支人Kzren文本50字符
3开支项目名kzname文本50字符
4日期riqi日期/时间99-99-99;0掩码
5开支说明shuoming文本225字符
6总金额zonge单精度小数点任意;这项开支的总花费
7数量shuliang长整型www.kmxxfc.com
8单价Danjia单精度小数点任意

表建好之后:(1)对表中添加新数据(2)查询表中的某个字段。为了实现这两项功能,以下几个问题要考虑:
1准备工作
声明必须的公共变量
建立与数据库的连接,创建DataSet对象
2添加记录
在DataSet对象上添加记录
同步DataSet对象对象与数据库中的数据,这一点很重要,很多人忘记了数据进行同步,结果往往是添加、修改的数据不能保存到数据库中。
3查询数据库表中某记录的某字段;

我们可以将上述功能用一个类DataOper实现,下面是程序设计的主要活动。
声明要用的C#系统类
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;

声明DataOper类中的公共变量
private string DBlocation;
private OleDbConnection dbconn; //数据库连接
private OleDbDataAdapter da;

建立与数据库的连接,这里采用了OLEDB方法:
dbconn = new OleDbConnection(@"provider=microsoft.jet.oledb.4.0; Data Source=d:\0DBAcs\account.mdb");
dbconn.Open();

创建DataSet对象
da = new OleDbDataAdapter(@"select * from kai", dbconn); //引用数据库连接dbconn并依据SQL语句"select * from kai"创建OleDbDataAdapter对象da
DataSet ds = new DataSet(); //创建DataSet对象
da.Fill(ds); //用OleDbDataAdapter对象da填充、更新刚创建的DataSet对象

添加记录并更新数据库
OleDbCommandBuilder cb = new OleDbCommandBuilder(da); // 创建OleDbCommandBuilder对象cb用于更新OleDbDataAdapter对象da的Insert、Delete、Update指令
da.UpdateCommand = cb.GetUpdateCommand(); //更新OleDbDataAdapter对象da的指令
设计人员可以编写自己的更新指令,也可以象上面所写的那样用系统默认的指令。但不管怎样,上面的语句不能缺少,否则程序在运行中会抛出异常System.InvalidOperationException,并提示:Update requires a valid InsertCommand when passed DataRow collection with new rows.


DataRow drx = ds.Tables[0].NewRow(); //创建一条新记录行

drx["kzren"] = "kzren";
drx["kzname"]="kzname";
drx["riqi"]=2008-10-11;
drx["shuoming"]="shuoming";
drx["zonge"] = 12;
drx["shuliang"] = 3;
drx["danjia"] = 4;
ds.Tables[0].Rows.Add(drx); //在表中追加记录
da.Update(ds); //更新数据库

要查询引用某记录的某字段,直接按如下的方法引用就可以了。
String kx=ds.Tables[0].Rows[0]["kzren"].ToString()连接access
首先看一个例子代码片断:
程序代码:www.lzfsk.com/
--------------------------------------------------------------------------------
using system.data;
using system.data.oledb;
......
string strconnection="provider=microsoft.jet.oledb.4.0;";
strconnection+=@"data source=c:\begas.Net\northwind.mdb";
oledbconnection objconnection=new oledbconnection(strconnection);
......
objconnection.open();
objconnection.close();
......
--------------------------------------------------------------------------------
解释:
连接access数据库需要导入额外的命名空间,所以有了最前面的两条using命令,这是必不可少的!
strconnection这个变量里存放的是连接数据库所需要的连接字符串,他指定了要使用的数据提供者和要使用的数据源.
"provider=microsoft.jet.oledb.4.0;"是指数据提供者,这里使用的是microsoft jet引擎,也就是access中的数据引擎,ASP.net就是靠这个和access的数据库连接的.
"data source=c:\begaspnet\northwind.mdb"是指明数据源的位置,他的标准形式是"data source=mydrive:mypath\myfile.mdb".
ps:
1."+="后面的"@"符号是防止将后面字符串中的"\"解析为转义字符.
2.如果要连接的数据库文件和当前文件在同一个目录下,还可以使用如下的方法连接:
strconnection+="data source=";
strconnection+=mappath("northwind.mdb");
这样就可以省得你写一大堆东西了!
3.要注意连接字符串中的参数之间要用分号来分隔.
"oledbconnection objconnection=new oledbconnection(strconnection);"这一句是利用定义好的连接字符串来建立了一个链接对象,以后对数据库的操作我们都要和这个对象打交道.
"objconnection.open();"这用来打开连接.至此,与access数据库的连接完成.其余操作(插入,删除...)请参阅相关书籍
连接SQL Server
例子代码片断:
程序代码:

--------------------------------------------------------------------------------
using system.data;
using system.data.sqlclient;
...
string strconnection="user id=sa;passWord=;";
strconnection+="initial catalog=northwind;server=yoursqlserver;";
strconnection+="connect timeout=30";
sqlconnection objconnection=new sqlconnection(strconnection);
...
objconnection.open();
objconnection.close();
...
--------------------------------------------------------------------------------
解释:
连接sql server数据库的机制与连接access的机制没有什么太大的区别,只是改变了connection对象和连接字符串中的不同参数.
首先,连接sql server使用的命名空间不是"system.data.oledb",而是"system.data.sqlclient".
其次就是他的连接字符串了,我们一个一个参数来介绍(注意:参数间用分号分隔):
"user id=sa":连接数据库的验证用户名为sa.他还有一个别名"uid",所以这句我们还可以写成"uid=sa".
"password=":连接数据库的验证密码为空.他的别名为"pwd",所以我们可以写为"pwd=".
这里注意,你的sql server必须已经设置了需要用户名和密码来登录,否则不能用这样的方式来登录.如果你的sql server设置为Windows登录,那么在这里就不需要使用"user id"和"password"这样的方式来登录,而需要使用"trusted_connection=sspi"来进行登录.
"initial catalog=northwind":使用的数据源为"northwind"这个数据库.他的别名为"database",本句可以写成"database=northwind".
"server=yoursqlserver":使用名为"yoursqlserver"的服务器.他的别名为"data source","address","addr".如果使用的是本地数据库且定义了实例名,则可以写为"server=(local)\实例名";如果是远程服务器,则将"(local)"替换为远程服务器的名称或ip地址.
"connect timeout=30":连接超时时间为30秒.
在这里,建立连接对象用的构造函数为:sqlconnection.
其余的就和access没有什么区别了!
********************************************************************************************************************
用c#访问access数据库


我编写这个程序的动机是当我希望用c sharp访问msaccess数据库的时候我没有办法获得任何信息和参考材料.网上所能获得的所有材料都是偏重于sql的,所以我们将分两步来编写这个应用程序,第一我们将展示如何连接到msaccess数据库然后看看它有多复杂.最后,我们就这样完成了这个程序.

闲言少序,让我们开始正题.连接到数据库的过程与我们早先的ado连接过程相比已经发生了较大的变化.下面的图表恰当的(我希望如此)oledbconnection--> oledbcommand --> oledbdatareader.现在那些熟悉ado的人很明显能看出两者的相似之处但是为了使那些还没有很好的适应ado的人能够明白,下面是一些解释.

oledbconnection -->代表对数据库的单一连接,根据底层数据库的功能它能给你操纵数据库的能力.有一点必须记住,虽然oledbconnection对象出了作用范围,它也不会自动被关闭.所以,你将不得不显示的调用这个对象的close()方法.

oledbcommand -->这是就象我们在ado中使用的一样的通常的command对象.你可以通过这个对象调用sql存储过程或是sql查询语句.

oledbdatareader -->这个类拥有非常大的重要性因为它提供了实际上的对数据库底层数据集的访问.当你调用oledbcommand的executereader方法的时候它就会被创建,.net beta2 sdk说不要直接创建这个类的对象.

现在你可以在.net beta 2的文档中看到更多的关于这些主要对象的说明,下面是指出如何在程序中访问数据库的源代码.

using system;
using system.data.oledb;

class oledbtest{

public static void main()
{
/创建数据库连接
oledbconnection aconnection = new oledbconnection("provider=microsoft.jet.oledb.4.0;data source=c:\\db1.mdb");

/创建command对象并保存sql查询语句
oledbcommand acommand = new oledbcommand("select * from emp_test", aconnection);
try
{
aconnection.open();

/创建datareader 对象来连接到表单
oledbdatareader areader = acommand.executereader();
console.writeline("this is the returned data from emp_test table");

/循环遍历数据库
while(areader.read())
{
console.writeline(areader.getint32(0).tostring());
}

/关闭reader对象
areader.close();

/关闭连接,这很重要
aconnection.close();
}

/一些通常的异常处理
catch(oledbexception e)
{
console.writeline("error: {0}", e.errors[0].message);
}
}
}

成功运行这个程序的步骤
1.用msaccess创建一个名叫db1.mdb的数据库
2.创建一个名叫emp_test的表单
3.使它包含下列数据域
emp_code int
emp_name text
emp_ext text
4.将上面的代码保存到sample.cs文件中
5.确保数据库位于c:\并确保mdac2.6或是更新的版本已经被安装
6.编译运行

现在让我们来了解一些我们在oledbconnection对象的构造函数看到的东西的一些细节,在这里你看见诸如"provider="之类的东西.下面是一些和ado.net兼容的驱动程序类型.
sqlolddb --> microsoft ole db provider for sql server,
msra --> microsoft ole db provider forOracle,
microsoft.jet.oledb.4.0 --> ole db provider for microsoft jet
你可以选择其中的任何一个但是他们会需要传递不同的参数,例如jet.oledb.需要传递mdb文件的名字而sqloledb需要传递用户名和密码.

所有这些驱动程序都位于system.data.oledb命名空间里,所以你必须包括它,而且它们和oledb provider for odbc不兼容,也就是说你不能在VB6.0程序里使用这些驱动程序来访问数据库,所以不要去寻找解释为什么要把这些数据库放在c:\上的资料了

当你使用microsoft sql server 7.0 或者更新版本的时候,下面是微软给出的一些指导:
推荐使用.net data provider在下列情况中,使用microsoft sql server 7.0 或者更新版本的中间层应用程序,使用microsoft data engine (msde)或icrosoft sql server 7.0 或者更新版本的单层应用程序.
建议将ole db provider for sql server (sqloledb)和ole db .net data provider一起使用.
对于microsoft sql server 6.5和更早的版本,你必须同时使用ole db provider for sql server 和 ole db.net data provider.
推荐使用microsoft sql server 6.5和更早的版本或是oracle的中间层应用程序使用ole db .net data provider.
对于microsoft sql server 7.0 或者更新版本,推荐sql server .net data provider.
推荐单层应用程序使用microsoft access数据库.
不推荐一个中间层程序同时使用ole db .net data provider和microsoft access数据库.
不再支持ole db provider for odbc (msdasql)

⑺ 关于C语言连接SQL数据库…

1、配置ODBC数据源。
2、使用SQL函数进行连接。
对于1、配置数据源,配置完以后就可以编程操作数据库了。
对于2、使用SQL函数进行连接,参考代码如下:

#include<windows.h>
#include<sql.h>
#include<sqlext.h>
void main()
{
HENV henv; //环境句柄
HDBC hdbc; //数据源句柄
HSTMT hstmt; //执行语句句柄
unsigned char datasource[]="数据源名称"; //即<a href="https://www..com/s?wd=ODBC&tn=44039180_cpr&fenlei=_5y9YIZ0lQzqlpA-" target="_blank" class="-highlight">ODBC</a>源中设置的源名称
unsigned char user[]= "用户名"; //数据库的帐户名
unsigned char pwd[]= "密码"; //数据库的密码
unsigned char search[]="select xm from stu where xh=0";
SQLRETURN retcode; //记录各SQL函数的返回情况
// 分配环境句柄
retcode= SQLAllocEnv(&henv); // 等介于 SQLAllocHandle(SQL_HANDLE_ENV, SQL_<a href="https://www..com/s?wd=NULL&tn=44039180_cpr&fenlei=_5y9YIZ0lQzqlpA-" target="_blank" class="-highlight">NULL</a>_HANDLE, &henv);
// 设置ODBC环境版本号为3.0
retcode= SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
// 分配连接句柄
retcode= SQLAllocConnect(henv,&hdbc); // 等介于 SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
//设置连接属性,登录超时为*rgbValue秒(可以没有)
// SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)(rgbValue), 0);

//直接连接数据源
// 如果是windows身份验证,第二、三参数可以是<a href="https://www..com/s?wd=NULL&tn=44039180_cpr&fenlei=_5y9YIZ0lQzqlpA-" target="_blank" class="-highlight">NULL</a>,也可以是任何字串
//SQL_NTS 即 "<a href="https://www..com/s?wd=Null&tn=44039180_cpr&fenlei=_5y9YIZ0lQzqlpA-" target="_blank" class="-highlight">Null</a>-Terminated String"
retcode= SQLConnect(hdbc,datasource, SQL_NTS, user, SQL_NTS , pwd, SQL_NTS );
//分配语句句柄
retcode= SQLAllocStmt(hdbc,&hstmt); // 等介于 SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
//直接执行查询语句
retcode=SQLExecDirect(hstmt,search,SQL_NTS);
//将数据缓冲区绑定数据库中的相应字段(i是查询结果集列号,queryData是绑定缓冲区,BUFF_LENGTH是缓冲区长度)
SQLBindCol(hstmt, i, SQL_C_CHAR, queryData[i-1], BUFF_LENGTH, 0);
//遍历结果集到相应缓冲区 queryData
SQLFetch(hstmt);
/*
*对遍历结果的相关操作,如显示等
*/
//注意释放顺序,否则会造成未知错误!
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}

代码看上去很复杂,其实都可以直接复制。其中需要改的是数据源名称、数据库用户名、数据库密码和SQL语句。
然后就是SQLFetch后得到结果集后,如何使用的问题了。
在下面的注释部分 填写你的处理代码即可。

/*
*对遍历结果的相关操作,如显示等
*/