Sample code for 30+ languages & platforms
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

SQL Server
-- 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