SQLite 命令行客户端 + HTA 实现简易UI

SQLite 命令行客户端 + HTA 实现简易UI

  • SQLite 客户端.hta
  • 目录结构
  • V2
  • V3
  • 参考资料

仅用于探索可行性,就只实现了 SELECT

SQLite 客户端.hta

<!DOCTYPE html>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><HTA:APPLICATIONAPPLICATIONNAME="Demo"ID="JerryHTA"VERSION="1.0"ICON=""BORDER="dialog"SCROLL="no"SINGLEINSTANCE="yes"CONTEXTMENU="yes"NAVIGABLE="yes"/><meta http-equiv="x-ua-compatible" content="ie=edge"/><title>SQLite 客户端 - HTA 版</title><style>body { font-family: Arial, sans-serif; }#cmdResult { white-space: pre-wrap; }/* 表格样式 */table {width: 100%;border-collapse: collapse;margin-top: 20px;}table th,table td {border: 1px solid #ddd;padding: 8px;text-align: left;}/* 表头样式 */tabl thead th {background-color: #007BFF;color: white;font-weight: bold;text-transform: uppercase;}/* 鼠标悬停效果 */table tbody tr:hover {background-color: #f5f5f5;}/* 交替行颜色 */table tbody tr:nth-child(even) {background-color: #f2f2f2;}</style><script language="JScript">function runCmd() {var cmd = document.getElementById('cmdInput').value;try {var shell = new ActiveXObject("WScript.Shell");var sqlCmd = 'sqlite3.exe MY_DB.db ".mode html" ".headers on" ".width auto" "'+ cmd + '"';var encodingCmd = 'cmd /C CHCP 65001 > nul & ' + sqlCmd;var exec = shell.Exec(encodingCmd);while (exec.Status == 0){}var Stream = new ActiveXObject("ADODB.Stream");Stream.Open();Stream.Type = 2; // Text typeStream.Charset = "UTF-8";// 直接从文件读取数据,确保编码正确Stream.LoadFromFile('sqltemp');// 读取所有数据var result = Stream.ReadText(-1);Stream.Close();// 清除之前的输出并显示新结果document.getElementById('cmdResult').innerHTML = '<table>' + result + '</table>';} catch (e) {document.getElementById('cmdResult').innerText = "Error: " + e.message;}}</script>
</head>
<body><h1>SQLite 客户端</h1><textarea id="cmdInput" rows="5" cols="60">SELECT * FROM 订单表;</textarea><br/><button onclick="runCmd()">执行</button><hr/><h2>执行结果</h2><pre id="cmdResult"></pre>
</body>
</html>

目录结构

在这里插入图片描述

V2

忍不住优化了一版
在这里插入图片描述

