《数据库系统概论》第八章数据库编程 ODBC 和 JDBC

第八章 数据库编程

ODBC

代码参考:https://blog.csdn.net/buptlihang/article/details/80275641

#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
#include <string.h>
using namespace std;
int main()
{
	SQLHENV serverhenv;  //环境句柄
	SQLHDBC serverhdbc;  //连接句柄
	SQLHSTMT serverhstmt;//语句句柄
	SQLRETURN ret;       //结果句柄
	SQLCHAR Sno[10] = { 0 }, Sname[10] = { 0 }, Grade[5] = {0};
	SQLLEN length;
	//分配环境句柄
	ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &serverhenv);
	//设置环境句柄
	ret = SQLSetEnvAttr(serverhenv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);
	if (!SQL_SUCCEEDED(ret)) {
		cout << "AllocEnvHandle error!" << endl;
		system("pause");
	}
	//分配连接句柄
	ret = SQLAllocHandle(SQL_HANDLE_DBC, serverhenv, &serverhdbc);
	if (!SQL_SUCCEEDED(ret)) {
		cout << "AllocDbcHandle error!" << endl;
		system("pause");
	}
	//连接数据库
	ret = SQLConnect(serverhdbc, (SQLWCHAR *)"ODBC_TEST", SQL_NTS, (SQLWCHAR*)"root", SQL_NTS, (SQLWCHAR*)"root", SQL_NTS);
	if (!SQL_SUCCEEDED(ret)) {
		cout << "SQL_Connect error!" << endl;
		system("pause");
	}

	//分配执行语句句柄
	ret = SQLAllocHandle(SQL_HANDLE_STMT, serverhdbc, &serverhstmt);
	//执行SQL语句
	ret = SQLExecDirect(serverhstmt,(SQLWCHAR*)"INSERT INTO TEST VALUES(160004,'王兰花',120);", SQL_NTS);
	ret = SQLExecDirect(serverhstmt, (SQLWCHAR*)"SELECT Sno,Sname,Grade FROM TEST;", SQL_NTS);  //查询结果也可能为空
	if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) {
		//绑定数据(定义游标区,让游标知道怎么去移动取数据,比如移动Sno长度就是取Sno,移动了length就是取了一行数据)
		SQLBindCol(serverhstmt, 1, SQL_C_CHAR, (void*)Sno, sizeof(Sno), &length);   //推测这里length是一行的长度,每次就要加上去
		SQLBindCol(serverhstmt, 2, SQL_C_CHAR, (void*)Sname, sizeof(Sname), &length);
		SQLBindCol(serverhstmt, 3, SQL_C_CHAR, (void*)Grade, sizeof(Grade), &length);
		//将光标移动到下一行,获取下一行数据
		while (SQL_NO_DATA != SQLFetch(serverhstmt)) {
			//只要还有数据就向后推进
			cout << "学生学号:" << Sno << " 学生姓名:" << Sname << " 学生成绩:" << Grade << endl;
		}
	}
	//释放语句句柄
	ret = SQLFreeHandle(SQL_HANDLE_STMT, serverhstmt);
	if (SQL_SUCCESS != ret && SQL_SUCCESS_WITH_INFO != ret)  //如果没有显示成功并且没有显示有数据就表示出错
		cout << "free hstmt error!" << endl;
	//断开数据库连接
	ret = SQLDisconnect(serverhdbc);
	if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) //同上
		cout << "disconnect error!" << endl;
	//释放连接句柄
	ret = SQLFreeHandle(SQL_HANDLE_DBC, serverhdbc);
	if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO)
		cout << "free hdbc error !" << endl;
	//释放环境句柄
	ret = SQLFreeHandle(SQL_HANDLE_ENV, serverhenv);
	if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO)
		cout << "free henv error !" << endl;
	system("pause");
    return 0;
}

JDBC

参考代码:http://www.cnblogs.com/wuyuegb2312/p/3872607.html

https://blog.csdn.net/wk992337444/article/details/79279276

首先要下载一个mysql的jdbc驱动程序,也就是一个jar包,放到如下的路径中,也就是java根目录的放lib库的目录

我使用的是idea,需要先将这个驱动程序导入,具体的步骤是 File -> Project Struct -> Modules -> Dependencies -> 右边的加号,然后把上图这个选中的包导入就OK了。

PS:JDBC访问数据库时候更新删除和修改操作要调用 Statement对象的ExecuteUpdate()方法,最基本的参数就是sql语句,返回的是int类型变量

进行查询的时候要调用Statement对象的ExecuteQuery()方法,返回的是查询结果集

package com.mysql;
import java.sql.*;

