SQL Server 2008 データベースと通信する必要がある Dataman 高速 ID スキャナーがあります。通信にはいくつかの方法がありますが、産業用プロトコルではない唯一の方法は Telnet です。データベースが Telnet を介してスキャナーと通信できるようにするにはどうすればよいですか?
それとのコミュニケーション方法について他に提案があれば、それも聞いてみたいです。
SQL Server 2008 データベースと通信する必要がある Dataman 高速 ID スキャナーがあります。通信にはいくつかの方法がありますが、産業用プロトコルではない唯一の方法は Telnet です。データベースが Telnet を介してスキャナーと通信できるようにするにはどうすればよいですか?
それとのコミュニケーション方法について他に提案があれば、それも聞いてみたいです。
Telnet を使用してスキャナと通信し、それに応じてデータベースから読み書きできるアプリケーションを作成する必要があります。
たとえば、(Visual Studio を使用して) C# で何かを記述し、Telnet アクセスに次のライブラリを使用できます。
http://www.codeproject.com/Articles/19071/Quick-tool-A-minimalistic-Telnet-library
コードを実行するために本当にデータベースを取得する必要がある場合は、C# で何かを記述し、 SQL Server 2008 内のCLR 統合を使用して取得できる可能性があります。ただし、アプリケーションをデータベースから分離しておくことをお勧めします (開発とテストを容易にするため)。
SQLCLR ストアド プロシージャで telnet クライアントを作成し、通常の TSQL ストアド プロシージャから CLR プロシージャを呼び出すことができます。SQLCLR はあまり一般的には使用されていませんが、多くの人が想定しているよりも堅牢であり、私は SQLCLR で大きな成功を収めているチームと話をしました。
覚えておくべきことの 1 つは、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
しかし、これをいじって 1 時間以上かけて機能させたら、サービスとして実行するか、間隔を置いて実行し、新しい telnet 処理のキュー テーブルをチェックして、 、作業を行い、結果を SQL Server に書き込みます。RDBMS をバッチ スクリプト ホストのように扱うべきではありません。