<!DOCTYPE html>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="x-ua-compatible" content="ie=edge"/><HTA:APPLICATIONAPPLICATIONNAME="Demo"ID="JerryHTA"VERSION="1.0"ICON=""BORDER="dialog"SCROLL="no"SINGLEINSTANCE="yes"CONTEXTMENU="yes"NAVIGABLE="yes"></HTA:APPLICATION><title>SQLite 客户端 - HTA 版</title><style>html, body { font-family: Arial, sans-serif;height: 100%;	display: flex;flex-direction: column; /* 设置为垂直方向的Flex布局 */}button {width: 100px;height: 100px;}.line-group {display: flex;flex-direction: row;margin-left: 10px; /* 可以调整这个值来控制 textarea 和按钮之间的间距 */}.line-group > button:not(:last-child) {margin-right: 5px;}h2 { margin: 5px; 0;padding: 0 0 0 15px; }#cmdResult { flex: 1; /* #cmdResult 占用其父容器的剩余空间 */white-space: pre-wrap; background-color: #000;color: #eee;padding: 10px;margin: 5px;border-radius: 4px;}/* 表格样式 */table {width: 100%;border-collapse: collapse;background-color: #2b2b2b; /* 深色背景 */}table th, table td {border: 1px solid #555; /* 较亮的边框颜色以区分单元格 */padding: 8px;text-align: left;color: #fff; /* 白色文本 */}/* 表头样式 */table thead th {background-color: #3a3a3a; /* 更深的背景色 */color: #fff; /* 白色文本 */font-weight: bold;text-transform: uppercase;}/* 鼠标悬停效果 */table tbody tr:hover {background-color: #333; /* 鼠标悬停时的更深背景色 */}/* 交替行颜色 */table tbody tr:nth-child(even) {background-color: #222; /* 更深的交替行颜色 */}</style><script language="JScript">var shell = new ActiveXObject("WScript.Shell");var Stream = new ActiveXObject("ADODB.Stream");function runCmd(type) {var sqlite = sqliteClient.value; // "sqlite3.exe"; //var db = dbFile.value; // "MY_DB.db"; // var cmd = document.getElementById('cmdInput').value;var cmdStr = {"html": sqlite + ' ' + db + ' ".mode html" ".headers on" ".output sqltemp" "' + cmd + '"',"excel": sqlite + ' ' + db + ' ".headers on" ".excel" "' + cmd + '"',"cmd": cmd}[type];try {var encodingCmd = 'cmd /C CHCP 65001 > nul & ' + cmdStr;var exec = shell.Exec(encodingCmd);while (exec.Status == 0){}var result = "执行结束!"if (exec.ExitCode == 0) {if(type == "html"){Stream.Open();Stream.Type = 2; // Text typeStream.Charset = "UTF-8";// 直接从文件读取数据,确保编码正确Stream.LoadFromFile('sqltemp');// 读取所有数据result = Stream.ReadText(-1);Stream.Close();shell.Run("cmd /C del sqltemp");}if(type == "cmd"){result = exec.StdOut.ReadAll();}}else{result = exec.StdErr.ReadAll();}// 清除之前的输出并显示新结果document.getElementById('cmdResult').innerHTML = '<table>' + result + '</table>';} catch (e) {document.getElementById('cmdResult').innerText = "Error: " + e.message;}}</script>
</head>
<body><h1>SQLite 客户端</h1><div class="line-group"><div><label for="sqliteClient">SQLite:</label><input type="text" id="sqliteClient" name="sqliteClient" value="sqlite3.exe"></div><div><label for="dbFile">DB:</label><input type="text" id="dbFile" name="dbFile" value="MY_DB.db"></div></div><div class="line-group"><textarea id="cmdInput" rows="5" cols="60">SELECT * FROM 订单表;</textarea><div class="line-group"><button onclick="runCmd('cmd')" accesskey="c">执行CMD(C)</button><button onclick="runCmd('html')" accesskey="f">执行SELECT(F)</button><button onclick="runCmd('excel')" accesskey="e">导出Excel(E)</button></div></div><hr/><h2>执行结果</h2><div id="cmdResult"></div>
</body></html>

V3

忍不住又来一版
在这里插入图片描述

