SQL Server
SQL Server
PC/SC Get Card UID
See more SCard Examples
Sends the APDU command to get a card's UID.Chilkat SQL Server Downloads
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls.
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
DECLARE @hr int
-- Important: Do not use nvarchar(max). See the warning about using nvarchar(max).
DECLARE @sTmp0 nvarchar(4000)
DECLARE @success int
SELECT @success = 0
-- This example requires the Chilkat API to have been previously unlocked.
-- See Global Unlock Sample for sample code.
DECLARE @scard int
EXEC @hr = sp_OACreate 'Chilkat.SCard', @scard OUT
IF @hr <> 0
BEGIN
PRINT 'Failed to create ActiveX component'
RETURN
END
-- First establish a context to the PC/SC Resource Manager
EXEC sp_OAMethod @scard, 'EstablishContext', @success OUT, 'user'
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @scard, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @scard
RETURN
END
-- Use your own smart card reader name here.
EXEC sp_OAMethod @scard, 'Connect', @success OUT, 'ACS ACR122 0', 'shared', 'no_preference'
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @scard, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @scard
RETURN
END
EXEC sp_OAGetProperty @scard, 'ConnectedReader', @sTmp0 OUT
PRINT 'Connected reader: ' + @sTmp0
EXEC sp_OAGetProperty @scard, 'ActiveProtocol', @sTmp0 OUT
PRINT 'Active protocol: ' + @sTmp0
EXEC sp_OAGetProperty @scard, 'CardAtr', @sTmp0 OUT
PRINT 'ATR: ' + @sTmp0
EXEC sp_OAGetProperty @scard, 'ReaderStatus', @sTmp0 OUT
PRINT 'Reader Status: ' + @sTmp0
-- Send the APDU command 0xFF, 0xCA, 0x00, 0x00, 0x00
DECLARE @bdRecv int
EXEC @hr = sp_OACreate 'Chilkat.BinData', @bdRecv OUT
EXEC sp_OAGetProperty @scard, 'ActiveProtocol', @sTmp0 OUT
EXEC sp_OAMethod @scard, 'TransmitHex', @success OUT, @sTmp0, 'FFCA000000', @bdRecv, 32
IF @success = 1
BEGIN
EXEC sp_OAMethod @bdRecv, 'GetEncoded', @sTmp0 OUT, 'hex'
PRINT 'Received: ' + @sTmp0
-- The UID is the returned data without the final 2 bytes.
DECLARE @numBytes int
EXEC sp_OAGetProperty @bdRecv, 'NumBytes', @numBytes OUT
IF @numBytes > 2
BEGIN
EXEC sp_OAMethod @bdRecv, 'GetEncodedChunk', @sTmp0 OUT, 0, @numBytes - 2, 'hex'
PRINT 'UID: ' + @sTmp0
END
END
ELSE
BEGIN
EXEC sp_OAGetProperty @scard, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
END
-- Disconnect from this reader.
EXEC sp_OAMethod @scard, 'Disconnect', @success OUT, 'leave'
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @scard, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
END
-- Applications should always release the context when finished.
EXEC sp_OAMethod @scard, 'ReleaseContext', @success OUT
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @scard, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
END
EXEC @hr = sp_OADestroy @scard
EXEC @hr = sp_OADestroy @bdRecv
END
GO