[SQL

2023-11-04

目录

一、环境安装

二、环境配置

三、编写程序


一、环境安装

1.PostgreSQL10.23 X64(应该哪个版本都行);

(1)由于使用 EXEC SQL 这种嵌入方式已经非常古老,近些年的Mysql和SQL Server都已经不支持这种嵌入,因此使用 PostgreSQL。

(2)SQL Server 2000 版本似乎可以,但没试过。

(3)下载及安装查看:https://www.runoob.com/postgresql/windows-install-postgresql.html

2.Microsoft Viusal Studio 2017(vs其他版本、dev-cpp、codeblocks也行)。

二、环境配置

1.打开项目属性

2.将 [调试] 中的 [环境] 改为 bin 文件夹地址

3.将 [C++-常规] 中的 [附加库包含目录] 改为 include 文件夹地址

4.将 [链接器-常规] 中的 [附加库目录] 改为 lib 文件夹地址

 5.将 [链接器-输入] 中的 [附加依赖项] 加上 libecpg.lib 的地址

 6.在 PostgreSQL 的安装目录下,找到 bin 文件夹,从 bin 文件夹中拷贝下面七个 dll 至项目文件夹 

 7.将运行平台修改为 X64

三、编写程序

1.先了解一些东西

(1)EXEC SQL 这种嵌入方式,是不能写在任何一种高级程序语言中的。

因此DBMS会采用预编译方法处理。他们通常提供一个预处理器(.exe),当我们写好了预处理文件后,使用预处理器将预处理文件转换成宿主语言的标准文件,这个时候就可以使用高级语言的编译器运行了。

(2)不同的 DBMS 有不同的预处理文件格式,我们即将使用的 PostgreSQL 就是以(.pgc)作为格式。预处理器将该种文件处理过后,就会生成(.c)文件。

PostgreSQL 的预处理命令:(按照自己的路径去写即可)

(3)总结上面两点:当我们写好 预处理文件,就使用 预处理器 进行编译,接着运行预处理器产生的主语言程序即可。

2.编写程序

(1)首先我们知道,每一次 EXEC SQL 都相当于在命令行中写入一条语句。

(2)在预处理文件中,只要与 EXEC SQL 语句沾点边的变量,都必须在 main() 前进行声明,也就是主变量声明。

(3)在 PostgreSQL 中,连接到一个数据库后,只能对这个数据库内的表操作。

(4)其余看代码注释,下面是 预处理文件.pgc


#include "stdio.h"
#include "stdlib.h"
#include "string.h"

// 相当于高级程序语言的全局变量定义

EXEC SQL BEGIN DECLARE SECTION; // 主变量声明开始

const char* target1 = "postgres@localhost:5432"; // 数据库1
const char* user1 = "postgres";
const char* passwd1 = "123456";

const char* target2 = "spj@localhost:5432"; // 数据库2
const char* user2 = "postgres";
const char* passwd2 = "123456";


int rows = 0; // 表行数

char sno[10]; // s表的四个属性(s表是自定义的)
char sname[20];
int status;
char city[20];

EXEC SQL END DECLARE SECTION; // 主变量声明结束

int main() {
	EXEC SQL WHENEVER SQLERROR SQLPRINT; // error 时输出错误信息

	// 连接至数据库1
	EXEC SQL CONNECT TO :target1 USER :user1 USING :passwd1;
	printf("\n已连接%s\n", target1);

	EXEC SQL drop database if exists spj; // 删除 spj 数据库
	EXEC SQL create database spj; // 创建 spj 数据库

	// 断开数据库1
	EXEC SQL DISCONNECT CURRENT; // 这个不写也能运行,不知道有没有风险
	printf("\n已断开%s\n", target1);


	// 连接至数据库2
	EXEC SQL CONNECT TO :target2 USER :user2 USING :passwd2;
	printf("\n已连接%s\n", target2);

	// 下面五条exec sql,建表及插入
	EXEC SQL drop table if exists s;
	EXEC SQL CREATE TABLE IF NOT EXISTS s(sno char(10) primary key, sname char(20) unique, status int, city char(20));
	EXEC SQL insert into s(sno, sname, status, city) values('s1', 'APEX LEGEND', 114514, 'Wuhan'); 
	EXEC SQL insert into s(sno, sname, status, city) values('s2', 'DEVIL MAY CRY5', 616161, 'Wuhan');
	EXEC SQL insert into s(sno, sname, status, city) values('s3', 'WARFRAME', 123456, 'Wuhan');
	// 写入中文,数据库内是utf8,控制台输出的是gbk,会乱码

	
	EXEC SQL BEGIN; // BEGIN 事务块,DECLARE只能在事务块中使用

	// 定义游标,相当于每次读表的一行
	EXEC SQL DECLARE iterator CURSOR FOR 
				select sno, sname, status, city
				from s;

	EXEC SQL OPEN iterator; // 打开游标

	EXEC SQL select count(*) into :rows from s; // 获取行数,只有主变量能被sql赋值

	int flag = 0;
	while (rows --) {
		EXEC SQL fetch iterator into :sno, :sname, :status, :city; // fetch 获取一行元组
		
		if (flag ++ == 0) { // 第一次把列名输出
			printf("\n%-10s %-20s %-10s %-20s \n", "sno", "sname", "status", "city");
		}
		printf("%-10s %-20s %-10d %-20s \n", sno, sname, status, city);
	}
	EXEC SQL CLOSE iterator; // 关闭游标
	EXEC SQL END; // 结束事务块

	EXEC SQL DISCONNECT CURRENT; // 断开数据库2
	printf("\n已断开%s\n", target2);
	return 0;
}

动态SQL操作的代码:


#include "stdio.h"
#include "stdlib.h"
#include "string.h"

// 相当于高级程序语言的全局变量定义

EXEC SQL BEGIN DECLARE SECTION; // 主变量声明开始

const char* target = "postgres@localhost:5432"; // 数据库
const char* user = "postgres";
const char* passwd = "123456";

int rows = 0; // 表行数

// game表的属性(game表是自定义的)
char name[20];
int id;

const char *stmt = "insert into game values(?, ?);";

EXEC SQL END DECLARE SECTION; // 主变量声明结束

int main() {
	EXEC SQL WHENEVER SQLERROR SQLPRINT; // error 时输出错误信息

	// 连接至数据库
	EXEC SQL CONNECT TO :target USER :user USING :passwd;
	printf("\n已连接%s\n", target);

	EXEC SQL drop table if exists game;
	EXEC SQL create table game(id int primary key, name char(20));

	EXEC SQL prepare mystmt from :stmt;
	EXEC SQL execute mystmt using 1, 'Apex Legend';
	EXEC SQL execute mystmt using 2, 'Genshin';
	
	EXEC SQL BEGIN; // BEGIN 事务块,DECLARE只能在事务块中使用

	// 定义游标,相当于每次读表的一行
	EXEC SQL DECLARE iterator CURSOR FOR 
				select id, name
				from game;

	EXEC SQL OPEN iterator; // 打开游标

	EXEC SQL select count(*) into :rows from game; // 获取行数,只有主变量能被sql赋值

	int flag = 0;
	while (rows --) {
		EXEC SQL fetch iterator into :id, :name; // fetch 获取一行元组
		
		if (flag ++ == 0) { // 第一次把列名输出
			printf("\n%-10s %-20s \n", "id", "name");
		}
		printf("%-10d %-20s \n", id, name);
	}
	EXEC SQL CLOSE iterator; // 关闭游标
	EXEC SQL END; // 结束事务块

	EXEC SQL DISCONNECT CURRENT; // 断开数据库2
	printf("\n已断开%s\n", target);
	return 0;
}

本文介绍了二十几年前的嵌入式操作,欢迎纠错。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[SQL 的相关文章

随机推荐

  • vs2017无法打开“stdio.h”等源文件!

    因为系统重装了 vs不得不重新安装 不得不说简直就是残忍啊 最后差点砸电脑 心态都崩了 一个简单的helloworld 保留四百多个错误 简直就是残忍 网上找了很多教程 都是单独下载 然后配置环境什么的 越看越懵越看越不知道问题出在哪里 先
  • 进公司能不能转正,简单,就看能不能做事

    前几天听同事 他是应用组领导 讲到看一个人在工作上行不行 很简单 就看他能不能做事 感受 在换工作后 进入新公司 领导会给你任务 当然这得碰运气 运气好或许遇到的任务简单 或许是你以前做过的 很快就做完了 这样 你在3个月内也做不少事 而且
  • 面向对象的封装和继承

    封装 封装的概念 将类的某些信息隐藏在类内部 不允许外部程序直接访问 而是通过该类提供的方法来实现对隐藏信息的操作和访问 把尽可能多的东西藏起来 对外提供便捷的接口 封装的作用 便于使用者正确使用系统 防止错误修改属性 有助于系统之间的松耦
  • vue封装自己的组件库 02.封装dialog组件

    link https blog csdn net weixiaowei 2016 article details 104702793 四 封装一个element ui风格的dialog组件 前置知识 vue过渡动画 sync修饰符 具名插槽
  • linux集群高可用--crm

    一 高可用集群介绍 入门 http blog csdn net tjiyu article details 52643096 高可用集群的概念 非常重要 需要重点理解 什么是高可用集群 高可用集群 High Availability Clu
  • PCIE金手指各个引脚的定义及设计建议,避免入坑!

    最近在做一个PCIE转网口的项目 具体框图如下 SOC这边的板子是我们自己开发的 但是无法满足输出四个网口的需求 就想到了用PCIE2 0进行转接 右侧的网口扩展板是外购的 刚好满足PCIE2 0接口 并输出四路网口 于是采用了此架构进行设
  • 嵌入式相关开源项目、库、资料

    学习初期最难找的就是找学习资料了 本文精心汇总了一些嵌入式相关资源 包括但不限于编程语言 单片机 开源项目 物联网 操作系统 Linux 计算机等资源 并且在不断地更新中 致力于打造全网最全的嵌入式资料库 以下为最新资料汇总 github
  • 网页自动点击系统 (自动签到)

    Selenium是一个用于Web应用程序测试的工具 Selenium测试直接运行在浏览器中 就像真正的用户在操作一样 支持的浏览器包括IE 7 8 9 10 11 Mozilla Firefox Safari Google Chrome O
  • YOLOv3计算模型的mAP

    一 先测试一下大神的数据 在这里下载 https github com Cartucho mAP 1 解压之后如下图所示 input文件夹里面放的是测试集的ground truth 模型的测试结果 和测试集 scripts文件夹里面放的是一
  • 关于数据库的总结

    1 SQL MySQL SQLite简介 SQL 发音为字母S Q L或sequel 是结构化查询语言 Structured Query Language 的缩写 SQL是一种专门用来与数据库通信的语言 数据的所有存储 检索 管理和处理实际
  • 信息安全建设之安全平台搭建

    我们在进行网络安全层面体系建设的时候 需要涉及到很多安全产品 UTM 统一威胁管理 称为集成威胁管理 是安全措施之一 我们的目标是通过整合从而实现高效运营 而不是威胁组织网络的各种风险和管理设备 它不仅仅是针对外部组织的病毒防护和各种不断演
  • 【排序算法】插入排序(C语言)

    排序算法 插入排序 目录 一 插入排序的基本思想 二 插入排序的单趟排序 1 直接插入排序 2 二分法插入排序 三 插入排序的特点和效率 1 插入排序的特点 2 插入排序的效率 一 插入排序的基本思想 直接插入排序是一种简单的插入排序法 对
  • MAGMA

    LAPACK GPU MAGMA 使用gotoblas2 CUDA安装magma1 1 0 227 准备阶段 1 安装CUDA 2安装cpu BLAS 3安装LAPACK 安装过程 1 按照README文档进行安装 2 在make inc
  • 一份超详细的SpringMVC4常用知识清单!

    文章目录 1 SpringMVC 概述 2 使用 RequestMapping 映射请求 2 1 映射请求参数 请求方法或请求头 2 2 Maping支持通配符 3 PathVariable 映射 URL 绑定的占位符 4 REST 5 请
  • SVN查看文件的修改记录

    命令查看某个文件的修改历史 修改完某个文件后 要看改动的话使用如下命令 svn diff xxx xxx xx m svn diff 文件路径 如果要查看某次历史的提交的所有修改记录的话使用如下命令 svn diff c r12347
  • 基本类型题小结

    1 java基本数据类型 答 byte short int long float double char boolean 2 java数组声明方式 答 第一种方式 int a1 new int 1 2 3 直接声明并赋值 直接声明赋值数组是
  • python读取excel文件的单元格内容,去掉内容前个text

    打印的内容前有个text 对应的代码为 这个表示的是它内容的属性 加入你print的这个对象叫cell a 解决方法 可直接取中间的元素 cell a value就可以了 结果呈现
  • 【云原生之kubernetes实战】在k8s环境下部署OneNav个人书签工具

    云原生之kubernetes实战 在k8s环境下部署OneNav个人书签工具 一 OneNav介绍 1 OneNav简介 2 OneNav特点 二 检查本地k8s环境 1 检查工作节点状态 2 检查系统pod状态 三 docker部署One
  • 小朋友崇拜圈

    9 3 4 2 5 3 8 4 6 9 4 include
  • [SQL

    目录 一 环境安装 二 环境配置 三 编写程序 一 环境安装 1 PostgreSQL10 23 X64 应该哪个版本都行 1 由于使用 EXEC SQL 这种嵌入方式已经非常古老 近些年的Mysql和SQL Server都已经不支持这种嵌