数据库 数据库编程二

//头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <mysql/mysql.h>
#include <termios.h>

#ifdef __cplusplus
extern "C"
{
#endif
//设置退格键不回显
int set_Backkey();

//获取用户SQL语句,判断用户操作,不区分大小写
void read_user_print(MYSQL *pmysql,MYSQL *connection);

#ifdef __cplusplus
}
#endif
//辅助方法实现
#include "pub.h"

//设置退格键不回显
int set_Backkey()
{
    struct termios term;
    memset(&term, 0, sizeof(term));
    /*获取当前系统的termios设置*/
    if (tcgetattr(STDIN_FILENO, &term) == -1)
    {
        printf("tcgetattr() failed! error message:%s\n", strerror(errno));
        return -1;
    }
    /*设置tremios的擦除字符功能为退格键*/
    term.c_cc[VERASE] = ‘\b‘;
    if (tcsetattr(STDIN_FILENO, TCSANOW, &term) == -1)
    {
        printf("tcsetattr() failed! error message:%s\n", strerror(errno));
        return -1;
    }
    return 0;
}

//获取用户SQL语句,判断用户操作,不区分大小写
void read_user_print(MYSQL *pmysql, MYSQL *connection)
{
    if (connection == NULL || pmysql == NULL)
    {
        printf("read_user_print() params not correct!\n");
        return;
    }
    /*等待用户控制台输入*/
    //获取数据库名称
    char buf_mysql[100] = { 0 };
    strcpy(buf_mysql, "mysql1>");
    int i = 0,j = 0;
    char temp_buf[1024] = { 0 };
    while (1)
    {
        /*显示mysql1>*/
        write(STDOUT_FILENO, buf_mysql, sizeof(buf_mysql));
        /*等待用户输入*/
        char buf_read[1024] = { 0 };
        read(STDIN_FILENO, buf_read, sizeof(buf_read));
        /*执行用户SQL*/
        /*判断用户输入的是查询操作,还是更新操作,
         * 更新操作有 update,delete,use,set,insert
         * 注意不区分大小写匹配
         * 将用户所有输入都转化为大写,遇到空格结束
         * */
        memset(temp_buf,0,sizeof(temp_buf));
        strcpy(temp_buf, buf_read);
        for (i=0; i < strlen(temp_buf); i++)
        {
            //如果当前字符不是空格
            if (temp_buf[i] != ‘ ‘)
            {
                if (temp_buf[i] > 96 && temp_buf[i] < 123)
                {
                    /*小写转化成大写*/
                    temp_buf[i] = temp_buf[i] - 32;
                }
            } else
            {
                break;
            }
        }
        int flag = 0;
        if (strncmp(temp_buf, "UPDATE", 6) == 0)
        {
            flag = 1;
        } else if (strncmp(temp_buf, "DELETE", 6) == 0)
        {
            flag = 1;
        } else if (strncmp(temp_buf, "USE", 3) == 0)
        {
            flag = 1;
        } else if (strncmp(temp_buf, "SET", 3) == 0)
        {
            flag = 1;
        } else if (strncmp(temp_buf, "INSERT", 6) == 0)
        {
            flag = 1;
        }
        //执行mysql_query()
        if (mysql_query(connection, buf_read) != 0)
        {
            printf("SQL error:%s\n", mysql_error(pmysql));
            break;
        }
        if (flag)
        {
            printf("SQL 更新成功!\n");
        } else
        {
            //执行查询语句
            MYSQL_RES *result = mysql_store_result(connection);
            if (result == NULL)
            {
                printf("mysql_store_result() failed !\n");
                break;
            }
            MYSQL_ROW row;
            MYSQL_FIELD *field;
            /*展示列数据*/
            int numx = 0;
            while (1)
            {
                field = mysql_fetch_field(result);
                if (field == NULL)
                    break;
                printf("%s\t", field->name);
                numx++;
            }
            printf("\n");
            while (1)
            {
                row = mysql_fetch_row(result);
                if (row == NULL)
                    break;
                /*打印一行中每一列的数据*/
                for (j=0; j < numx; j++)
                {
                    printf("%s\t", row[j]);
                }
                /*每行换行*/
                printf("\n");
            }
            //释放查询结果集
            mysql_free_result(result);
        }
        printf("\n");
    }
}
//mysql客户端实现
#include "pub.h"

