avatar
Today is 星期天
2010年09月5日

搜索结果 分类目录: 数据库

2008年04月27日

精品SQL语句

由 晨笛 — 分类目录: 数据库评论暂缺
不错的哦!!!要滴朋友进来copy copy
说明:复制表(只复制结构,源表名:a 新表名:b)
1
SELECT * INTO b FROM a WHERE 1<>1
说明:拷贝表(拷贝数据,源表名:a 目标表名:b)
1
INSERT INTO b(a, b, c) SELECT d,e,f FROM b
说明:显示文章、提交人和最后回复时间
1
SELECT a.title,a.username,b.adddate FROM TABLE a,(SELECT max(adddate) adddate FROM TABLE WHERE TABLE.title=a.title) b
说明:外连接查询(表名1:a 表名2:b)
1
SELECT a.a, a.b, a.c, b.c, b.d, b.f FROM a LEFT out JOIN b ON a.a = b.c
说明:日程安排提前五分钟提醒
1
SELECT * FROM 日程安排 WHERE datediff('minute',f开始时间,getdate())>5
说明:两张关联表,删除主表中已经在副表中没有的信息
1
DELETE FROM info WHERE NOT EXISTS(SELECT * FROM infobz WHERE info.infid=infobz.infid)
说明:–
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT a.num, a.name, b.upd_date, b.prev_upd_date
FROM table1,
(SELECT x.num, x.upd_date, y.upd_date prev_upd_date
FROM (SELECT num, upd_date, inbound_qty, stock_onhand
FROM table2
WHERE to_char(upd_date,'yyyy/mm') = to_char(sysdate, 'yyyy/mm')) x,
(SELECT num, upd_date, stock_onhand
FROM table2
WHERE to_char(upd_date,'yyyy/mm') =
to_char(to_date(to_char(sysdate, 'yyyy/mm') || '/01','yyyy/mm/dd') - 1, 'yyyy/mm') ) y,
WHERE x.num = y.num (+)
AND x.inbound_qty + nvl(y.stock_onhand,0) <> x.stock_onhand ) b
WHERE a.num = b.num
说明:–
1
SELECT * FROM studentinfo WHERE NOT EXISTS(SELECT * FROM student WHERE studentinfo.id=student.id) AND 系名称='strdepartmentname' AND 专业名称='strprofessionname' ORDER BY 性别,生源地,高考总成绩
说明:从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT a.userper, a.tel, a.standfee, to_char(a.telfeedate, 'yyyy') AS telyear,
sum(decode(to_char(a.telfeedate, 'mm'), '01', a.factration)) AS jan,
sum(decode(to_char(a.telfeedate, 'mm'), '02', a.factration)) AS fri,
sum(decode(to_char(a.telfeedate, 'mm'), '03', a.factration)) AS mar,
sum(decode(to_char(a.telfeedate, 'mm'), '04', a.factration)) AS apr,
sum(decode(to_char(a.telfeedate, 'mm'), '05', a.factration)) AS may,
sum(decode(to_char(a.telfeedate, 'mm'), '06', a.factration)) AS jue,
sum(decode(to_char(a.telfeedate, 'mm'), '07', a.factration)) AS jul,
sum(decode(to_char(a.telfeedate, 'mm'), '08', a.factration)) AS agu,
sum(decode(to_char(a.telfeedate, 'mm'), '09', a.factration)) AS sep,
sum(decode(to_char(a.telfeedate, 'mm'), '10', a.factration)) AS oct,
sum(decode(to_char(a.telfeedate, 'mm'), '11', a.factration)) AS nov,
sum(decode(to_char(a.telfeedate, 'mm'), '12', a.factration)) AS dec
FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration
FROM telfeestand a, telfee b
WHERE a.tel = b.telfax) a
GROUP BY a.userper, a.tel, a.standfee, to_char(a.telfeedate, 'yyyy')
说明:四表联查问题
1
sql: SELECT * FROM a LEFT INNER JOIN b ON a.a=b.b RIGHT INNER JOIN c ON a.a=c.c INNER JOIN d ON a.a=d.d WHERE .....
说明:得到表中最小的未使用的id号
1
2
3
SELECT (case when EXISTS(SELECT * FROM handle b WHERE b.handleid = 1) then min(handleid) + 1 else 1 end) AS handleid
FROM handle
WHERE NOT handleid IN (SELECT a.handleid - 1 FROM handle a)

wxODBC的使用

由 晨笛 — 分类目录: 数据库4 条评论

很抱歉因为没有保存丢失了信息而耽搁了时间。教程已将配置环境做了描述,我就把通过WXODBC连接数据库的具体步骤再简要说一下。在使用wxODBC之前,我们需要先了解使用wxODBC访问数据库大概步骤:

1.Define datasource connection information //设置数据源连接信息

2.Get a datasource connection //获得数据连接

3.Create table definition //创建表对象

4.Open the table //打开表

5.Use the table //使用表

6.Close the table //关闭表

7.Close the datasource connection//关闭连接

8.Release the ODBC environment handle//释放环境句柄

