我有一台Dataman高速ID扫描仪,我需要与SQL Server 2008数据库进行通信。它有几种不同的通信方式,但唯一不是工业协议的方法是Telnet。如何让数据库通过Telnet与扫描仪通信?
如果您对如何与之沟通有任何其他建议,我也很乐意听到它们。
答案 0 :(得分:3)
您需要编写一个使用Telnet与扫描仪通信的应用程序,然后可以相应地从数据库中读/写。
例如,您可以使用C#编写内容(使用Visual Studio)并使用以下库进行Telnet访问:
http://www.codeproject.com/Articles/19071/Quick-tool-A-minimalistic-Telnet-library
如果您确实需要让数据库执行代码,那么您可以在C#中编写一些东西,然后在SQL Server 2008中使用CLR integration来获取。但我建议您保留应用程序与数据库分开(为了便于开发和测试)。
答案 1 :(得分:1)
您可以在SQLCLR stored procedure中创建一个telnet客户端,然后从常规的TSQL存储过程调用CLR过程。 SQLCLR并不常用,但它比许多人认为的更强大,而且我已经与那些取得了很好成功的团队进行了交谈。
要记住的一件事是,如果您使用SQLCLR路由,那么如果您决定采纳其他问题的建议并实施,那么您将编写与您编写的相同的.NET代码将数据推送到SQL Server的外部实用程序。唯一的区别是,使用SQLCLR,存储过程可以主动触发telnet交互。
SQLCLR存储过程需要一些特殊技术,但Visual Studio数据库项目可以很容易地创建一个。
答案 2 :(得分:0)
SQL Server本身无法做到这一点,所以无论如何你都不得不在舒适区之外。另外,“在服务器上”是指在运行SQL Server的同一物理服务器上,还是指“在SQL Server实例中”?
您当然可以从存储过程中的xp_cmdshell
调用本地PowerShell脚本,或者作为SQL Server代理作业步骤的一部分,如果您需要它是异步的(如果您没有运行Express Edition,哪个没有Agent)。这是一个PowerShell脚本,它不会使PowerShell掌握最终以适应您的需求:
Automating Telnet with 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视为批处理脚本主机恕我直言。