交互式 SQL 控制台
一个交互式 SQL 控制台应用程序,
引言
在使用 SQL Server 自带的 OSQL.EXE 命令行工具后,一些小问题促使我创建了自己的版本。具体来说,我想要的功能是:
- 能够通过 Odbc 或 OleDb 以及直接连接到 SQL Server 来与任何数据库进行通信
- 更好地格式化输出,使其在普通的 80 列控制台上可读
- 能够保存可配置的参数,这样每次启动应用程序时都不需要重新设置
SQL.EXE
这是我的一个简易解决方案,它编译成 SQL.EXE,我大概花了 30 分钟编写完成(贡献这篇文章花的时间更长!)。它与 OSQL.EXE 有一些关键的区别,即:
- 默认情况下,它以“直接”模式运行,因此输入查询并按 Enter 键将立即执行,而不是等待 'go' 命令。
- 默认情况下,它会将输出水平截断以适应 80 列,并将行数限制为 50(但仍然显示总数)。更重要的是,它根据数据的最大长度而不是字段大小来确定每列的宽度。
- 它不接受命令行参数,但支持从提示符打开数据库连接。
SQL.EXE 有几个特殊的命令,都以斜杠开头。
/open {连接字符串}
建立数据库连接。连接字符串不应放在引号中,并且可以是适合 Odbc 连接、OleDb 连接或直接 SQL Server 连接的字符串。这是通过查找关键连接字符串参数(特别是 OleDb 的 "Provider"、Odbc 的 "Driver" 或 "DSN" 和 SQL Server 的 "Server")自动确定的。如果无法自动确定连接类型,则默认为 Odbc。
/indirect
切换到“间接”模式,该模式等效于 OSQL.EXE:您可以跨多行输入查询,然后运行 'go' 命令来执行它。
/direct
切换回默认的“直接”模式,该模式仅支持单行查询。
/limit [{n}]
获取或设置将要显示的最大行数。如果未指定 n,则仅显示当前设置。
/width [{n}]
获取或设置每行显示的最大宽度。如果未指定 n,则仅显示当前设置。
/trunc [{n}]
获取或设置任何给定列值的最大字符数,如果总宽度将超过当前 width 设置。如果未指定 n,则仅显示当前设置。
/timeout [{n}]
获取或设置允许查询执行的最大秒数。如果未指定 n,则仅显示当前设置。默认值为 3600 秒(一小时),远高于 .NET 默认值 30 秒。
/save
将所有当前参数保存到应用程序数据目录中名为 sql.cmd 的文件中。下次重新启动 SQL.EXE 时,将重新加载这些参数。这包括当前打开的连接,因此下次运行该应用程序时,您不必记住连接字符串。它不包括 echo 文件名。
/restore
执行 /save
命令写入的 sql.cmd 文件中的所有命令。这会在启动时自动发生。
/close
关闭当前数据库连接。
/echo [{filename}|off]
导致查询的输出转储到以制表符分隔的文件中,适合通过 SQL Server 的 BULK INSERT
命令导入。请注意,无论使用什么设置进行显示,文件输出都不会以任何方式截断。您通常应该仅将此命令用于单个查询的结果,因为没有列信息写入到文件中。每次都会覆盖该文件。
还有三个从 osql.exe 继承的特殊命令,即:
go
,它执行在间接模式下输入的任何查询reset
,它清除在间接模式下输入的任何查询quit
,它结束应用程序
所有其他命令都按原样直接传递给数据库提供程序,并且生成的任何错误都按原样显示。
更改日志
- 15-Jan-07
- 添加了将查询输出回显到文件的功能
- 修复了仅显示批处理命令的第一个结果的问题