2012-04-23 1 views
2

SQL Server 2008 데이터베이스와 통신하는 데 필요한 Dataman 고속 ID 스캐너가 있습니다. 통신 할 수있는 몇 가지 방법이 있지만 산업 프로토콜이 아닌 유일한 방법은 Telnet입니다. 텔넷을 통해 스캐너와 데이터베이스가 어떻게 통신 할 수 있습니까?SQL Server 2008에서 텔넷 연결을 통해 데이터를 만들고 보내거나받을 수 있습니까?

의사 소통 방법에 대한 다른 제안 사항이 있으면 그들도 듣고 싶습니다.

+0

나는 Steve와 동의한다. 나는 데이터베이스와 스캐너 사이의 인터페이스 역할을하는 응용 프로그램을 만들 것이다. 왜 코드가 스토어드 프로 시저 안에 있어야한다고 생각하는지 모르겠다. ... –

+0

@AaronBertrand 나는 (Access VBA와 SQL Server 2008을 사용하는) 언어를 이미 사용하고있는 언어를 고집하고 싶다. 새로운. 효율성을 위해 가능한 한 많은 코드를 서버에 보관하려고합니다. – SaintWacko

+0

효율성이 유지 보수 비용으로 발생하지 않도록 조심하십시오. –

답변

3

텔넷을 사용하여 스캐너와 통신하는 응용 프로그램을 작성한 다음 이에 따라 데이터베이스에서 읽고 쓸 수 있어야합니다.

당신은, 예를 들어, C#에서 뭔가 (Visual Studio를 사용)을 작성하고 텔넷 액세스를위한 다음과 같은 라이브러리를 사용할 수 있습니다 : 당신이 정말, 정말 얻을 수있는 경우

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

데이터베이스가 실행하기를 코드를 작성한 다음 C#에서 무언가를 작성한 다음 SQL Server 2008 내에서 CLR integration을 사용하여 픽업 할 수 있습니다. 그러나 개발 및 테스트의 용이성을 위해 응용 프로그램을 데이터베이스와 별도로 유지하는 것이 좋습니다.

+0

내에서 저장 프로 시저로 사용할 수있는 방법이 없습니까? 데이터 베이스? – SaintWacko

+0

나는 나의 대답을 업데이트했다 - 나는 이것을 인식 할 수있는 통합 된 방법이 없다는 것을 알고있다. –

+1

나는 이것을 시험하고있다. 어떻게 작동하는지 알 수 있습니다. – SaintWacko

0

음 SQL Server는 기본적으로이 작업을 수행 할 수 없으므로 어떤 경우에도 편안 영역 외부로 나가야합니다. 또한 "서버에서"라는 말은 SQL Server가 실행중인 실제 서버와 동일한 물리적 서버 또는 "SQL Server 인스턴스 내부"를 의미합니까?

저장 프로 시저 내에서 로컬 PowerShell 스크립트를 호출하거나 비동기 적으로 사용해야하는 경우 SQL Server 에이전트 작업 단계의 일부로 확실히 호출 할 수 있습니다 (Express Edition을 실행하지 않는 경우 ' 에이전트는 없습니다).

Automating Telnet with PowerShell

저장 프로 시저 내에서이 전화를하기 위해, 당신은 처음 xp_cmdshell이 있는지 확인해야합니다 : 여기에 귀하의 요구에 적응하기 위해 궁극적 PowerShell을 숙달을받지 않을 것 PowerShell 스크립트입니다 사용 가능 :주의로

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 

하지만 한 번을 이 기능을 사용하기 위해 한 시간 이상을 허비했는데, 서비스 나 일정 간격으로 실행되는 응용 프로그램을 작성하는 것이 더 낫다고 생각하고, 새로운 텔넷 처리를위한 대기열 테이블을 확인하고, 작업 한 다음 결과를 SQL Server에 씁니다. RDBMS를 일괄 스크립팅 호스트 IMHO처럼 취급해서는 안됩니다.

+0

텔넷 연결의 다른 쪽 끝에서 데이터를 수신하여 저장 프로 시저로 되돌릴 수 있습니까? 전에는 PowerShell을 사용 해본 적이 없으며 어떻게 작동하는지 잘 모르겠습니다. – SaintWacko

+0

일반적인 kludgy 임시 해결 방법 인 #tmp 테이블에 출력을 삽입 할 수 있습니다. 게시물에 예제를 추가하겠습니다. –

1

SQLCLR stored procedure에서 텔넷 클라이언트를 만든 다음 일반 TSQL 저장 프로 시저에서 CLR 프로 시저를 호출 할 수 있습니다.SQLCLR은 일반적으로 많이 사용되는 것은 아니지만 많은 사람들이 생각하는 것보다 견고하며, 성공한 팀과 이야기를 나눴습니다.

염두에 두어야 할 한 가지 사항은 SQLCLR 경로로 이동하면이 질문에 대한 다른 대답을 조언하기로 결정한 경우 작성한 동일한 .NET 코드를 작성하고 데이터를 SQL 서버에 푸시하는 외부 유틸리티를 구현하십시오. 유일한 차이점은 SQLCLR을 사용하면 저장 프로 시저가 텔넷 상호 작용을 적극적으로 트리거 할 수 있다는 것입니다.

SQLCLR 저장 프로 시저에는 몇 가지 특별한 기술이 필요하지만 Visual Studio 데이터베이스 프로젝트를 사용하면 매우 쉽게 만들 수 있습니다.

관련 문제