【问题标题】:In SQL Server 2008, how can I create and send/recieve data over a Telnet connection?在 SQL Server 2008 中,如何通过 Telnet 连接创建和发送/接收数据?
【发布时间】:2012-04-25 01:58:21
【问题描述】:

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

如果您对如何与之交流有任何其他建议,我也很乐意听到。

【问题讨论】:

  • 我同意史蒂夫的观点,我会构建一个应用程序,充当数据库和扫描仪之间的接口。我不确定你为什么认为代码必须在存储过程中......
  • @AaronBertrand 我宁愿坚持使用我已经在使用的语言(Access VBA 和 SQL Server 2008),而不是添加新的语言。为了提高效率,我还尝试在服务器上保留尽可能多的代码。
  • 注意效率不会以可维护性为代价
  • 嗯,这就是为什么我希望找到一种在服务器上创建 Telnet 连接的简单方法 :)

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


【解决方案1】:

您需要编写一个使用 Telnet 与扫描仪通信的应用程序,然后可以相应地从数据库中读取/写入。

例如,您可以用 C# 编写一些东西(使用 Visual Studio)并使用以下库进行 Telnet 访问:

http://www.codeproject.com/Articles/19071/Quick-tool-A-minimalistic-Telnet-library

如果你真的,真的必须让数据库来执行代码,那么你也许可以用 C# 编写一些东西,然后在 SQL Server 2008 中使用CLR integration 来获取。但我建议你将应用程序分开来自数据库(为了便于开发和测试目的)。

【讨论】:

  • 有没有办法把它作为数据库中的存储过程来做?
  • 我已经更新了我的答案 - 恐怕没有集成的方法可以做到这一点(我知道)。
  • 我正在尝试这个。我们将看看它是如何工作的。不过,必须先学习一点 C# 知识
  • 上周学习了所有关于 SQLCLR 和 C# 的知识。一切正常,我只需要让程序集停止用空值向表格发送垃圾邮件。好吧,它们实际上并不是空值。我不知道它们是什么。
【解决方案2】:

您可以在SQLCLR stored procedure 中创建一个 telnet 客户端,然后从常规 TSQL 存储过程调用 CLR 过程。 SQLCLR 不是很常用,但它比许多人想象的更强大,而且我已经与在它方面取得成功的团队进行了交谈。

要记住的一件事是,如果您采用 SQLCLR 路线,您将编写相同的 .NET 代码,如果您决定采纳该问题的其他答案的建议并实施将数据推送到 SQL Server 的外部实用程序。唯一不同的是,使用 SQLCLR 存储过程可以主动触发 telnet 交互。

SQLCLR 存储过程需要一些特殊技术,但 Visual Studio 数据库项目可以很容易地创建一个。

【讨论】:

    【解决方案3】:

    好吧,SQL Server 本身无法做到这一点,因此无论如何您都必须稍微走出自己的舒适区。另外,“在服务器上”是指在运行 SQL Server 的同一物理服务器上,还是指“在 SQL Server 实例内部”?

    您当然可以在存储过程中从 xp_cmdshell 调用本地 PowerShell 脚本,或者如果您需要它是异步的(并且如果您没有运行 Express Edition,它不会作为 SQL Server 代理作业步骤的一部分)没有代理)。这是一个 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 不应被视为批处理脚本主机。

    【讨论】:

    • 那能不能从telnet连接的另一端接收数据并返回给存储过程?我以前从未使用过 PowerShell,不确定它是如何工作的。
    • 您可以将输出插入到#tmp 表中,这是一种典型的kludgy 解决方法。我将在帖子中添加一个示例。
    猜你喜欢
    • 2014-09-26
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 2019-10-08
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    相关资源
    最近更新 更多