??xml version="1.0" encoding="utf-8" standalone="yes"?>久久亚洲中文字幕精品有坂深雪 ,日本久久中文字幕,欧美综合天天夜夜久久http://www.shnenglu.com/dbsky/articles/9339.html<FONT color=red>dbsky </FONT> <FONT color=red>dbsky </FONT> Mon, 03 Jul 2006 12:18:00 GMThttp://www.shnenglu.com/dbsky/articles/9339.htmlhttp://www.shnenglu.com/dbsky/comments/9339.htmlhttp://www.shnenglu.com/dbsky/articles/9339.html#Feedback0http://www.shnenglu.com/dbsky/comments/commentRss/9339.htmlhttp://www.shnenglu.com/dbsky/services/trackbacks/9339.html代码如下Q?br />
//所有的ODBC函数都以SQL开?/p>

#include <conio.h>//getch()
#include <stdio.h>
#include <afxwin.h>//// MFC core and standard components
#include <sqlext.h> //包含有扩展的ODBC的定?br />#include <sql.h> //包含有基本的ODBC API的定?br />#include <odbcinst.h>
#pragma comment(lib, "odbc32.lib")
#pragma comment(lib, "odbccp32.lib")//SQLConfigDataSource()函数

//#include "sqltypes.h"
//#include "sqlucode.h"
//#include "odbcss.h"


