2012-04-23 6 views
2

私はSQL Server 2008データベースと通信するために必要なDataman高速IDスキャナを持っています。通信するにはいくつかの方法がありますが、工業用プロトコルでないものはTelnetだけです。 Telnetでスキャナと通信するにはどうすればよいですか?SQL Server 2008では、Telnet接続を介してデータを作成および送信/受信する方法はありますか。

他のコミュニケーション方法についてご意見がありましたら、私も聞いてみたいと思います。

+0

スティーブに同意すると、私はデータベースとスキャナの間のインターフェイスとして機能するアプリケーションを構築します。なぜコードがストアドプロシージャの中になければならないのか分かりません。 –

+0

@AaronBertrand私はすでに使用している言語(Access VBAとSQL Server 2008)を新しいもの効率化のため、できるだけ多くのコードをサーバーに保存しようとしています。 – SaintWacko

+0

保守性を犠牲にして効率が上がらないように注意してください。 –

答えて

3

Telnetを使用してスキャナと通信するアプリケーションを作成し、それに従ってデータベースから読み書きする必要があります。

あなたは、例えば、C#(Visual Studioを使用)で何かを書いて、Telnetアクセス用に次のライブラリを使用することができます。

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

あなたは本当に、本当に実行するためのデータベースを取得する必要がある場合SQL Server 2008内でCLR integrationを使用して取得したC#で何かを書くことができるかもしれませんが、開発とテストの容易性のために、アプリケーションをデータベースと別に保つことをお勧めします。

+0

ストアドプロシージャとしてデータベース? – SaintWacko

+0

私は自分の答えを更新しました - これを行うための統合された方法はありません(私が知っている)。 –

+1

私はこれを試しています。どのように動作するかを見ていきます。 – SaintWacko

0

まあSQL Serverはこれをネイティブに行うことはできませんので、あなたはどんなイベントでもあなたの快適ゾーンの外に出なければならないでしょう。また、「サーバー上」とは、SQL Serverが実行されているのと同じ物理サーバーを意味しますか、「SQL Serverインスタンスの内部」を意味しますか?

ローカルPowerShellスクリプトは、ストアドプロシージャ内で、または非同期にする必要がある場合はSQL Serverエージェントジョブステップの一部として、確実に呼び出すことができます(Express Editionを実行していない場合は、エージェントはありません)。ここにあなたのニーズに適応するための究極の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 

しかし、一度にこれを稼働させるために1時間以上費やしたことがありました。サービスとして実行するか、間隔を置いて実行するアプリケーションを書くのが本当に良いと思います。新しいtelnet処理のキューテーブルをチェックします。その結果をSQL Serverに書き込みます。あなたのRDBMSはバッチスクリプトホストIMHOのように扱われるべきではありません。

+0

これは、Telnet接続の反対側からデータを受信し、ストアドプロシージャに戻すことができるでしょうか?以前はPowerShellを使ったことがありませんでしたが、実際の動作は分かりません。 – SaintWacko

+0

出力を#tmpテーブルに挿入することができます。これは典型的なクルーグの回避策です。私はポストに例を追加します。 –

1

SQLCLR stored procedureでtelnetクライアントを作成し、通常のTSQLストアドプロシージャからCLRプロシージャを呼び出すことができます。SQLCLRはあまり一般的には使用されていませんが、多くの人が想定するよりも堅牢で、成功したチームと話しました。

SQLCLRルートに行くと、この質問に対する他の回答のアドバイスをすることに決めた場合は、あなたが書いたのと同じ.NETコードを書くことになります。 SQLサーバーにデータをプッシュする外部ユーティリティを実装します。唯一の違いは、SQLCLRでは、ストアドプロシージャがTelnetの対話をアクティブにトリガできることです。

SQLCLRストアドプロシージャにはいくつかの特別な手法が必要ですが、Visual Studioデータベースプロジェクトでは簡単に作成できます。

関連する問題