一、设置数据源连接信息

使用wxDbConnectInf类对象设置数据源连接信息

结构:

wxDbConnectInf(HENV henv, const wxString &dsn, const wxString &userID=”",
const wxString &password, const wxString &defaultDir=”",
const wxString &description=”", const wxString &fileType=”")
参数:

henv:ODBC环境句柄

dsn:数据源名称

userID:数据库用户名称

password:用户密码

defaultDir:(可选)有特定路径

description:(可选)默认为空

fileType:(可选)默认为空

[cpp]
wxDbConnectInf *DbConnectInf = NULL;

DbConnectInf = new wxDbConnectInf(NULL, wxT(“RMSOURCE”),wxT(“”),wxT(“”));//设置连接信息

if (!DbConnectInf || !DbConnectInf->GetHenv())//连接并判断结果
{
wxMessageBox(wxT(“DB ENV ERROR: Cannot allocate ODBC env handle”));
}
[/cpp]
说明:

henv设成NULL是让构造函数在构造时分配一个环境句柄,我们也可使用AllocHenv()进行分配,这里不细述了。

二、获得数据连接

使用wxDbGetConnection()方法及wxDB类的对象来获得数据连接

结构:

wxDbGetConnection(wxDb * InfConfig)
参数:

InfConfig:数据源设置信息

[cpp]
wxDb *db = NULL;//声明一个wxDB对象来获得数据连接

db = wxDbGetConnection(DbConnectInf);

if (!db)//判断是否获得连接
{
wxMessageBox(wxT(“CONNECTION ERROR – Cannot get DB connection”));
}
[/cpp]

三、创建表对象

这里我们将用到wxDbTable类及其成员函数SetColDefs()

结构:

wxDbTable(wxDb *pwxDb, const wxString &tblName, const UWORD numColumns, const wxString
&qryTblName = “”, bool qryOnly = !wxDB_QUERY_ONLY, const wxString &tblPath = “”)
参数:

pwxDb:wxDb的指针

tblName:数据库中的表名

numColumns:表的列数

qryTblName:查询得到的数据的表名

qryOnly:查询得到数据的读写权限

tblPath:有些数据源需要特定路径

[cpp]
wxDbTable *table = NULL;

const wxChar tableName[] = wxT(“test”);

const UWORD numTableColumns = 2;

wxChar FirstName[50+1]; //table的数据成员,用来绑定数据库表中字段

wxChar LastName[50+1];

table = new wxDbTable(db, tableName, numTableColumns, wxT(“”), !

wxDB_QUERY_ONLY, wxT(“”));

/*将table中的变量与数据库中的字段进行绑定*/

table->SetColDefs(0, wxT(“FIRST_NAME”), DB_DATA_TYPE_VARCHAR, FirstName,

SQL_C_WXCHAR, sizeof(FirstName), true, true);

table->SetColDefs(1, wxT(“LAST_NAME”), DB_DATA_TYPE_VARCHAR, LastName,

SQL_C_WXCHAR, sizeof(LastName), true, true);
[/cpp]

说明:

我们在理解table时,一定要把它当成对象,这个对象由我们自己按照我们的需要来建立,这个对象与数据库中的表相对

应,我们对这个对象的控制实际上就是对数据库中表的控制,这个对象的数据成员自然也由我们来定,比如我们在建立一个对

象时并不需要数据库表中的所有字段,我们只需用SetColDefs()绑定我们需要的字段即可。要注意的是,tableName是数

据库中的表名,我们需要访问哪个表时,就建立一个wxdbtable对象与之对应,理解了这个我们操作数据库就很简单了。如果

我们new了一个新表名,那么我们可以用Creat()函数在数据空中建立一张新表,这里不细述了。

四、数据库的操作

在完成了上面的工作后,我们就可以对数据库进行操作了

[cpp]
/*打开我们要操作的表*/
if (!table->Open())
{
wxMessageBox(wxT(“TABLE OPEN ERROR: “));
}

/*接下来就可以对数据库进行操作了*/
// ———————————————————————–
// 添加记录
// ———————————————————————–
wxStrcpy(FirstName, wxT(“JULIAN”));//FirstName所绑定的字段将添加一条”JULIAN”记录

wxStrcpy(LastName, wxT(“SMART”));

if (!table->Insert())
{
wxMessageBox(wxt(“Insert error!”));
}
table->GetDb()->CommitTrans();//更新数据库时必须ComitTrans()
// ———————————————————————–
// 查询记录,也可使用QueryBySqlStmt(wxstring &sqlstmt),sqlstmt就是我们写的
// SQL语句,使用起来更为灵活。
// 例:
// wxString sql=”select * from Table “//根据需要写我们的查询语句
// if (table->QueryBySqlStmt(sql)
// {
// wxMessageBox(“QUERY ERROR”);
// }
// ———————————————————————–

/*查询语句,实际上就是SQL语句*/
table->SetWhereClause(wxT(“FIRST_NAME<>NULL”));//where从句

table->SetOrderByClause(wxT(“LAST_NAME”));//order从句