<!DOCTYPE html>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="x-ua-compatible" content="ie=edge"/><HTA:APPLICATIONAPPLICATIONNAME="Demo"ID="JerryHTA"VERSION="1.0"ICON=""BORDER="dialog"SCROLL="no"SINGLEINSTANCE="yes"CONTEXTMENU="yes"NAVIGABLE="yes"></HTA:APPLICATION><title>SQLite 客户端 - HTA 版</title><style>html, body { font-family: Arial, sans-serif;height: 100%;   display: flex;flex-direction: column;background-color: #212529; /* 深色背景 */color: #dee2e6; /* 文本淡色 */}button {width: 90px;height: 90px; /* 调整按钮高度以适应界面 */border: none;border-radius: 4px;cursor: pointer;outline: none;background-color: #485261;color: #ffffff;transition: all 0.3s ease;}button:hover {background-color: #0a58ca;}button:active {background-color: #0a429b;}.line-group {display: flex;align-items: center;margin: 5px; /* 增加外边距 */}.line-group > *:not(:last-child) {margin-right: 20px;}.input_grp {display: flex;align-items: center;flex: 1;}.input_grp > input, select {flex: 1;padding: 0.5em;border: 1px solid #343a40;border-radius: 4px;background-color: #343a40;color: #dee2e6;}#cmdInput {height: auto; /* 自动调整高度以适应内容 */resize: vertical; /* 允许用户调整高度 */background-color: #343a40;color: #dee2e6;padding: 0.5em;flex: 1;}h1, h2 {margin: 0;padding: 10px 0;font-weight: normal;}h1 {font-size: 24px;color: #ffffff;}h2 {font-size: 18px;color: #dee2e6;}#cmdResult {flex: 1;padding: 15px;overflow-y: auto; /* 添加滚动条以防内容溢出 */background-color: #343a40;color: #dee2e6;border-radius: 4px;margin-bottom: 10px;}/* 表格样式优化为深色 */table {width: 100%;border-collapse: collapse;background-color: transparent;}table th, table td {border: 1px solid #495057;padding: 10px;text-align: left;}table thead th {background-color: #0d6efd;color: #ffffff;font-weight: bold;text-transform: none;}table tbody tr:hover {background-color: rgba(255, 255, 255, 0.05);}table tbody tr:nth-child(even) {background-color: rgba(255, 255, 255, 0.1);}</style><script language="JScript">var shell = new ActiveXObject("WScript.Shell");var Stream = new ActiveXObject("ADODB.Stream");function getSql(text){// 分割文本为数组,每一项为一行var lines = text.trim().split('\n');// 处理每行文本,添加双引号并用空格连接return lines.map(function(line) {return '"' + line.trim() + '"';}).join(' '); // 使用空格连接处理后的每一行		 }function runCmd(type) {var sqlite = sqliteClient.value; // "sqlite3.exe"; //var db = dbFile.value; // "MY_DB.db"; // var cmd = document.getElementById('cmdInput').value;var cmdStr = {"html": sqlite + ' ' + db + ' ".mode html" ".headers on" ".output sqltemp" "' + cmd + '"',"excel": sqlite + ' ' + db + ' ".headers on" ".excel" "' + cmd + '"',"sql": sqlite + ' ' + db + ' ' + getSql(cmd),"cmd": cmd}[type];try {// alert(cmdStr); // 打印处理后的字符串var encodingCmd = 'cmd /C CHCP 65001 > nul & ' + cmdStr;var exec = shell.Exec(encodingCmd);while (exec.Status == 0){}var result = "执行结束!"if (exec.ExitCode == 0) {if(type == "html"){Stream.Open();Stream.Type = 2; // Text typeStream.Charset = "UTF-8";// 直接从文件读取数据,确保编码正确Stream.LoadFromFile('sqltemp');// 读取所有数据result = Stream.ReadText(-1);Stream.Close();shell.Run("cmd /C del sqltemp");}if(type == "cmd" || type == "sql"){result = exec.StdOut.ReadAll();}}else{result = exec.StdErr.ReadAll();}// 清除之前的输出并显示新结果document.getElementById('cmdResult').innerHTML = '<table>' + result + '</table>';} catch (e) {document.getElementById('cmdResult').innerText = "Error: " + e.message;}}// 确保文档加载完毕后再绑定事件document.onreadystatechange = function() {if (document.readyState === "complete") {init();}};var sqlObj = {"Order": "SELECT * FROM 订单表;","A5": "SELECT rowid as '序号', \"名称\", \"YW编号\", \"TY编号\", ext8 as '文档', '=HYPERLINK(E' || (rowid + 1) || ',\\\"打开\\\")' as '操作', * from A5表;","A7": "SELECT rowid as '序号', ext10 as \"DC编号\", \"XPDY编号\", \"TY编号\", ext8 as '文档', '=HYPERLINK(E' || (rowid + 1) || ',\\\"打开\\\")' as '操作', * from A7表;","A18": "SELECT rowid as '序号',\"DLWZ\", \"HZXM\", ext10 as \"YW编号\", \"TY编号\", ext8 as '文档', '=HYPERLINK(F' || (rowid + 1) || ',\\\"打开\\\")' as '操作', * from A18表;","file": "SELECT rowid as '序号', ext8 AS \"文档\", '=HYPERLINK(B' || (rowid + 1) || ',\\\"打开\\\")' as '操作', *  FROM \"文件记录表",}function init() {		document.getElementById('selectSQL').onchange = function(){var cmdInput = document.getElementById('cmdInput'); // 获取选中的值, cmdInput.value = sqlObj[this.value]; // 更新textarea的内容};}</script>
</head>
<body><h1>SQLite 客户端</h1><div class="line-group"><div class="input_grp"><label for="sqliteClient">SQLite:</label><input type="text" id="sqliteClient" name="sqliteClient" value="sqlite3.exe"></div><div class="input_grp"><label for="dbFile">DB:</label><input type="text" id="dbFile" name="dbFile" value="MY_DB.db"></div><div class="input_grp"><label for="selectSQL">选择SQL</label><select id="selectSQL" name="selectSQL"><option value="Order">订单表</option><option value="A5">A5 表</option><option value="A7">A7 表</option><option value="A18">A18 表</option><option value="file">文件记录表</option></select></div></div><div class="line-group"><textarea id="cmdInput" rows="5" cols="60">SELECT * FROM 订单表;</textarea><div class="line-group"><button onclick="runCmd('cmd')" accesskey="c">执行CMD(C)</button><button onclick="runCmd('sql')" accesskey="s">执行SQL(S)</button><button onclick="runCmd('html')" accesskey="f">执行SELECT(F)</button><button onclick="runCmd('excel')" accesskey="e">导出Excel(E)</button></div></div><hr/><h2>执行结果</h2><div id="cmdResult"></div>
</body>
</html>

参考资料

笑虾:SQLite 命令行客户端 + Windows 批处理应用
VBScript Scripting Techniques > HTAs
HTA & WSC Examples
599cd:HTA Tips

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/375915.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

StarRocks分布式元数据源码解析

1. 支持元数据表 https://github.com/StarRocks/starrocks/pull/44276/files 核心类&#xff1a;LogicalIcebergMetadataTable&#xff0c;Iceberg元数据表&#xff0c;将元数据的各个字段做成表的列&#xff0c;后期可以通过sql操作从元数据获取字段&#xff0c;这个表的组成…

Java版Flink使用指南——从RabbitMQ中队列中接入消息流

大纲 创建RabbitMQ队列新建工程新增依赖编码设置数据源配置读取、处理数据完整代码 打包、上传和运行任务测试 工程代码 在《Java版Flink使用指南——安装Flink和使用IntelliJ制作任务包》一文中&#xff0c;我们完成了第一个小型Demo的编写。例子中的数据是代码预先指定的。而…

人工智能大模型如何助力电商产品经理打造高效的商品工业属性画像

摘要 商品工业属性画像是电商产品经理在进行商品管理、推荐、搜索、广告等业务时的重要依据。通过对商品的工业属性&#xff08;如品类、品牌、规格、功能、风格等&#xff09;的准确识别和标注&#xff0c;可以提高商品的展示效果、匹配度、转化率和用户满意度。然而&#xf…

如何为IP申请SSL证书

目录 以下是如何轻松为IP地址申请SSL证书的详细步骤&#xff1a; 申请IP证书的基本条件&#xff1a; 申请IP SSL证书的方式&#xff1a; 确保网络通信安全的核心要素之一&#xff0c;是有效利用SSL证书来加密数据传输&#xff0c;特别是对于那些直接通过IP地址访问的资源。I…

Java 将图片转base64和base64转图片

工具 Base64 和 图片互转。 导入的依赖 <!-- https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-impl --><dependency><groupId>com.sun.xml.bind</groupId><artifactId>jaxb-impl</artifactId><version>4.0.5</versi…

【linux】进程间通信(IPC)——匿名管道,命名管道与System V内核方案的共享内存,以及消息队列和信号量的原理概述

目录 ✈必备知识 进程间通信概述 &#x1f525;概述 &#x1f525;必要性 &#x1f525;原理 管道概述 &#x1f525;管道的本质 &#x1f525;管道的相关特性 &#x1f525;管道的同步与互斥机制 匿名管道 &#x1f525;系统调用接口介绍 &#x1f525;内核原理 …

【开发环境】搭建PX4+ROS2+MAVROS2+Simulink+Optitrack实物联合仿真环境

搭建PX4ROS2MAVROS2SimulinkOptiTrack实物联合仿真环境 Ubuntu中的安装过程下载并编译PX4固件代码安装ROS2安装VRPN动捕数据转换ROS2话题库安装VRPN库拉取vrpn_client_ros2节点代码并配置VRPN server参数编译软件包启动vrpn_client_ros2节点重命名话题名 /vrpn/fly/pose 为 /ma…

Mac VSCode 突然闪退、崩溃、打不开了

vscode 1.90.2版本下载&#xff0c;刚上传还在审核中 1、 思路历程 VSCode 作为前端常用开发工具&#xff0c;其重要性就不一一描述了。 所以 VSCode 突然打不开了&#xff0c;真的是让我一脸懵逼。 本来以为问题不大&#xff0c;于是 &#xff1a; 1、重启了一下VSCode 2、…

Python 爬虫:使用打码平台来识别各种验证码:

本课程使用的是 超级鹰 打码平台&#xff0c; 没有账户的请自行注册&#xff01; 超级鹰验证码识别-专业的验证码云端识别服务,让验证码识别更快速、更准确、更强大 使用打码平台来攻破验证码难题&#xff0c; 是很简单容易的&#xff0c; 但是要钱&#xff01; 案例代码及测…

记录些Redis题集(1)

Redis内存淘汰触发条件的相关配置如下&#xff1a; Redis通过配置项maxmemory来设定其允许使用的最大内存容量。当Redis实际占用的内存达到这一阈值时&#xff0c;将触发内存淘汰机制&#xff0c;开始删除部分数据以释放内存空间&#xff0c;防止服务因内存溢出而异常。 Redi…

vitest 单元测试应用与配置

vitest 应用与配置 一、简介 Vitest 旨在将自己定位为 Vite 项目的首选测试框架&#xff0c;即使对于不使用 Vite 的项目也是一个可靠的替代方案。它本身也兼容一些Jest的API用法。 二、安装vitest // npm npm install -D vitest // yarn yarn add -D vitest // pnpm pnpm …

【Linux】vim详解

1.什么是vi/vim? 简单来说&#xff0c;vi是老式的文本编辑器&#xff0c;不过功能已经很齐全了&#xff0c;但是还是有可以进步的地方。vim则可以说是程序开发者的一项很好用的工具&#xff0c;就连 vim的官方网站&#xff08; http://www.vim.org&#xff09;自己也说vim是一…

【公益案例展】华为云X《无尽攀登》——攀登不停,向上而行

‍ 华为云公益案例 本项目案例由华为云投递并参与数据猿与上海大数据联盟联合推出的 #榜样的力量# 《2024中国数据智能产业最具社会责任感企业》榜单/奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 夏伯渝&#xff0c;中国无腿登珠峰第一人&#xff0c;一生43年…

语言模型演进:从NLP到LLM的跨越之旅

在人工智能的浩瀚宇宙中&#xff0c;自然语言处理&#xff08;NLP&#xff09;一直是一个充满挑战和机遇的领域。随着技术的发展&#xff0c;我们见证了从传统规则到统计机器学习&#xff0c;再到深度学习和预训练模型的演进。如今&#xff0c;我们站在了大型语言模型&#xff…

免费开源数字人生成工具

使用步骤更是简单到不行&#xff1a; 1. 输入图片&#xff1a;选择你想要生成动态视频的肖像图片。 2. 输入音频&#xff1a;提供与图片匹配的音频文件&#xff0c;EchoMimic会根据音频内容驱动肖像的动态效果。 3. 设置参数&#xff1a;一般保持默认设置即可&#xff0c;当然&…

端到端自动驾驶系列(一):自动驾驶综述解析

端到端自动驾驶系列(一)&#xff1a;自动驾驶综述解析 End-to-end-Autonomous-Driving Abstract Abstract—The autonomous driving community has witnessed a rapid growth in approaches that embrace an end-to-end algorithm framework, utilizing raw sensor input to …

模块化(一)nodejs

模块化 一.模块化的基本概念1.1 什么是模块化1.2 模块化规范 二.Node.js 中的模块化2.1 Node.js 中模块的分类2.2 加载模块2.3 Node.js 中的模块作用域2.4 向外共享模块作用域中的成员 一.模块化的基本概念 1.1 什么是模块化 模块化 是指解决一个 复杂问题 时&#xff0c;自顶…

uni-app 保存号码到通讯录

1、 添加模块 2、添加权限 3、添加策略 Android&#xff1a; "permissionExternalStorage" : {"request" : "none","prompt" : "应用保存运行状态等信息&#xff0c;需要获取读写手机存储&#xff08;系统提示为访问设备上的照片…

安卓14中Zygote初始化流程及源码分析

文章目录 日志抓取结合日志与源码分析systemServer zygote创建时序图一般应用 zygote 创建时序图向 zygote socket 发送数据时序图 本文首发地址 https://h89.cn/archives/298.html 最新更新地址 https://gitee.com/chenjim/chenjimblog 本文主要结合日志和代码看安卓 14 中 Zy…

HarmonyOS ArkUi 字符串<展开/收起>功能

效果图&#xff1a; 官方API&#xff1a; ohos.measure (文本计算) 方式一 measure.measureTextSize 跟方式二使用一样&#xff0c;只是API调用不同&#xff0c;可仔细查看官网方式二 API 12 import { display, promptAction } from kit.ArkUI import { MeasureUtils } fr…