public class sql_test {
    public static void main(String[] args){
        Connection conn=null;  //初始化连接对象
        Statement statement=null;//初始化语句对象
        ResultSet res=null;    //初始化结果集对象
        int success;
        //连接数据库
        try{
            Driver driver = new com.mysql.jdbc.Driver();
            DriverManager.registerDriver(driver);   //注册驱动器
            String url = "jdbc:mysql://localhost:3306/jdbc_test";
            String user = "root";
            String password = "root";
            conn = DriverManager.getConnection(url,user,password);
        }catch(SQLException e){
            e.printStackTrace();
        }
        //插入操作
        try{
            //获取数据操作的对象
            statement = conn.createStatement();
            String sql_insert = "insert into student values(160003,'小李',142)";  //插入语句
            success = statement.executeUpdate(sql_insert);
        }catch(SQLException e){
            e.printStackTrace();
        }
        //查询操作
        try{
            statement = conn.createStatement();
            String sql_query = "select * from student";
            res = statement.executeQuery(sql_query);
            while(res.next()){
                //每当还有数据的时候
                int sno = res.getInt("Sno");
                String sname = res.getString("Sname");
                int grade = res.getInt("Grade");
                System.out.println(sno+ " " + sname + " " + grade);
            }
        }catch (SQLException e){
            e.printStackTrace();
        }
        //删除操作
        try{
            statement = conn.createStatement();
            String sql_delete = "delete from student where Sno = 160001";
            success = statement.executeUpdate(sql_delete);
        }catch(SQLException e){
            e.printStackTrace();
        }
        //修改操作
        try{
            statement = conn.createStatement();
            String sql_update = "update student set Grade=145 where Sno=160002";
            success = statement.executeUpdate(sql_update);
        }catch(SQLException e){
            e.printStackTrace();
        }
        //最后再查询
        try{
            statement = conn.createStatement();
            String sql_query = "select * from student";
            res = statement.executeQuery(sql_query);
            System.out.println("最后的一次查询,看看前面的操作正确执行了没");
            while(res.next()){
                int sno = res.getInt("Sno");
                String sname = res.getString("Sname");
                int grade = res.getInt("Grade");
                System.out.println(sno+ " " + sname + " " + grade);
            }
        }catch(SQLException e){
            e.printStackTrace();
        }
        //断开连接
        try{
            res.close();
        }catch(SQLException e){
            e.printStackTrace();
        }
    }
}

最后的结果:

第二章 关系数据库 1 .试述关系模型的三个组成部分。 答:关系模型由关系数据结构、关系操作集合和关系完整性约束三部分组成。 2 .试述关系数据语言的特点和分类。 答:关系数据语言可以分为三类: 关系代数语言。 关系演算语言:元组关系演算语言和域关系演算语言。 SQL:具有关系代数和关系演算双重特点的语言。 这些关系数据语言的共同特点是,语言具有完备的表达能力,是非过程化的集合操作语言,功能强,能够嵌入高级语言中使用。 3 (略) 4 . 5 . 述关系模型的完整性规则。在参照完整性中,为什么外部码属性的值也可以为空?什么情况下才可以为空? 答:实体完整性规则是若属性A是基本关系R的主属性,则属性A不能取空值。 若属性(或属性组)F是基本关系R的外码,它与基本关系S的主码Ks相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须为:或者取空值(F的每个属性值均为空值);或者等于S中某个元组的主码值。即属性F本身不是主属性,则可以取空值,否则不能取空值。 6.设有一个SPJ数据库,包括S,P,J,SPJ四个关系模式: 1)求供应工程J1零件的供应商号码SNO: πSno(σJno=‘J1’(SPJ)) 2)求供应工程J1零件P1的供应商号码SNO: πSno(σJno=‘J1’∧Pno=‘P1‘(SPJ)) 3)求供应工程J1零件为红色的供应商号码SNO: πSno(πSno,,Pno(σJno=‘J1‘ (SPJ))∞πPno(σCOLOR=’红‘ (P))) 4)求没有使用天津供应商生产的红色零件的工程号JNO: πJno(SPJ)- πJNO(σcity=‘天津’∧Color=‘红‘ (S∞SPJ∞P) 5)求至少用了供应商S1所供应的全部零件的工程号JNO: πJno,Pno(SPJ)÷ πPno(σSno=‘S1‘ (SPJ)) 7. 试述等值连接与自然连接的区别和联系。 答:连接运算符是“=”的连接运算称为等值连接。它是从关系R与S的广义笛卡尔积中选取A,B属性值相等的那些元组 自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。 8.关系代数的基本运算有哪些 ? 如何用这些基本运算来表示其他运算? 答:并、差、笛卡尔积、投影和选择5种运算为基本的运算。其他3种运算,即交、连接和除,均可以用这5种基本运算来表达。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值