table->SetFromClause(wxT(“”));//from从句,这里是from table

if (!table->Query())//查询并判断结果
{
wxMessageBox(“QUERY ERROR”);
}
/*将查询结果显示到表格控件中*/

int n=0;//表格控件的行数

m_grid->AppendCols(2);//给表格控件增加2列

while (table->GetNext())
{
m_grid->AppendRows(1);//初始化wxGrid控件是为(0,0)

m_grid->SetCellValue(FirstName,n,0);

m_grid->SetCellValue(LastName,n,1);

n++;
}
// ———————————————————————–
// 删除记录
// ———————————————————————–
if (!table->DeleteWhere(wxT(“FIRST_NAME = ‘JULIAN’ and LAST_NAME = ‘SMART’”)))
{
wxMessageBox(wxT(“DELETION ERROR: “));
}

table->GetDb()->CommitTrans();

// ———————————————————————–
// 完成了对table的使用,我们必须做些清理工作
// ———————————————————————–
wxDELETE(table);//删除已使用完table

wxDbFreeConnection(db);//释放连接

db = NULL;

wxDbCloseConnections();//关闭所有连接

wxDELETE(DbConnectInf);//释放ODBC环境句柄
[/cpp]

小结:

就此我们使用wxODBC连接数据库并进行操作就基本完成了,当然在使用时要根据自己的需求来定,个人认为理解

wxDbTable类对象是使用wxODBC的关键。

wxODBC数据库开发

由 晨笛 — 分类目录: 数据库评论暂缺

wxWidgets支持ODBC需要以下几步:
1.首先是wxWidgets类库的支持
将include\wx\msw\setup.h的wxUSE_ODBC设为1
然后编译
2.在需要使用wxWidgets的ODBC的工程类库设置添加静态库:
\wxWidgets\lib\vc_lib\wxbase26d_odbc.lib(DEBUG)或 wxbase26_odbc.lib(Release)
\Program Files\Microsoft Visual Studio\VC98\Lib\odbc32.lib
又是好像使用IDE的编译方法 Batch Build 并完全不产生以上文件,可以再Batch Build 编译
\wxWidgets\samples\db
这个例子,则库文件一起被编译
3.先配置数据源
分为:用户DSN、系统DSN、文件DSN
似乎:只对配置用户DSN、系统DSN有效

4.例程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include
#include
//配置环境
wxDbConnectInf* env=NULL;
env=new wxDbConnectInf(NULL,wxT("SoftServer"),wxT("sa"),wxT("sa"));
//建立连接
wxDb* conn=NULL;
conn= wxDbGetConnection(env);
//建立 DbTable对象
wxDbTable* tbl=new wxDbTable(conn,wxT("mine"),2,wxT(""),wxDB_QUERY_ONLY, wxT(""));
//定义保存列内容的变量
wxString sst;
wxChar ID[100];
wxChar str[100+1];
//有几列定义几列
tbl->SetColDefs(0,wxT("ID"),DB_DATA_TYPE_VARCHAR,ID,SQL_C_NUMERIC,sizeof(ID),true,true);
tbl->SetColDefs(1,wxT("name"),DB_DATA_TYPE_VARCHAR,str,SQL_C_WXCHAR,sizeof(str),true,true);
//打开 DbTable对象
if (!tbl->Open()) {
wxMessageBox("error");
return;
}
//查询
if (!tbl->Query()) {
wxMessageBox("error");
return;
}
//读取变量
while (tbl->GetNext()) {
sst.Printf(wxT("%s | %s"),ID,str);
wxMessageBox(sst);
}
//关闭 DbTable对象
if (tbl) {
delete tbl;
tbl=0;
}
//关闭连接
if (conn) {
wxDbFreeConnection(conn);
conn=0;
}
//释放环境
env->FreeHenv();

5.SetColDefs中数据关系的对应
——————————————————————-
C++对应变量 dataType(逻辑数据类型) cType(SQL中数据类型)
——————————————————————-
wxChar DB_DATA_TYPE_VARCHAR SQL_VARCHAR
SQL_LONGVARCHAR

DB_DATA_TYPE_DATE SQL_C_DATE
DB_DATA_TYPE_INTEGER SQL_C_BIT
wxChar DB_DATA_TYPE_VARCHAR SQL_NUMERIC
DB_DATA_TYPE_FLOAT SQL_REAL
——————————————————————-
6.打开数据库联接的两个方法

1
2
3
4
5
6
7
8
9
10
wxDbConnectInf* env=NULL;
wxDb* conn=NULL;
env=new wxDbConnectInf(NULL,wxT("ABCServer"),wxT("sa"),wxT("sa"));
//方法一
conn=new wxDb(env->GetHenv());
if(!conn->Open(env)){
wxMessageBox("不能建立连接","DB CONNECTION ERROR", wxOK | wxICON_EXCLAMATION);
}
//方法二
conn=wxDbGetConnection(env);
© 2010 晨笛的博客 All rights reserved - Wallow theme by TwoBeers Crew - Powered by WordPress - 使用愉快!