int main(int argc, char* argv[])
{
 
 SQLRETURN sr=SQL_SUCCESS;
 SQLHENV  hEnv=0; //分配odbc环境
 SQLHDBC  hDbc=0;//
 SQLHSTMT hStmt;//

 //
 SQLINTEGER iID;//W一?br /> SQLCHAR tmJoin[20];//W二?br />    SQLCHAR szName[10];//W三?br /> SQLREAL fTall;//W四?br /> SQLINTEGER cbID,cbJoin,cbName,cbTall;//保存得到的数据的长度
 //
 int i=0;
 SQLCHAR   SqlState[6];
 SQLINTEGER NativeError;
 SQLCHAR ErrMsg[SQL_MAX_MESSAGE_LENGTH];
 //
 char szDSN[] = "TestDB";//ODBC数据?
 char szUID[] = "sa"; //SQL用户
 char szPWD[] = ""; //口o(h)
    LPCSTR svSQL="select * from [ApiOdbc]";

 //创徏ODBC句柄,分配odbc环境
 /*对于MODBC应用E序来说Q第一步的工作是装载驱动程序管理器Q然后初始化ODBC环境Q分配环境句柄?br />    首先Q程序中声明一个SQLHENVcd的变量,然后调用函数SQLAllocHandleQ向其中传递分配的上述SQLHENVcd
 的变量地址和SQL_HANDLE_ENV选项。如下代码所C:(x)SQLHENV henv;SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);
    执行该调用语句后Q驱动程序分配一个结构,该结构中存放环境信息Q然后返回对应于该环境的环境句柄?br /> SQLRETURN SQLAllocHandle(
      SQLSMALLINT   HandleType,
      SQLHANDLE     InputHandle,W二个参Cؓ(f)输入句柄
      SQLHANDLE *   OutputHandlePtr W三个参Cؓ(f)输出句柄
       );  
 SQL_HANDLE_ENVQ申L(fng)境句柄?br />    SQL_HANDLE_DBCQ申h据库q接句柄
 SQL_HANDLE_STMTQ申请SQL语句句柄Q每ơ执行SQL语句都申误句句柄,q且在执行完成后释放*/
   
 //利用动态链接库Odbcinst.dll动态创建DSN
 if(SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN,"SQL Server","DSN=TestDB\0Description=TestAPIODBC\0SERVER=(local)\0DATABASE=TestDB"))
 {
  printf("32位ODBC数据源配|?Success!\n\n");
 }
   
 sr = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&hEnv);
 if(sr==SQL_SUCCESS||sr==SQL_SUCCESS_WITH_INFO)
 {
  printf("1~~创徏环境句柄SQLAllocHandle Success!\n");
 }
    //讑֮odbc版本,ODBC讄成ؓ(f)版本3Q否则某些ODBC API 函数不能被支?br /> sr = SQLSetEnvAttr(hEnv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3,SQL_IS_INTEGER);
 if(sr==SQL_SUCCESS||sr==SQL_SUCCESS_WITH_INFO)
 {
  printf("2~~SQLSetEnvAttr Success!\n");
 }
 //分配odbcq接句柄
 /*分配环境句柄后,在徏立至数据源的q接之前Q我们必d配一个连接句柄,每一个到数据源的q接对应于一个连接句柄?br />    首先Q程序定义了一个SQLHDBCcd的变量,用于存放q接句柄Q然后调用SQLAllocHandle函数分配句柄。如下代码所C:(x)
    SQLHDBC hdbc;SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);henv为环境句柄?/
    sr = SQLAllocHandle(SQL_HANDLE_DBC,hEnv,&hDbc);
    if(sr==SQL_SUCCESS||sr==SQL_SUCCESS_WITH_INFO)
 {
  printf("3~~创徏q接句柄SQL_HANDLE_DBC Success!\n");
 }
    //q接q接属?
 /*当连接句柄分配完成后Q我们可以设|连接属性,所有的q接属性都有缺省|但是我们可以通过调用函数SQLSetConnectAttr()
 来设|连接属性。用函数SQLGetConnectAttr()获取q些q接属性。函数格式如下:(x)
 SQLRETURN SQLSetConnectAttr(SQLHDBC ConnectionHandle,SQLINTEGER Attribute,SQLPOINTER ValuePtr,SQLINTEGER StringLength);
 SQLRETURN SQLGetConnectAttr(SQLHDBC ConnectionHandle,SQLINTEGER Attribute,SQLPOINTER ValuePtr,SQLINTEGER StringLength);
    应用E序可以Ҏ(gu)自己的需要设|不同的q接属性?/
 sr = SQLSetConnectAttr(hDbc,SQL_ATTR_LOGIN_TIMEOUT,(void*)7,0);
    if(sr==SQL_SUCCESS||sr==SQL_SUCCESS_WITH_INFO)
 {
  printf("4~~讄q接属性SQLSetConnectAttr Success!\n");
 }
 
 //q接
 /*完成对连接属性的讄之后Q就可以建立到数据源的连接了。对于不同的E序和用h口,可以用不同的函数建立q接Q?br /> SQLConnect、SQLDriverConnect、SQLBrowseConnect?br />    SQLConnect该函数提供了最为直接的E序控制方式Q我们只要提供数据源名称、用户ID和口令,可以进行连接了?br />    函数格式:SQLRETURN SQLConnect(SQLHDBC ConnectionHandle,SQLCHAR ServerName,SQLSMALLINT NameLength1,SQLCHAR UserName,SQLSMALLINT NameLength2,SQLCHAR *Authentication,SQLSMALLINT NameLength3);
    参数:ConnectionHandle q接句柄QServerName 数据源名UͼNameLength1 数据源名U长度,UserName 用户ID
 NameLength2 用户ID长度QAuthentication 用户口o(h)QNameLength3 用户口o(h)长度
 q回?SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or SQL_INVALID_HANDLE.
 成功q回SQL_SUCCESS*/
 sr = SQLConnect(hDbc,(SQLCHAR *)szDSN, SQL_NTS,(SQLCHAR *)szUID,SQL_NTS,(SQLCHAR *)NULL,SQL_NTS);
    /*如果q回gؓ(f)SQL_ERROR或SQL_SUCCESS_WITH_INFOQ可以用函数SQLGetDiagRec获取相应SQLSTATE的?/
 if(sr != SQL_SUCCESS && sr != SQL_SUCCESS_WITH_INFO)
 {
  TRACE("ERROR");
  while(SQLGetDiagRec(SQL_HANDLE_DBC,hDbc,i,SqlState, &NativeError,ErrMsg,sizeof(ErrMsg),NULL)!= SQL_NO_DATA)
   TRACE("Diag : %d SQLSTATE :%s NativeError : %d ,ErrMsg : %s\n",i ++,SqlState,NativeError,ErrMsg);
 }
 else
 {
  printf("5~~q接Connect Success!\n");
    }
 //分配语句句柄sr = SQLAllocStmt(hDbc,&hStmt);SQLAllocStmt() 已被废弃Q且替换?SQLAllocHandle()Q?br /> sr=SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
    if(sr == SQL_SUCCESS||sr == SQL_SUCCESS_WITH_INFO)
 {
  printf("6~~分配语句句柄SQL_HANDLE_STMT Success!\n");
 }

    //执行SQL查询语句
 sr=SQLExecDirect(hStmt,(UCHAR *)svSQL,SQL_NTS);
    if (sr == SQL_SUCCESS||sr == SQL_SUCCESS_WITH_INFO)
    {
        printf("7~~执行SQL查询语句SQLExecDirect Success!\n");
  printf("\n-------------get date from db-------------\n");
  while ((sr=SQLFetch(hStmt))!=SQL_NO_DATA)
  {
   //执行SQL语句后遍历结果集来得到数?br />   SQLGetData(hStmt, 1, SQL_C_ULONG, &iID, 0, &cbID);
   SQLGetData(hStmt, 2, SQL_C_CHAR,  tmJoin, 20, &cbJoin);//datatimecd攑֜SQLCHAR数组中,数组length要?br />   SQLGetData(hStmt, 3, SQL_C_CHAR,  szName, 10, &cbName);
   SQLGetData(hStmt, 4, SQL_C_FLOAT, &fTall, 0, &cbTall);
   printf("%d~~~%s~~~%s~~~%f\n",iID,tmJoin,szName,fTall);
  }
 }

    //释放句柄
 if(hStmt!=SQL_NULL_HANDLE)
 {
  SQLFreeHandle( SQL_HANDLE_STMT, hStmt );
     hStmt=NULL;
 }
 if(hDbc != SQL_NULL_HANDLE)
 {
  sr = SQLDisconnect(hDbc);
  SQLFreeHandle(SQL_HANDLE_DBC,hDbc);
  hDbc=NULL;
 }
 if(hEnv != SQL_NULL_HANDLE)
 {
  SQLFreeHandle(SQL_HANDLE_ENV,hEnv);
  hEnv=NULL;
 }
 //
 printf("API ODBC Success!\n");
 system("PAUSE");
 return 0;
}

 

 

 

 



dbsky 2006-07-03 20:18 发表评论
]]>
关于MSSQL2000时的部分MW记http://www.shnenglu.com/dbsky/articles/9338.html<FONT color=red>dbsky </FONT> <FONT color=red>dbsky </FONT> Mon, 03 Jul 2006 12:15:00 GMThttp://www.shnenglu.com/dbsky/articles/9338.htmlhttp://www.shnenglu.com/dbsky/comments/9338.htmlhttp://www.shnenglu.com/dbsky/articles/9338.html#Feedback0http://www.shnenglu.com/dbsky/comments/commentRss/9338.htmlhttp://www.shnenglu.com/dbsky/services/trackbacks/9338.htmlDBMS :Database Management System
数据模型:概念数据模型 ----设计
         逻辑数据模型Q关pL据模型,|状数据模型Q层ơ数据模型,Q?---实现
         物理数据模型
数据模式Q描q?/p>

联系Q约束ƈ发控Ӟ(x)多用戯问共享数据的冲突问题

实体—联p:(x)er模型

rdbms (关系数据?     :  sql server ,oracle ,db/2,sybase,informix
Non-rdbms (file-based) :  foxpro,access

客户端网l实用工?Client Network Utility)Q用来配|客L(fng)的网l连接,理和测定客L(fng)的数据库?/p>

事g探察器:(x)监视事g处理日志QƈҎ(gu)志进行分析和重播?/p>

服务端网l实用工?Server Network Utility):配置服务器端|络q接和设|相兛_数?/p>

导入和导出数?Imput and Export Data):采用DTC(data transformation services)向导来完成,实现其他数据和SQL 2000数据的{换?/p>

企业?win2000 advanced server
标准?win2000 server

首要数据文g .mdf
ơ要数据文g .ndf
日志文g     .ldf

windowsw䆾验证模式 ?混合模式h更高的安全性,windowsw䆾验证模式下必L本地用户和域用户才能使用SQL Server 2000

升SQL SERVER:备䆾(包括pȝ库在内的)所有数据库Q备份注册表

日志文gQ?br />sqlstp.log   在\windows或\winnt?br />setup.log    在\windows或\winnt?br />searchsetup.log  在\winnt\temp?br />errorlog     在mssql\log?/p>

pȝ数据库:(x)
master:
model:  是用h据库和tempdb数据库的摸板数据库,是创建新数据库的摸板
msdb:   是代理服务数据库
tempdb: 临时数据库,默认大小8mbQؓ(f)临时操作提供存储I间
pubs:   C学习(fn)

pȝ表:(x)
(
sysobjects?br />syscolumns?br />sysindexes?br />sysusers?br />sysdatabases?br />sysdepends?br />sysconstraints?br />)

(d键字(主键)Q?br />候选关键字Q?br />公共关键字:(x)
外关键字Q确定主表和从表)

数据库对象:(x)
(
?br />索引
视图Q其实是虚表Q是查询表生的
图表Q是表之间的关系C意?br />省|(x)
规则Q?br />触发器:(x)
存储q程Q?br />用户Q?br />)

范式Q构造数据库必须遵守的规则,目前关系数据库有6U范式,W一范式(1NF)....Q一般需要满?NF

SQL(structured query language)l构化查询语a

9U语?br />(
数据查询Qselect
数据定义Qcreate,drop(删除),alter(修改)
数据操作Qinsert,update,delete
数据控制Qgrant,revoke
)

SQL语言分类Q?br />(
数据定义语言(dll),用于定义数据l构
数据控制语言(dml)Q用于检索和修改数据l构
数据控制语言(dcl),用于规定数据库用L(fng)权限
数据库事务处理,用来保证数据库的完整?br />)

常用dll语句Q?br />(
create table
create index
drop table    删除数据库表
drop index
truncate      删除表中所有的?br />alter table   增加表列Q重定义表列Q更改存储分?br />alter table add constraint   在已有的表上增加U束
)

常用dml语句:
(
insert
delete
update
selete
)

常用dcl语句:
(
grant  权限或角色授予用户或其他角?br />revoke 从用h数据库角色回收权?br />set role  止或允许角?br />)

事务处理语句Q?br />(
commit work  把当前事务所作的更改怹?br />rollback     作废上次提交以来的所有更?br />)

数据表名U?as 数据表别名,如果已经l表定了别名Q在T-SQL语句中应引用别名Q而不能用数据表名
select e.id,e.name from 用户?as e


select [all | distinct] [top n] selectlist [into[NewtAbleName]]  //distinct:无重复的,selectlist:可以是表辑ּ
  from {TableName | ViewName,....}
where  conditions
[group by group_by_list]  // 分组 
[having conditions]       // 分组条g
[order by order_by_list [asc | desc]]

select cost*quantity as sum

select 数据?join on (员工数据?员工~号=目数据?负责?     //联接条g

嵌套select:
select table1.a,tmptable.b
from table1,
(select table2.c,table2.d
from table2
where table2.id>2) as tmptable
where table1.id=tmptable.id


where:
比较Q?lt;,<=,>,>=,=,!=,!<,!>
范围Qbetween a and b , not between a and b
可选择Qin,not in
模式匚wQlikeQnot like
是否I|(x)is null,is not null
逻辑Qand,or,not

like通配W:(x)
%  Q?like 'wang%'    like '%yi'  
-  Q?like '_angyi'   
[]  Qlike '[a-z]angyi'
[~] Qlike '[~w]angyi'

in的用例:(x)
select name
  from table
where id in ('4','20')

escape的用例:(x)
select *
  from table
like 'wang#_yi' escape '#'

select id,count(*)
  from table
where wage>=6000
group by id

//group by Ҏ(gu)询结果分l?br />select id,name
  from table
where level='2'
group by id,name     //先按id分,在按name?br />with cube            //对group产生的组再按l统?br />with rollup          //只返回第一个分l条件下的再按组l计

having 指定分组搜烦(ch)条gQ通常与group by一L(fng)
having count(*)>1

select *
  from table
where col like '%50[%]%'  q回包含50%的字W串

asc:升箋

//compute计算  avg,sum,min,max,count (都会(x)忽律null)
select id,wage
   from table
order by 部门
compute sum(wage) by 部门


count(distinct 列名)

union

子查询中一般不用Order by子句QOrder by子句用于最l的l果

>all,<all,
<>all{h(hun)于not in
>some,<some
=some {h(hun)于in  <>some{h(hun)?not in

不要把If..exists和聚合函C起?br />

数据完整性:(x)
实体完整?--表中数据的唯一?br />区域完整?--字段数据范围的完整?br />参考完整?---表与表之间关联的完整?br />
使用者定义的完整?---用户自己定义的完整性。如Q客h6个月的钱Q下ơ再下定单的时候就不卖l他?br />
数据库分:(x)使用SQL语句分离为EXEC sp_detach_db ‘销售数据库?指明Ʋ分ȝ数据库名U即可。分d惛_用该数据库,则需要附加该数据库,具体SQL语句为:(x)
CREATE  DATABASE 销售数据库 ON PRIMARYQF(tun)ILENAME=’C(j):\SQLTEST\销售数据文件_1。MDF’)(j)
FOR  ATTACH 或者用sp_attach_dbpȝ存储q程来附加数据库Q?br />sp_attach_db  销售数据库
‘C:\SQLTEST\销售数据文件_1.MDF?/p>

 UNIQUE 和Primary key的差?br />1、?UNIQUE允许输入NULL|最多ؓ(f)一个)(j)Q而Primary key不允许;
2、?一个数据表中可以定义多个UNIQUE条gU束Q但只能定义一个Primary key条gU束?br />
CHECKU束可用来限制字D值是否在所允许的范围内Q例如:(x)
CREATE TABLE 客户02
(
客户~号 int IDENTITY  NULL  UNIQUE,
w䆾证号 char[10] NOT NULL  UNIQUE,
q龄  int  CHECK (q龄>0) DEFAULT 2
)

建立计算列:(x)
CREATE TABLE Ch(hun)
(
~号  int  IDENTITY,               //自动~号
单h(hun)  numeric(5,1),
数量  int,
Mh(hun)  AS 单h(hun)*数量
)
insert Ch(hun) values(21.5,8)
insert Ch(hun) values(12,3)
delete from Ch(hun) where ~号=5 or ~号=6
drop table Ch(hun)

创徏U束字段Q?br />Create table 客户
{
客户~号  int  IDENTITY  Primary Key,------------------------IDENTITY自动产生~号
w䆾证号  char 18  NOT NULL UNIQUE,
地址      char(50),
?sh)话    ?char (12),
杂志~号  int  REFERENCES 杂志U类Q杂志编P(j),
订单~号  int  NOT NULL,FOREIGN Key(杂志~号Q订L(fng)?
REFERENCES  杂志订户Q杂志编P订户~号Q,
Check(地址 is NOT NULL  OR ?sh)话?is  NOT NULL)
}

修改数据表:(x)
ALTER TABLE 客户A
ADD
cd~号 int
DEFAULT 1 WITH VALUES
CONSTRAINT  FK_cd~号
FOREIGN KEY
REFERENCES  客户cdQ类别编P(j)

删除U束字段Q?br />ALTER TABAL订购目A
DROP CONSTRAINT PK_订购目A
下面删除订购目A的两个字D?br />ALTER TABLE 订购目A
DROP COLUMN 定单~号Q项目编?br />
Ȁz?关闭U束
ALTER TABLE table
{ CHECK | NOCHECK} CONSTRAINT
{ALL | constrant_name{,…?n}}

临时数据表以#?#开_(d)用户断开q接后表被自动删?/p>

数据表中字段的种c:(x)
Primary key,  Foreign Key,  NULL,  NOT NULL,  DEFAULT,  UNIQUE,  CHECK

用查询结果徏立新数据?br />Select * into  newtablename  from table_source where 条g

重复记录采用DISTINCT来获取单独的数据?/p>

TOP  N 为显C前N个数据,TOP  N  30  PERSENT * FROM 表名

表示昄N的前30%的数?/p>

 ORDER BY 按什么方式排序显C结果,ASC升DESC?/p>

 JOIN QSELECT  A,B,C  FROM  T1  JOIN  T2  ON  T1.NO=T2.NO

JOIN 的类型有多种QINNERQ默认)(j)LEFTQ以左边为条Ӟ如果双没有W合的条Ӟ则以NULLQ?br />        SELECT ?产品名称AS旗旗公司产品名称Q旗.hQ标.成品名称AS标标公司产品名称Q标.h FROM 旗旗公司 AS ?LEFT JOIN 标标公司AS?ON?产品名称=标品名U?RIGHTQ以双为条Ӟ如果左边没有W合的条Ӟ则以NULLQFULLQ左边右辚w昄Q如果没有则以NULLQ?CROSSQ将两个表的数据q行比较Q全部显C出来)(j)

有时需要自己JOIN自己
SELECT 员工.姓名Q员?职位Q长?姓名ASȝ
FROM 员工 LEFT JOIN 员工AS 长官
ON 员工.ȝ~号=ȝ.~号 姓名 职位 ȝ
 1
 a
 b
 c
 2
 d 

NULL

GROUP BY 按什么分l显C?br />
UNION把两个查询结果合q到一个表中显C出来查询时Group的用, 
Select name  AS名称,Sum(Quantity)数量  Form  table  Group  By  name

GROUP BY后面如果有WITH CUBE则把各个l进行汇总计后昄l果 

查询Qselect name  AS出版C֐U?bookname AS 书名,sum(quantity) AS 数量 from table group by name,bookname with cube

查询时改变要昄的数据:(x)Q?代表“男”,0代表“女”)(j)要求查询时如果是1则显C“男”,否则昄“女?/p>

Select name  AS 姓名,case  sex  when  0  then “女?else  “男”?End  AS 性别  From  table

 比较清单有:(x)INQALLQANYQSOMEQ结果ؓ(f)TRUE或FALSE

试存在用EXISTSl果q回TRUEQFALSE

 索引分ؓ(f)聚集索引和非聚集索引

聚焦索引数据的存放会(x)依照该烦(ch)引的序来存?/p>

非聚焦烦(ch)引数据的存放不会(x)依照索引的顺序来存放

因ؓ(f)非聚焦烦(ch)引不影响数据排列序Q则可以讄多个非聚焦烦(ch)引,而聚焦烦(ch)引则最多只能设|一个,因ؓ(f)实际数据只能有一U排列顺序?/p>

(Unique index)索引值是否唯一Q如果烦(ch)引gؓ(f)唯一Q则成ؓ(f)唯一索引

多个字段做ؓ(f)索引UCؓ(f)复合索引QComposite indexQ?/p>

Create  [UNIQUE]  -----指定唯一
CREATE  TABLE  t
(
ProductID  smallint  not null  primary key,
ProductName   char(30),
Price   smallmoney,
Manufacturer   char(30)
)         
//创徏索引
CREATE  UNIQUE   NONCLUSTERED    INDEX    indexname
ON   t (Price   DESC)
WITH     PAD_INDEX, FILLFACTOR=30,IGNORE_DUP_KEY

//删除索引
DROP  INDEX   table.index_name

//修改索引

使用DROP_EXISTING修改索引,如果要修改烦(ch)引,只要在CREATE    INDEX语句的最后加上DROP_EXISTING卛_Q如果存在该索引Q则修改之,否则?x)发生错误?j)

使用DBCC  DBREINDEX重徏索引

如果只想重徏索引Q而不修改索引的相兌|)(j)Q那么用DBCC  DBREINDEX语句比较方便Q而且使用时也可指定重建的填充因子?/p>

DBCC DBREINDEXQ’database_name.owner.table_name?  index_name,   fillfactorQ数据库  数据库所有?表名  重徏的烦(ch)引名 讄新的填充因子[WITH  NO_INFOMSGS]   -------有此,则重建烦(ch)引不?x)显C出信息

 存储q程
pȝ存储q程都是?sp_开?br />扩展存储q程通常以xp_开?br />EXECUTE 执行存储q程或SQL字符ԌEXECQ?br />EXEC  存储q程名 ?参数1   参数2   参数3…?/p>

 变量的声明:(x)
DECLARE  @A  int -------------- 生命了一个ؓ(f)int cd的A 变量?/p>

建立存储q程
使用CREATE  PROC或者CREATE  PROCEDURE + q程?+ AS +SQL语句
CREATE  PROC  MyProcl
AS  SELECT * FROM 标标公司  WHERE h >5
GO
EXEC MyProcl

EXEC  lookup  ‘杨雄’,@地址 OUTPUT---OUTPUT表示参数的值是可以q回?/p>

一个存储过Eؓ(f)一个批Q因此在查询分析器中遇到GOӞ表示存储q程的定义已l束.在存储过E中,有些创徏对象的语句不可?br />CREATE  DEFAULT       CREATE  TRIGGER
CREATE  PROCEDURE    CREATE  VIEW
CREATE  RULE

临时存储q程分ؓ(f)局部和全局
局部要?开?br />全局要以##开?/p>

修改存储q程ALTER PROC
删除存储q程DROP PROC

建立函数CREATE  FUNCTION                    
修改函数 ALTER  FUNCTION             
删除函数DROP  FUNCTION

q回单个数据的函数和一般函C?br />q回大量数据集的函数如下例:(x)
CREATE FUNCTION 依售h询书c?br />Q@?money,  @到moneyQ?br />RETURNS TABLE
RETURN  QSELECT 书籍~号Q书c名Uͼ单h(hun) FROM 书籍 WHERE 单h(hun)>=@由AND单h(hun)<=@刎ͼ(j)
GO

SELECT * FROM依售h询书c(400Q?00Q?br />ORDER  BY  单h(hun)
在调用系l内|的函数Ӟ需要加上 ?Q:(x)如:(x)SELECT * FROM Q:(x)fn_helpcollations()在创时可以用这些函数?/p>

 函数分ؓ(f)定性函数和非确定性函?br />定性函Cؓ(f)当传入的参数不变Ӟq回g变,而非定性函Cؓ(f)传入参数不变Q但每次q回的g(x)改变Q如QGETDATEQ)(j)函数Q?/p>

 触发器(TriggerQ是一U与数据表紧密结合的存储q程Q当该数据表有新建(INSERTQ更改(UPDATEQ或删除QDELETEQ事件发生时Q所讄的触发器?x)自动被执行Q以q行数据完整性,或其他一些特D的数据处理工作?/p>

触发器是针对单一数据表所撰写的特D存储过E。触发器的种cM操作Q触发器分ؓ(f)2c?br />AFTER触发器:(x)q类触发器要在数据已变动完成之后QAFTERQ,才会(x)被激zdƈq行必要的善后处理或(g)查。若发现错误Q则可用ROLLBACK  TRANSATION回滚全部数据?br />INSTEAD  OF触发器:(x)INSTEAD  OF 是取代的意思,是q类触发器会(x)取代原本要进行的操作Q例如新建或更改数据库操作)(j)Q因此会(x)在数据变动前发生,而且数据要如何变动也完全取决于触发器。(该触发器能应用与数据表与视图Q?/p>

建立触发?br />CREATE  TRIGGER  trigger_name
ON  {table|view}
[with  encryption]        ------加密
{FOR|AFTER|INSTEAD OF}  ------FOR和AFITER都是要等到数据完全操作完后才Ȁz触发器QINSTEAD OF则表C建立INSTEAD OF触发器,此时触发器将取代原来要执行的数据操作?br />{[DELETE][,][INSERT][,][UPDATE]}-----指定触发器的触发操作Q必L定一个,多个时以逗号隔开Q在同一数据表中QAFTER触发器数目没有限Ӟ但对INSTEAD OF 触发器来说则限制DELETE、INSERT、UPDATE每项最多只能有一个?br />AS

Sql_statements    ------用来定义触发器的内容?/p>

例如Q下面对一个表建立2个触发器Q?br />CREATE  TRIGGER  订单修改通知
ON  订单
AFTER  INSERT QUPDATE
AS
PRINT  ‘又有订单被修改了!?br />GO


CREATE TRGGER 订单删除通知
ON  订单
AFTER  DELETE
AS
PRINT  ‘又有订单被删除了!?br />GO

INSERT 订单(日期Q客L(fng)?
Values(?000/1/1?3)
Delete订单
Where 日期=?000/1/1?/p>

 删除触发器:(x)DROP  TRIGGER  trigger_name

 事务通常是由BEGIN  TRAN 语句开始,一直执行到COMMIT  TRAN或ROLLBACK  TRAN语句时才l束?/p>

当执行完事务中的最后一Ҏ(gu)据库的操作后Q若没有M错误Q我们可以用COMMIT TRAN提交事务。反之,若发现在事务中有M的错误,则执行ROLLBACK  TRAN取消事务Qƈ回滚至事务执行前的状态?/p>

每执行完一Ҏ(gu)据库的操作后Q要立即(g)查@@ERROR和@@ROWCOUNTQ否则再执行下一Ҏ(gu)据库操作Ӟq?个系l变量将?x)被新的gѝ在更改或删除数据时Q若因指定条件不W或其他原因而没有更改到M一条记录,׃q种情况q不是错误(@@ERROR仍ؓ(f)0Q,因此我们q要(g)查@@ROWCOUNT的更Ҏ(gu)敎ͼ以确定数据已正确更改?/p>

 无论是COMMIT TRANq是ROLLBACK TRAN而结束的事务后,如果后面q有其他未执行的语句Q则q会(x)l箋执行q些语句Q直到批l束。不q已COMMIT的事务就无法再ROLLBACK了,同理Q已ROLLBACK的事务也无法再COMMIT了?/p>

 在事务中Q把事务中所有的语句看成是一个数据处理单元,因此单元必须全部做完或全部不做?/p>

 事务?大特性:(x)
1Q?原子性:(x)整个事务被看成一个执行单元,要么全部成功Q要么全部取消?br />2Q?一致性:(x)当事务完成后Q数据库的内容必d部更新妥当,而且仍然具备正确性及(qing)完整性?br />3Q?隔离性:(x)在事务中所使用到的数据Q必M其他同时在进行的事务适度隔离Q用锁定数据的Ҏ(gu)来隔M务)(j)
4Q?怹性:(x)事务一旦提交后Q其所作的数据修改被视ؓ(f)怹性的Q无法再用ROLLBACK回滚了?/p>


事务是以q接为单位,每个q接都可以有自己的事务?br />事务的执行有3U模式:(x)
1Q?外显事务2Q?自动提交事务3Q?隐含事务

嵌套事务是以最外层的事务ؓ(f)提交或回滚对象的?br />虽然嵌套事务是以最外层为提交对象的Q但其中的每个事务都有自qBEGIN TRAN 和COMMIT
其实事务是ؓ(f)存储q程而设计的Q因h们就可以在存储过E中撰写事务E序Q而不用担心该E序被调用时是否已在另一个事务之中?/p>

 @@TRANCOUNT事务计数
无论是那里调用ROLLBACKQ都?x)蟩转到最外层的BEGIN TRAN处,@@TRANCOUNT都会(x)变ؓ(f)0。?br />有时在事务中发生错误Ӟ我们希望只要回滚一部分就可以?br />则用SAVE TRANSACTION来设|“事务保存点”,然后在必要时使用ROLLBACK来回滚到所保存的位|,而不?x)中断事务?br />
ROLLBACK 后的事务名称只能是由SAVATRAN或最外层的BEGIN TRAN所声明的事务名U?/p>

游标的状态:(x)
1
 Cursor已打开Q其内有0Q?或多条记?br /> 0
 Cursor已打开Q但定其内没有查询CQ何一条信息记?br /> -1
 Cursor已关?br /> -2
 Cursor变量名未参照到时间Cursor或参照的Cursor已被DeAllocale
 -3
 指定的游标变量名不存?br /> 
Cursor主要是用于SQL扏V存储过E和出发器中?br />游标的格式:(x)
DECLARE  游标名?CURSOR  -------声明游标
FOR  SELECT 姓名  FROM 通讯薄?WHERE 地址=台北    -------------游标的数据来?br />OPEN 游标名 ?-----------打开游标
DECLARE  @name  varchar(20)
FETCH  NEXT  FROM  游标名   ?------------第一条数据存入@name
INTO  @name
WHILE(@@FETCH_STATUS=0)      -------------判断是否d数据Q?表示d数据
BEGIN
   FETCH  NEXT  FROM 游标?br />   INTO  @name
END
CLOSE  游标名 ?----------------关闭游标与数据的兌
DEALLOCATE  游标名?---------------游标对象删?br />除了Cursor中FETCH数据外,可以通过Cursor来UPDATE或DELETE一条目前所指定的记?/p>

UPDATE 标标公司   SET h=100  WHERE CURRENT  OF  游标?br />DELETE 标标公司   WHERE CURRENT  OF  游标?/p>

范例Q?br />DECLARE  MyCursor  CURSORLOCAL   SCROLL_LOCKS
FOR  SELECT hFROM  标标公司
FOR  UPDATE
OPEN  MyCursor
DECLARE  @money   money
FETCH  MyCursor  INTO @money
WHILE(@@FETCH_STATUS=0)
BEGIN
    IF  @money<=10
      BEGIN
         SET @money=money*1.1
               UPDATE  标标公司
               SET h=@money               -----------------更新h信息
               WHERE   CURRENT OF MyCursor
       END
FETCH  MyCursor  INTO @money
END

游标变量Q用SET已l声明好的游标给游标变量。在使用上,游标变量和游标是一样用的

全局游标和本地游标有相同的变量时Q以本地游标Z先调?/p>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 



dbsky 2006-07-03 20:15 发表评论
]]>
关于ODBC的读书笔?/title><link>http://www.shnenglu.com/dbsky/articles/9332.html</link><dc:creator><FONT color=red>dbsky </FONT> </dc:creator><author><FONT color=red>dbsky </FONT> </author><pubDate>Mon, 03 Jul 2006 11:23:00 GMT</pubDate><guid>http://www.shnenglu.com/dbsky/articles/9332.html</guid><wfw:comment>http://www.shnenglu.com/dbsky/comments/9332.html</wfw:comment><comments>http://www.shnenglu.com/dbsky/articles/9332.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/dbsky/comments/commentRss/9332.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/dbsky/services/trackbacks/9332.html</trackback:ping><description><![CDATA[ <p>ODBC(Open Database Connectivity)   Connectivity:q通?br />DSNQData Source NameQ用于指定ODBC与相关的驱动E序相对应的一个入?br />当应用程序要使用ODBC讉K数据库时Q就需要指定一个DSN以便于连接到一个指定的ODBC驱动E序</p> <p>ATL(Activeh?<br />UDA通用数据讉KQ用OLE DB讉KM数据?由O(jin)LE DB,ADO,ODBCl成<br />RDOq程数据对象<br />DAO数据讉K对象<br />ODBC开放数据库互连<br />ADO(Active Data Object)是一个访问OLE DB的类?br />OLE DB有一lCOM接口l成</p> <p>ODBC的框?br />1。用驱动器理器和特定的数据库驱动器来获得ODBC,<br />2。利用ODBC来调用应用程序,讉KODBC驱动器管理器(ODBC32DLL)Q?br />3。利用ODBC驱动器管理器调用数据库指定的ODBC驱动器,<br />4。利用数据库指定的ODBC驱动器来讉K数据?/p> <p>ODBC讉K多种数据?br />                                                                            |->Oracle ODBC数据库驱动器<br />ODBC应用E序-->ODBC驱动器管理程?->|                             -->关系数据库数据源<br />                                                                            |->SQL Server数据库驱动器</p> <p>CObjectc?CDatabase CRecordset讉K数据库源</p> <p> <br />DSN共分Zc:(x)<br />用户DSNQ对当前d用户可见Q只能够用于当前计算机?br />pȝDSNQ对当前pȝ上所有用户可见,包括NT中的服务?br />文gDSNQDSN信息存放在文件中Q对能够讉K到该文g的用户可见?/p> <p>一个用Access数据库的DSN中的信息如下Q?br />[ODBC]<br />DRIVER=Driver do Microsoft Access (*.mdb)<br />UID=Admin<br />DefaultDir=C:\DB<br />DBQ=C:\DB\1.mdb</p> <p>在用ODBC开发时一个重要的问题是数据转换的问?在程序运行过E中数据需要经历两ơ{换:(x)C语言的数据或l构cd与ODBC的数据类型的转换QODBC与SQL间数据类型的转换</p> <p>ODBC中的句柄分ؓ(f)三类Q环境句柄,数据库连接句柄,SQL语句句柄<br /></p> <img src ="http://www.shnenglu.com/dbsky/aggbug/9332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/dbsky/" target="_blank"><FONT color=red>dbsky </FONT> </a> 2006-07-03 19:23 <a href="http://www.shnenglu.com/dbsky/articles/9332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>动态创建MSSQL的DSNhttp://www.shnenglu.com/dbsky/articles/9330.html<FONT color=red>dbsky </FONT> <FONT color=red>dbsky </FONT> Mon, 03 Jul 2006 11:18:00 GMThttp://www.shnenglu.com/dbsky/articles/9330.htmlhttp://www.shnenglu.com/dbsky/comments/9330.htmlhttp://www.shnenglu.com/dbsky/articles/9330.html#Feedback0http://www.shnenglu.com/dbsky/comments/commentRss/9330.htmlhttp://www.shnenglu.com/dbsky/services/trackbacks/9330.html代码如下Q?br />if(SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN,"SQL Server","DSN=TestDB\0Description=TestAPIODBC\0SERVER=(local)\0DATABASE=TestDB"))
 {
  printf("32位ODBC数据源配|?Success!\n\n");
 }

dbsky 2006-07-03 19:18 发表评论
]]>
ھƷѾþӰԺ| ƷþùƷ99| þһٸ| ٸִִˬëƬþú| ղþǿѵĿ| ݺɫۺվþþþþþø | 99ξþþŷƷվ| þ޹ƷAVϼ| 99þ99ֻѷѾƷ| 99ȳ˾ƷѾþ| þ˾Ʒһ| þۺϺݺۺϾþü | 99þó˹Ʒ | ձþþþƷĻ| ˺ݺۺϾþ޸| þù߳׽ѹۿ| ŷ޾þav| ޺ݺۺϾþ| þþƷ޾Ʒ2020| պݺݾþ͵͵ɫۺ | þþþþþ99Ʒѹۿ| AVӰƬþþþþ| ҹþƷþþþ| þۺϾþùɫ| AAƬѿƵþ| 99þþƷѾƷһ| Ʒþþþþþþ| ھƷþþþӰԺվ| ˹ھƷþþþӰԺ| պƷþĻ| þþþþùƷ| þòӰ| ھƷþþþþþ| ޹Ʒ˾þ| þѾƷƵ| 99þþþþѿ| þþùƷվ| 99þùۺϾƷԭ | 99þˬ޾ƷŮ| 99þ99þþƷƬ| þþƷ|