int main(int arg, char *args[])
{
    //mysql -h 192.168.1.101 -u dbuser1 -p
    if (arg < 4)
    {
        printf("please print three params!\n");
        return -1;
    }
    char hostname[100] = { 0 };
    char username[100] = { 0 };
    char passwd[100] = { 0 };
    //char dbname[100] = { 0 };
    if (strncmp(args[1], "-h", 2) == 0)
    {
        strcpy(hostname, args[1]);
        strcpy(username, args[4]);
    } else if (strncmp(args[1], "-u", 2) == 0)
    {
        strcpy(hostname, "localhost");
        strcpy(username, args[2]);
    } else
    {
        printf("error print!");
        return -1;
    }
    //获取密码
    strcpy(passwd, getpass("Enter password: "));
    //设置退格键不回显
    if (set_Backkey() < 0)
    {
        printf("设置退格键不回显失败!\n");
    }
    //创建mysql connection
    MYSQL mysql, *connection=NULL;
    //init mysql
    mysql_init(&mysql);
    //connect mysql server
    connection = mysql_real_connect(&mysql, hostname, username, passwd, "", 0,
            0, 0);
    if (connection == NULL)
    {
        printf("mysql_real_connect() failed ! error message:%s\n",
                mysql_error(&mysql));
        return -1;
    }
    /*用户输入*/
    read_user_print(&mysql,connection);
    //close sql server
    mysql_close(connection);
    return 0;
}
.SUFFIXES:.c .o
CC=gcc
SRCS=tec01.c    pub.c
OBJS=$(SRCS:.c=.o)
EXEC=runsql

start:$(OBJS)
    $(CC) -o $(EXEC) $(OBJS) -lmysqlclient
    @echo "-------OK----------"
.c.o:
    $(CC) -Wall -g -o [email protected] -c $<
clean:
    rm -f $(OBJS)
    rm -f $(EXEC)
时间: 2024-08-10 00:05:21

数据库 数据库编程二的相关文章

数据库 Proc编程二

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include "sqlca.h" //连接数据库 /* EXEC SQL CONNECT {:user IDENTIFIED BY :oldpswd | :usr_psw } [[AT { dbname | :host_variable }] USING :conne

Linux平台上SQLite数据库教程(二)——C语言API介绍

Linux平台上SQLite数据库教程(二)--C语言API介绍 前言:本文将介绍几个基本的SQLite3数据库的C语言API接口,主要用到两个文件:sqlite3.c.sqlite3.h.源码地址:https://github.com/AnSwErYWJ/SQLite. 打开数据库 1.原型: int sqlite3_open( const char* filename, /* 数据库文件名, 必须为 UTF-8 格式 */ sqlite3** ppDB /* 输出: SQLite 数据库句柄

数据库基本操作(二)--数据查询

//数据查询 create database JXGL; //创建数据库 use JXGL;//使用数据库 create table S( Sno char(10) not null unique, Sname char(20) not null unique, Ssex char(2), Sage int, Sdept char(20)); create table C( Cno char(2) not  null primary key (Cno), Cname char(20), Teac

Manual | BSD手册| Linux手册 | 数据库手册 | 编程开发手册 | WEB开发手册 | 软件应用手册 | 网络技术手册 | GNU手册

