在SQL Server 2008中,如何通过Telnet连接创建和发送/接收数据?

时间:2012-04-23 22:33:31

标签: sql-server sql-server-2008 telnet

我有一台Dataman高速ID扫描仪,我需要与SQL Server 2008数据库进行通信。它有几种不同的通信方式,但唯一不是工业协议的方法是Telnet。如何让数据库通过Telnet与扫描仪通信?

如果您对如何与之沟通有任何其他建议,我也很乐意听到它们。

3 个答案:

答案 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视为批处理脚本主机恕我直言。