连接到 SAMPLE 数据库,查询 LASTNAME 为 JOHNSON 的 FIRSTNAME 信息。
INCLUDE SQLCA; (1)
"util.h"
#include
#include
#include
#include
#include
EXEC SQL
main()
{
EXEC SQL BEGIN DECLARE
char
char
char
EXEC SQL
EXEC SQL CONNECT
EXEC SQL
firstname[13];
userid[9];
passwd[19];
SECTION; (2)
END DECLARE SECTION;
TO sample; (3)
SELECT
name = %s\n",
INTO :firstname (4)
LASTNAME = 'JOHNSON';(4)
"First
FIRSTNME
FROM employee
WHERE
printf(
EXEC SQL CONNECT RESET; (5)
return
}
上面是一个简单的静态嵌入 SQL 语句的应用程序。它包括了嵌入 SQL 的主要部分:
(1)中的 include SQLCA 语句定义并描述了 SQLCA 的结构。SQLCA 用于应用程序和数据库之间
0;
firstname
);
的通讯,其中的 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 语句。如果一条嵌入式 SQL 语句占用多行,在 C 程序中可
以用续行符“\”。
c 语言用 vc 连接 sql server 2000
2009/11/02 09:34
[sql server ]
1.提取单条记录
//#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
//no_namespace,rename("EOF","adoEOF"),named_guids
CoInitialize(NULL);
_bstr_t varSource="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=*.mdb";
//_bstr_t varSource="Data Source=myServerAddress;Initial
Catalog=myDataBase;User Id=myUsername;Password=myPassword;"
_ConnectionPtr m_pConnection(_uuidof(Connection));
m_pConnection->Open(varSource,"","",adModeUnknow);
_RecordsetPtr m_pSet(_uuid(Recordset));
try {
m_pSet->Open(%%1,m_pConnection.GetInterfacePtr()
adOpenDynamic,adLockPessimistic,adCmdText);
}
catch(_com_error *e){
{
AfxMessageBox(e->ErrorMessage());
return;
}
_variant_t var;
CString %%2="";
long fldc=m_pSet->GetFields()->GetCount();
long i=0;
try {
m_pSet->MoveFirst();
if(!m_pSet->adoEOF)
{
for(i=0;iGetCollect((long)i);
var.ChangeType(VT_BSTR);
%%2+=var.bstrVal;
%%2+=" ";
}
//m_pSet->MoveNext();
}
}
catch(_com_error *e){
AfxMessageBox(e->ErrorMessage());
delete e;
}
//m_pSet->MoveFirst();
CoUninitialize(NULL);
2.单值比较
//#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
//no_namespace,rename("EOF","adoEOF"),named_guids
CoInitialize(NULL);
_bstr_t varSource="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=*.mdb";
//_bstr_t varSource="Data Source=myServerAddress;Initial
Catalog=myDataBase;User Id=myUsername;Password=myPassword;"
_ConnectionPtr m_pConnection(_uuidof(Connection));
m_pConnection->Open(varSource,"","",adModeUnknow);
_RecordsetPtr m_pSet(_uuid(Recordset));
try {
m_pSet->Open(%%1,m_pConnection.GetInterfacePtr()
adOpenDynamic,adLockPessimistic,adCmdText);
}
catch(_com_error *e){
{
AfxMessageBox(e->ErrorMessage());
return;
}
_variant_t var;
try {
m_pSet->MoveFirst();
if(!m_pSet->adoEOF)
{
var=m_pSet->GetCollect((long)0);
var.ChangeType(VT_I2);
int %%3=var.intVal;
if(%%3==%%4)
{
%%5
}
//m_pSet->MoveNext();
}
catch(_com_error *e){
AfxMessageBox(e->ErrorMessage());
delete e;
}
//m_pSet->MoveFirst();
CoUninitialize(NULL);
3.显示表格
//#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
//no_namespace,rename("EOF","adoEOF"),named_guids
CoInitialize(NULL);
_bstr_t varSource="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=*.mdb";
//_bstr_t varSource="Data Source=myServerAddress;Initial
Catalog=myDataBase;User Id=myUsername;Password=myPassword;"
_ConnectionPtr m_pConnection(_uuidof(Connection));
m_pConnection->Open(varSource,"","",adModeUnknow);
//打开属性为默认(adModeRead(只读),adModeWrite(可写),
adModeReadWrite(可读写)等)
_RecordsetPtr m_pSet(_uuid(Recordset));
try {
HRESULT hr=m_pSet->Open(%%1,m_pConnection.GetInterfacePtr(),
adOpenDynamic,adLockPessimistic,adCmdText);
}
catch(_com_error *e){
AfxMessageBox(e->ErrorMessage());
}
if(SUCCESSED(hr))
{
//表打开成功
}
FieldsPtr p_fields=m_pSet->Fields;
FieldPtr p_field;
_variant_t var_index;
LPCSTR field_name;
int index=0;
_bstr_t bstr_field_name;
int countfields=p_fields->GetCount();
CString *Column=new CString[countfields];
CListCtrl *pList=(CListCtrl*)GetDlgItem(%%1);//IDC_LIST_TABLEDATA
VERIFY(pList);
pList->DeleteAllItems();
for(index=0;indexItem[var_index];
bstr_field_name=p_field->GetName();
field_name=(LPCSTR)bstr_field_name;
Column[index]=field_name;
int ColumnWidth=Column[index].GetLength()*15;
pList->InsertColumn(index,field_name,LVCFMT_CENTER,ColumnWidth);
}
int i=0;
_bstr_t vCol;
//pList->SetTextBkColor(RGB(122,200,122));
//pList->SetTextColor(RGB(0,0,200));
while(!m_pSet->adoEOF)
{
pList->Insert(i,atoi(i));
for(int j=0;jGetCollect((long)j);
pList->SetItemText(i,j,vCol);
}
m_pSet->MoveNext();
i++;
}
CoUninitialize(NULL);
C 语言与 SQL SERVER 数据库
1.使用 C 语言来操作 SQL SERVER 数据库,采用 ODBC 开放式数据库连接进行数据
的添加,修改,删除,查询等操作。
step1:启动 SQLSERVER 服务,例如:HNHJ,开始菜单 ->运行 ->net start
mssqlserver
step2:打开企业管理器,建立数据库 test,在 test 库中建立 test 表(a
varchar(200),b varchar(200))
step3:建立系统 DSN,开始菜单 ->运行 ->odbcad32,
添加->SQL SERVER
名称:csql,服务器:HNHJ
使用用户使用登录 ID 和密码的 SQLSERVER 验证,登录 ID:sa,密码:
更改默认的数据库为:test
...
测试数据源,测试成功,即 DNS 添加成功。
2.cpp 文件完整代码
//##########################save.cpp##########################
C 代码
1. #include
2. #include
3. #include
4. #include
5. #include
6. #include
7. #include
8.
9.
sqlhenv henv = sql_null_henv;
10. sqlhdbc hdbc1 = sql_null_hdbc;
11. sqlhstmt hstmt1 = sql_null_hstmt;
12.
13. /*
14.
15.
16.
17. */
18. int main(){
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
//预编译 SQL 语句
//直接 SQL 语句
//2.连接句柄
cpp 文件功能说明:
1.数据库操作中的添加,修改,删除,主要体现在 SQL 语句上
2.采用直接执行方式和参数预编译执行方式两种
RETCODE retcode;
UCHAR szDSN[SQL_MAX_DSN_LENGTH+1] = "csql",
szUID[MAXNAME] = "sa",
szAuthStr[MAXNAME] = "";
//SQL 语句
UCHAR sql[37] = "insert into test values('aaa','100')";
UCHAR pre_sql[29] = "insert into test values(?,?)";
//1.连接数据源
//1.环境句柄
retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
(SQLPOINTER)SQL_OV_ODBC3,
SQL_IS_INTEGER);
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
retcode = SQLConnect(hdbc1, szDSN, 4, szUID, 2, szAuthStr, 0);
//判断连接是否成功
if
(retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_I
) {
(
NFO)
39.
40.
41.
42.
43.
44.
45.
46.
printf("连接失败!\n");
} else {
//2.创建并执行一条或多条 SQL 语句
/*
1.分配一个语句句柄(statement handle)
2.创建 SQL 语句
3.执行语句
4.销毁语句
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
*/
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
//第一种方式
//直接执行
//添加操作
//SQLExecDirect (hstmt1,sql,37);
//第二种方式
//绑定参数方式
char a[200]="bbb";
char b[200]="200";
SQLINTEGER p = SQL_NTS;
//1 预编译
SQLPrepare(hstmt1,pre_sql,29); //第三个参数与数组大小相同,而不是数据库列
相同
//2 绑定参数值
SQLBindParameter(hstmt1,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,2
00,0,&a,0,&p);
SQLBindParameter(hstmt1,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,2
00,0,&b,0,&p);
//3 执行
SQLExecute(hstmt1);
printf("操作成功!");
//释放语句句柄
SQLCloseCursor (hstmt1);
SQLFreeHandle (SQL_HANDLE_STMT, hstmt1);
}
//3.断开数据源
/*
1.断开与数据源的连接.
2.释放连接句柄.
3.释放环境句柄 (如果不再需要在这个环境中作更多连接)
*/
SQLDisconnect(hdbc1);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return(0);
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83. }
//##########################list.cpp##########################
C 代码
1. #include
2. #include
3. #include
4. #include
5. #include
6. #include
7. #include
8.
9. SQLHENV henv = SQL_NULL_HENV;
10. SQLHDBC hdbc1 = SQL_NULL_HDBC;
11. SQLHSTMT hstmt1 = SQL_NULL_HSTMT;
12.
13. /*
14. 查询 SQLSERVER 数据库,1.条件查询,2.直接查询全部
15. */
16. int main(){
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
UCHAR sql1[39] = "select b from test where a = 'aaa'";
UCHAR sql2[35] = "select b from test where a = ? ";
UCHAR sql3[19] = "select b from test";
(SQLPOINTER)SQL_OV_ODBC3,
SQL_IS_INTEGER);
szUID[MAXNAME] = "sa",
szAuthStr[MAXNAME] = "";
RETCODE retcode;
UCHAR szDSN[SQL_MAX_DSN_LENGTH+1] = "csql",
retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
//1.连接数据源
retcode = SQLConnect(hdbc1, szDSN, 4, szUID, 2, szAuthStr, 0);
if
(retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_I
) {
(
NFO)
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
printf("连接失败!");
} else {
//2.创建并执行一条或多条 SQL 语句
/*
1.分配一个语句句柄(statement handle)
2.创建 SQL 语句
3.执行语句
4.销毁语句
*/
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
//第一种方式