豆豆手册 □ BSD手册 □ Linux手册 □ 数据库手册 □ 编程开发手册 □ WEB开发手册 □ 软件应用手册 □ 网络技术手册 □ GNU手册 在线手册 首 页 BSD手册 ·FreeBSD Handbook 简体中文版 ·NetBSD Internals ·NetBSD 指导手册 ·FreeBSD Porter 手册 ·FREEBSD 使用者手册 ·FreeBSD 5.x 架设管理与应用 ·FreeBSD 6.0架设管理与应用 ·OpenBSD FAQ中文版 Linux手册 ·Turb

近乎社区数据库设计说明(二)

二.用户相关 1.用户账号 源码地址:http://www.jinhusns.com/Products/Download/?type=xcj tn_Users 字段名称 字段类型 可空 特殊 默认值 字段描述 UserId bigint 主键 UserName NVarChar (64) 索引 唯一 用户名 Password NVarChar (128) 密码 PasswordFormat Int (1) 0=Clear(明文) 1=标准MD5 PasswordQuestion NVarChar

数据库中的二维表—巧借Excel

一维表和二维表的区别         一维表也常称为流水线表格,它和二维表做出的数据透视表最大的区别在于"行总计".判断数据是一维表格还是二维表格的一个最简单的办法,就是看其列的内容--每一列是否是一个独立的参数.如果每一列都是独立的参数那就是一维表,如果每一列都是同类参数那就是二维表. 二维表的建立     开始在网上一直查找如何在数据库中建立二维表,查了很多资料大多是什么静态和动态的sql语句建立,看了看也不是很清楚但是在查询的时候总是出来Excel如何如何,于是便想是否可以在Ex

MySQL数据库高级(二)——自定义函数

MySQL数据库高级(二)--自定义函数 一.自定义函数简介 自定义函数 (user-defined function UDF)是一种对MySQL扩展的途径,其用法和内置函数相同.自定义函数的两个必要条件:A.参数B.返回值(必须有).函数可以返回任意类型的值. 二.自定义函数的使用 1.自定义函数语法 CREATE?FUNCTION?function_name(parameter_nametype,[parameter_name type,...]) RETURNS?{STRING|INTEG

代写SQL、数据库SQL代写、SQL代写、数据库SQL编程代写

代写SQL.数据库SQL代写.SQL代写.数据库SQL编程代写 我和我的小伙伴均毕业于国内外顶尖高校.就职于一线互联网企业,从事高级开发,熟悉MySQL.Oracle.SQL Server等一系列数据库的设计与开发 现接SQL代写业务(主要面向留学生)当然,我们更多接的是C.C++.Java.Python.Go编程代写? 声明 1.绝不抄袭,不坑学生是我们的底线 2.绝不使用太高级语法 3.无限期免费答疑.无限期修改直到您满意为止 联系方式 微信leechanx 或者直接扫码: 部分成交截图 原

【码上开心】Windows环境mysql数据库使用(二)skip-grant-tables 与用户名密码修改

skip-grant-tables #跳过数据库权限验证 我们安装MySql 设置my.ini配置文件的时候,常常会在my.ini中添加 skip-grant-tables ,这时接数据库可以使用任意账号或者密码了. 这里顺便说一下,如何[通过 skip-grant-tables重置账户密码]: 到mysql根目录找到mysql配置文件 在my.ini,[mysqld]下添加一行,使其登录时跳过权限检查 如果mysql服务在运行,通过停 net stop mysql 止mysql服务 重新通过 

第八章、数据库后台编程技术

第八章.数据库后台编程技术 内容提要: 1.掌握存储过程的定义与使用 2.掌握用户定义函数的创建与使用 3.掌握触发器的定义与使用 4.掌握游标的定义与使用 第一节 存储过程 1.基本概念 使用T-SQL语言编写代码时,有两种方式存储和执行代码: (1)在客户端存储代码,通过客户端程序或SQL命令向DBMS发出操作请求,由DBMS将结果返回给用户程序. (2)以子程序的形式将程序模块存储在数据库中,供有权限的用户通过调用反复执行. 存储过程:即存储在数据库中供所有用户程序调用的子程序. 存储过程