zoukankan      html  css  js  c++  java
  • 使用sqlite扩展,避免在sql语句中使用不易看懂和难以维护的数字或名称缩写

    本人最近使用C/C++操作sqlite数据库进行GIS数据转换时,感觉sqlite有个不方便的地方就是不能在sql中定义枚举量和常量。相比C/C++就提供了宏定义,枚举和常量定义来帮助程序员避免在代码使用无意义的数字。本人操作的GIS数据库中有很多枚举量,如道路表中道路类型列就是枚举量:0表示高速,1表示国道,2表示省道,3表示县道等。如果不能在sql中定义这些枚举量,那么在根据道路类型选择道路时我们就必须在sql中使用数字,如:选出所有高速的sql将是select * from road_table where road_type = 0,这种sql太恶心了,你根本不知道0代表什么意义。

    通过搜索引擎知道sqlite可以让用户自己扩展sql函数,感觉可以使用sqlite扩展函数来解决这个问题。sqlite扩展sql函数的方法和步骤:首先按sqlite扩展函数的原型定义自己的函数,然后使用sqlite3_create_function注册到sqlite中,然后就可以在sql中使用自己定义的函数了,就跟使用预定义好的sqlite核心函数一样。
    例如,我们可以把高速类型定义成一个扩展函数,这个函数返回0:
    static void fun_ROAD_TYPE_HIGHWAY( sqlite3_context * context, int argc, sqlite3_value ** value ) { sqlite3_result_int64( context, 0 ); };
    然后把它注册到sqlite中,注册名为ROAD_TYPE_HIGHWAY:
    sqlite3_create_function( db, "ROAD_TYPE_HIGHWAY", 0, SQLITE_ANY, 0, fun_ROAD_TYPE_HIGHWAY, 0, 0 )
    注册完后我们就可以在sql语句中通过注册名ROAD_TYPE_HIGHWAY来使用这个函数了,如:选出所有高速的sql可以写成select * from road_table where road_type = ROAD_TYPE_HIGHWAY(),这样是不是好多了。

    由于GIS数据库中的枚举量居多,如果每个都要手工写个函数并注册,这肯定是一个超级体力活,所以用perl写了一个根据c/c++头文件生成sqlite扩展函数的小程序: https://files.cnblogs.com/adgnat/sqlitefungen.7z
    程序使用方法:
    1.确保安装了perl5和vc
    2.下载程序并解压,
    3.打开cmd.exe,并进入程序(sqlitefungen)目录

    4.运行vcvars32.bat初始化VC编译环境,  


    5.执行自动生成脚本:perl sqlitefungen.perl mydb.h,mydb.h可以换成自己定义的头文件。


    6.执行完后头文件目录下将生成一个同名的dll文件,你可以在sqlite3.exe中使用.load命令或sql中使用load_extension函数来加载该dll,加载后就可以使用dll中定义的扩展函数了。

  • 相关阅读:
    java 判断是否满足正则表达式
    bootstrap-select多选框与Vue整合,下拉的数据刷新不出
    Windows 修改host文件不起作用
    【服务器】【tomcat】Tomcat 应用目录重定向
    【Spring】Spring装配Bean的顺序
    【Maven】m2e以原型创建Maven Project再次失败
    【Maven】m2eclipse以maven-archetype-quickstart原型创建Maven Project失败的解决
    【Java SE】jar xvf "path"命令
    【Java SE】形参被初始化为实参的值的拷贝
    【Java SE】斐波那契数列
  • 原文地址:https://www.cnblogs.com/adgnat/p/2111175.html
Copyright © 2011-2022 走看看