我有一个 Dataman 高速 ID 扫描仪,我需要与 SQL Server 2008 数据库进行通信。它有几种不同的通信方式,但唯一不是工业协议的方式是 Telnet。如何让数据库通过 Telnet 与扫描仪通信?
如果您对如何与它交流有任何其他建议,我也很想听听。
我有一个 Dataman 高速 ID 扫描仪,我需要与 SQL Server 2008 数据库进行通信。它有几种不同的通信方式,但唯一不是工业协议的方式是 Telnet。如何让数据库通过 Telnet 与扫描仪通信?
如果您对如何与它交流有任何其他建议,我也很想听听。
您将需要编写一个使用 Telnet 与扫描仪对话的应用程序,然后可以相应地从数据库中读取/写入。
例如,您可以用 C# 编写一些东西(使用 Visual Studio)并使用以下库进行 Telnet 访问:
http://www.codeproject.com/Articles/19071/Quick-tool-A-minimalistic-Telnet-library
如果你真的,真的必须让数据库来执行代码,那么你可以用 C# 编写一些东西,然后使用SQL Server 2008 中的CLR 集成来获取这些东西。但我建议将你的应用程序与数据库分开(为了便于开发和测试目的)。
您可以在SQLCLR 存储过程中创建 telnet 客户端,然后从常规 TSQL 存储过程调用 CLR 过程。SQLCLR 不是很常用,但它比许多人想象的更健壮,而且我已经与在它方面取得成功的团队进行了交谈。
要记住的一件事是,如果您采用 SQLCLR 路线,您将编写与您决定采纳其他答案的建议并实施外部实用程序时所编写的相同的 .NET 代码将数据推送到 SQL 服务器。唯一的区别是使用 SQLCLR 存储过程可以主动触发 telnet 交互。
SQLCLR 存储过程需要一些特殊的技术,但是 Visual Studio 数据库项目可以很容易地创建一个。
好吧,SQL Server 本身无法做到这一点,所以无论如何你都必须走出你的舒适区。另外,“在服务器上”是指在运行 SQL Server 的同一物理服务器上,还是指“在 SQL Server 实例内部”?
您当然可以从存储过程内部调用本地 PowerShell 脚本xp_cmdshell
,或者如果您需要它是异步的(并且如果您没有运行没有代理的 Express Edition),则作为 SQL Server 代理作业步骤的一部分。这是一个 PowerShell 脚本,不需要最终掌握 PowerShell 即可适应您的需求:
为了从存储过程中调用它,您首先需要确保它xp_cmdshell
已启用:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE;
GO
EXEC sp_configure 'xp_cmdshell', 1;
EXEC sp_configure 'show advanced options', 0;
RECONFIGURE WITH OVERRIDE;
GO
作为警告,很多人认为暴露xp_cmdshell
是一种类似禽流感的流行病。对我来说,这一切都是关于控制对机器的访问,而不是控制机器可以做什么和不能做什么来满足您的业务需求。
以下是使用您发送到的任何内容的输出的快速示例xp_cmdhsell
。这只是一个标准的命令行调用,因此您必须对其进行调整以调用 PowerShell 脚本,但它的工作原理应该大致相同:
CREATE TABLE #tmp(i INT IDENTITY(1,1), x VARCHAR(2048));
INSERT #tmp(x) EXEC master..xp_cmdshell 'dir C:\Users\';
SELECT x FROM #tmp ORDER BY i;
DROP TABLE #tmp;
结果:
Volume in drive C has no label.
Volume Serial Number is 50D3-008B
NULL
Directory of C:\Users
NULL
01/10/2012 09:20 AM <DIR> .
01/10/2012 09:20 AM <DIR> ..
01/19/2011 11:54 PM 1,444 SomeFile.txt
.... other files...
3 File(s) 28,918,500 bytes
18 Dir(s) 19,367,292,416 bytes free
NULL
但是一旦你花了一个多小时搞砸它来让它工作,我认为你最好编写一个作为服务或间隔运行的应用程序,检查队列表以获取新的 telnet 处理以, 完成工作,然后将结果写入 SQL Server。您的 RDBMS 不应被视为批处理脚本主机恕我直言。