Los procedimientos almacenados extendidos con delphi


¿alguna vez has intentado crear un procedimiento almacenado en SQL Server?
¿Qué sucede si la funcionalidad que usted desea incorporar no está dentro del SQL, pero en tu proyecto de Delphi? Microsoft proporciona ODS (Servicios Abiertos de Datos), que es una API para ayudarle a crear la funcionalidad mediante la adición de DLL para SQL Server que contienen los Procedimientos Almacenados Extendidos.
Esta es la manera de hacerlo....
Como un bono especial, este artículo también es una solución simple para cifrar sus datos en SQL Server utilizando Procedimientos Almacenados Extendidos.
¿Qué necesitamos?
1) opends60.dll (de una instalación completa con herramientas de desarrollador de MSSQL o MSDE)
2) MsOdsApi.pas-AUTOR: Leonid 'MC' Belousov (www.bramc.ru/soft/) archivo de Encabezado para el uso opends60.dll) (incluido al final del artículo)
3) Un Local de SQL Server para pruebas (MSDE va a hacer muy bien).
NOTA: Para la criptografía he utilizado los componentes que se encuentran bajo la licencia MIT aquí:
http://www.cityinthesky.co.uk/cryptography.html
Medidas:
1) Crear un nuevo archivo DLL.

2) la creación de una unidad y en la cláusula uses agregar el MsOdsApi de la unidad.

3) En el archivo de la Biblioteca justo debajo de otros Usos de la cláusula de complemento de las Exportaciones y de los nombres de las funciones de exportación de:
biblioteca MyEncryptDll
usos
& nbsp & nbsp SysUtils,
& nbsp & nbsp Clases,
& nbsp & nbsp Unit1 en ' Unit1.pas'
las exportaciones
& nbsp & nbsp xp_DoEncrypt,
& nbsp & nbsp xp_DoDecrypt
begin
final.

4) En la Unidad de archivo de sólo en virtud de la cláusula uses añadir su función de referencia:
función xp_DoEncrypt(pSrvProc: SRV_PROC): Integer cdecl
función xp_DoDecrypt(pSrvProc: SRV_PROC): Integer cdecl
NOTAS: cdecl es necesario para las SAO a ser capaz de llamar a sus funciones.
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SRV_PROC es un identificador para el procedimiento almacenado de la información.

5) El código de la DoEncrypt es esta:
Basado en el código fuente por Leonid 'MC' Belousov (www.bramc.ru/soft/)
(DoDecrypt es exactamente el mismo que con un solo DecryptString(s) de la llamada.
función xp_Encrypt(pSrvProc: SRV_PROC): Integer cdecl
var
& nbsp & nbsp yo, sz: Integer
& nbsp & nbsp bType: Byte
& nbsp & nbsp fNull: Bool
& nbsp & nbsp cbMaxLen, cbActualLen: ULONG
& nbsp & nbsp myData,myanswer,myKey:array [0..255] of char
& nbsp & nbsp FDCP_3des: TDCP_3des
& nbsp & nbsp s:string
& nbsp & nbsp ps:pchar
begin
& nbsp & nbsp for i:=0 to 255
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp myData[i]:=#0
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp myanswer[i]:=#0
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp myKey[i]:=#0
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp si srv_rpcparams(pSrvProc) = 2 entonces // Comprobar si los parámetros de entrada están presentes...
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp srv_paraminfo(pSrvProc, 1, @bType, // que Vamos a utilizar el 1er parámetro de entrada!
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp @cbMaxLen, @cbActualLen, // NOTA: asumimos aquí lo que sólo 2 de los parámetros
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp @myData[0], @fNull) //de tipo String puede pasar!!!
& nbsp & nbsp & nbsp & nbsp bType:=SRVVARCHAR
& nbsp & nbsp & nbsp & nbsp srv_paraminfo(pSrvProc, 2, @bType,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp @cbMaxLen, @cbActualLen,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp @myKey[0], @fNull)
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp else
& nbsp & nbsp & nbsp & nbsp MyData := ' // No hay parámetros de entrada? Utilice el valor predeterminado en su lugar.
& nbsp & nbsp //CÓDIGO de CIFRADO por DEBAJO USTED PUEDE HACER LO QUE se NECESITA AQUÍ CON LOS VALORES de PARÁMETRO
& nbsp & nbsp FDCP_3des:=TDCP_3des.Create(nil)
& nbsp & nbsp FDCP_3des.BlockSize=64
& nbsp & nbsp FDCP_3des.Algoritmo:='3DES'
& nbsp & nbsp FDCP_3des.CipherMode:=cmCBC
& nbsp & nbsp FDCP_3des.Id:=24
& nbsp & nbsp FDCP_3des.MaxKeySize:=192
& nbsp & nbsp FDCP_3des.InitStr(myKey,TDCP_sha1)
& nbsp & nbsp s:=cadena de caracteres(mydata)
& nbsp & nbsp strpcopy(myAnswer,FDCP_3des.EncryptString(s))
& nbsp & nbsp FDCP_3des.Quemar
& nbsp & nbsp // CONFIGURACIÓN de la RESPUESTA DE los VALORES PCHAR Y LLEGAR TAMAÑO
& nbsp & nbsp s:=cadena de caracteres(myAnswer)
& nbsp & nbsp sz:=length(s)
& nbsp & nbsp ps:=allocmem(sz)
& nbsp & nbsp ps:=pchar(s)
& nbsp & nbsp // Describir las columnas
& nbsp & nbsp // (en Realidad, usted está haciendo que para cada tipo de datos y cada columna que desea devolver).
& nbsp & nbsp srv_describe(pSrvProc,1 , 'Valor', SRV_NULLTERM,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SRVVARCHAR, sz,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SRVVARCHAR, sz, nil)
& nbsp & nbsp & nbsp & nbsp // Comenzar de salida...
& nbsp & nbsp srv_setcoldata(pSrvProc, 1, @p[0])
& nbsp & nbsp srv_sendrow(pSrvProc) // Enviar la fila.
// Vamos a volver parámetro de salida (por ejemplo).
& nbsp & nbsp srv_senddone(pSrvProc, // por último, enviar los datos para SQL Server:
& nbsp & nbsp & nbsp & nbsp (SRV_DONE_COUNT o SRV_DONE_MORE), 0, 1) // enviar los resultados de un mensaje de finalización.
& nbsp & nbsp // LIBERAR el CIFRADO de COMPONENTES
& nbsp & nbsp FreeAndNil(FDCP_3des)
& nbsp & nbsp resultado := 1 // Informe de éxito (1 = ÉXITO, 0 = NO)
fin
NOTA: Hay un número de cosas que usted puede hacer con ODS. Este es sólo un ejemplo de Delphi. Usted puede leer la ODS ayudar en MSDN y hacer aún más.

6) las Pruebas y la Depuración: (Fuente Leonid 'MC' Belousov (www.bramc.ru/soft/))
A) la Instalación de SQL 7.0/2000 en su estación de trabajo (o instalar Delphi en la estación de trabajo donde está instalado SQL Server).
B) Registrar tu Xp en SQL Server.
& nbsp & nbsp & nbsp NOTAS:
& nbsp & nbsp & nbsp Registro de Xp como esta:
& nbsp & nbsp & nbsp & nbsp & nbsp maestro
& nbsp & nbsp & nbsp & nbsp & nbsp ir
& nbsp & nbsp & nbsp & nbsp & nbsp sp_addextendedproc 'xp_DoEncrypt', 'MyEncryptDll.dll'
& nbsp & nbsp & nbsp & nbsp & nbsp ir
& nbsp & nbsp & nbsp & nbsp & nbsp sp_addextendedproc 'xp_DoDecrypt', 'MyEncryptDll.dll'
& nbsp & nbsp & nbsp & nbsp & nbsp ir
& nbsp & nbsp & nbsp Anular el registro de Xp como este:
& nbsp & nbsp & nbsp & nbsp & nbsp maestro
& nbsp & nbsp & nbsp & nbsp & nbsp ir
& nbsp & nbsp & nbsp & nbsp & nbsp sp_dropextendedproc 'xp_DoEncrypt'
& nbsp & nbsp & nbsp & nbsp & nbsp ir
& nbsp & nbsp & nbsp & nbsp & nbsp sp_dropextendedproc 'xp_DoDecrypt'
& nbsp & nbsp & nbsp & nbsp & nbsp ir
& nbsp & nbsp & nbsp Desbloquear DLL en el caso de que siendo utilizado por SQL como la siguiente:
& nbsp & nbsp & nbsp & nbsp & nbsp maestro
& nbsp & nbsp & nbsp & nbsp & nbsp ir
& nbsp & nbsp & nbsp & nbsp & nbsp DBCC MyEncryptDll(GRATIS)
& nbsp & nbsp & nbsp & nbsp & nbsp ir
C) En Delphi, seleccione desde el menú principal Ejecutar -> Parámetros de Ejecución.
En la Aplicación Host, especifique una ruta de acceso a su Servidor SQL server ejecutable (sqlservr.exe). Para SQL 7.0, esto es suficiente. Para SQL 2000, en el campo de Parámetros especificar un parámetro de línea de comando '-sYOUR_SQL_NAME', donde YOUR_SQL_NAME es el nombre asignado a su Servidor SQL server durante la instalación.
Establecer puntos de interrupción en el código de Delphi y ejecutar el proyecto. SQL Server se inicia como una aplicación de consola.
D) puede ejecutar el Xp desde el Analizador de Consultas y el código de seguimiento en Delphi.
& nbsp & nbsp & nbsp NOTA:
& nbsp & nbsp & nbsp Ejecutar un procedimiento almacenado extendido se hace así:
& nbsp & nbsp & nbsp exec master..xp_DoEncrypt 'ValueToEncrypt','KeyValue'
& nbsp & nbsp & nbsp ir
E) Para salir de la aplicación, presione Ctrl Pausa en el SQL Server de la consola de la ventana.
& & & & & & & & & & & & & & & & & & & & & & & & & & & -
Final del artículo. Abajo sigue una unidad requerida para el ODS.
& & & & & & & & & & & & & & & & & & & & & & & & & & & -
MsOdsApi.pas (Copiar de la línea de abajo)
{
& nbsp & nbsp - Maestro del Clúster de la Biblioteca -
& nbsp & nbsp Copyright © 1996-2002 Leonid Belousov (también conocido como Maestro del Clúster)
& nbsp & nbsp mailto: [email protected]
& nbsp & nbsp www.bramc.ru/soft/
& nbsp & nbsp - Descripción: traducción de C-encabezados de Microsoft Open de Datos de la API de Servicios
}
unidad de MsOdsApi
// & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
// Servicios Abiertos de Datos de encabezado de archivo: srv.h
// Copyright (c) 1989, 1990, 1991, 1997 por Microsoft corporation
//
// para Evitar la doble inclusión
//#ifndef _ODS_SRV_H_
// _ODS_SRV_H_
//#incluir 'de windows.h'
// ODS usa pack(4) en todos los tipos de CPU
//#pragma pack(4)
//#ifdef __cplusplus
//extern 'C' {
//#endif
// definir el modelo
//#si!!!define( FAR )
// mucho, MUCHO
//#endif
// & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
// Formatos de tipos de datos
//#si!!!define(DBTYPEDEFS) // no entren en conflicto con DBLIB definiciones
//#si!!!define(MAXNUMERICLEN) // No entren en conflicto con ODBC definiciones
// DBTYPEDEFS
interfaz
usos
& nbsp & nbsp Windows
tipo
& nbsp & nbsp DBBOOL = Byte
& nbsp & nbsp DBBYTE = Byte
& nbsp & nbsp DBTINYINT = Byte
& nbsp & nbsp DBSMALLINT = Smallint
& nbsp & nbsp DBUSMALLINT = Word
& nbsp & nbsp DBINT = Longint
& nbsp & nbsp DBCHAR = Char
& nbsp & nbsp PDBCHAR = ^DBCHAR
& nbsp & nbsp DBBINARY = Byte
& nbsp & nbsp DBBIT = Byte
& nbsp & nbsp DBFLT8 = Doble
& nbsp & nbsp srv_datetime = record
& nbsp & nbsp & nbsp & nbsp // Formato para SRVDATETIME
& nbsp & nbsp & nbsp & nbsp dtdays: Longint // número de días desde 1/1/1900
& nbsp & nbsp & nbsp & nbsp dttime: Longword // número 300 segunda desde mediados
& nbsp & nbsp final
& nbsp & nbsp DBDATETIME = srv_datetime
& nbsp & nbsp srv_dbdatetime4 = record
& nbsp & nbsp & nbsp & nbsp // Formato para SRVDATETIM4
& nbsp & nbsp & nbsp & nbsp númdías: Palabra // número de días desde 1/1/1900
& nbsp & nbsp & nbsp & nbsp nummins: Palabra // número de minutos sicne de la medianoche
& nbsp & nbsp final
& nbsp & nbsp DBDATETIM4 = srv_dbdatetime4
& nbsp & nbsp srv_money = record
& nbsp & nbsp & nbsp & nbsp // Formato para SRVMONEY
& nbsp & nbsp & nbsp & nbsp mnyhigh: Longint
& nbsp & nbsp & nbsp & nbsp mnylow : Longword
& nbsp & nbsp final
& nbsp & nbsp DBMONEY = srv_money
& nbsp & nbsp DBFLT4 = Doble
& nbsp & nbsp DBMONEY4 = Longint
const
& nbsp & nbsp MAXNUMERICDIG = 38
& nbsp & nbsp DEFAULTPRECISION = 19 // 18
& nbsp & nbsp DEFAULTSCALE = 0
& nbsp & nbsp MAXNUMERICLEN = 16
tipo
& nbsp & nbsp srv_dbnumeric = lleno de registro
& nbsp & nbsp & nbsp & nbsp // Formato para SRVNUMERIC,SRVNUMERICN,SRVDECIMAL SRVDECIMALN
& nbsp & nbsp & nbsp & nbsp precisión: Byte
& nbsp & nbsp & nbsp & nbsp escala : Byte
& nbsp & nbsp & nbsp & nbsp signo : Byte // 1 = Positivo, 0 = Negativo
& nbsp & nbsp & nbsp & nbsp val : array [0..MAXNUMERICLEN-1] of Byte // Collar de little-endian, de valor
& nbsp & nbsp final
& nbsp & nbsp estructura dbnumeric = srv_dbnumeric
& nbsp & nbsp DBDECIMAL = estructura dbnumeric
//#endif // #si!!!define(MAXNUMERICLEN)
//#endif // #si!!!define( DBTYPEDEFS )
// & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
// Constantes utilizadas por la Api
// Tokens de Tipo
const
& nbsp & nbsp SRV_TDS_NULL = $1f
& nbsp & nbsp SRV_TDS_TEXT = $23
& nbsp & nbsp SRV_TDS_GUID = $24
& nbsp & nbsp SRV_TDS_VARBINARY = $25
& nbsp & nbsp SRV_TDS_INTN = $26
& nbsp & nbsp SRV_TDS_VARCHAR = $27
& nbsp & nbsp SRV_TDS_BINARY = $2d
& nbsp & nbsp SRV_TDS_IMAGE = $22
& nbsp & nbsp SRV_TDS_CHAR = $2f
& nbsp & nbsp SRV_TDS_INT1 = $30
& nbsp & nbsp SRV_TDS_BIT = $32
& nbsp & nbsp SRV_TDS_INT2 = $34
& nbsp & nbsp SRV_TDS_DECIMAL = $37
& nbsp & nbsp SRV_TDS_INT4 = $38
& nbsp & nbsp SRV_TDS_DATETIM4 = $3a
& nbsp & nbsp SRV_TDS_FLT4 = $3b
& nbsp & nbsp SRV_TDS_MONEY = $3c
& nbsp & nbsp SRV_TDS_DATETIME = $3d
& nbsp & nbsp SRV_TDS_FLT8 = $3e
& nbsp & nbsp SRV_TDS_NUMERIC = $3f
& nbsp & nbsp SRV_TDS_NTEXT = $63
& nbsp & nbsp SRV_TDS_BITN = $68
& nbsp & nbsp SRV_TDS_DECIMALN = $6a
& nbsp & nbsp SRV_TDS_NUMERICN = $6c
& nbsp & nbsp SRV_TDS_FLTN = $6d
& nbsp & nbsp SRV_TDS_MONEYN = $6e
& nbsp & nbsp SRV_TDS_DATETIMN = $6f
& nbsp & nbsp SRV_TDS_MONEY4 = $7a
& nbsp & nbsp SRV_TDS_INT8 = $7f // SQL 2000 y más tarde
& nbsp & nbsp SRV_TDS_BIGVARBINARY = $A5
& nbsp & nbsp SRV_TDS_BIGVARCHAR = $A7
& nbsp & nbsp SRV_TDS_BIGBINARY = $AD
& nbsp & nbsp SRV_TDS_BIGCHAR = $AF
& nbsp & nbsp SRV_TDS_NVARCHAR = $e7
& nbsp & nbsp SRV_TDS_NCHAR = $ef
// tipos de datos
// También: los valores de parámetro de símbolo para srv_symbol cuando type = SRV_DATATYPE
& nbsp & nbsp SRVNULL = SRV_TDS_NULL
& nbsp & nbsp SRVTEXT = SRV_TDS_TEXT
& nbsp & nbsp SRVGUID = SRV_TDS_GUID
& nbsp & nbsp SRVVARBINARY = SRV_TDS_VARBINARY
& nbsp & nbsp SRVINTN = SRV_TDS_INTN
& nbsp & nbsp SRVVARCHAR = SRV_TDS_VARCHAR
& nbsp & nbsp SRVBINARY = SRV_TDS_BINARY
& nbsp & nbsp SRVIMAGE = SRV_TDS_IMAGE
& nbsp & nbsp SRVCHAR = SRV_TDS_CHAR
& nbsp & nbsp SRVINT1 = SRV_TDS_INT1
& nbsp & nbsp SRVBIT = SRV_TDS_BIT
& nbsp & nbsp SRVINT2 = SRV_TDS_INT2
& nbsp & nbsp SRVDECIMAL = SRV_TDS_DECIMAL
& nbsp & nbsp SRVINT4 = SRV_TDS_INT4
& nbsp & nbsp SRVDATETIM4 = SRV_TDS_DATETIM4
& nbsp & nbsp SRVFLT4 = SRV_TDS_FLT4
& nbsp & nbsp SRVMONEY = SRV_TDS_MONEY
& nbsp & nbsp SRVDATETIME = SRV_TDS_DATETIME
& nbsp & nbsp SRVFLT8 = SRV_TDS_FLT8
& nbsp & nbsp SRVNUMERIC = SRV_TDS_NUMERIC
& nbsp & nbsp SRVNTEXT = SRV_TDS_NTEXT
& nbsp & nbsp SRVBITN = SRV_TDS_BITN
& nbsp & nbsp SRVDECIMALN = SRV_TDS_DECIMALN
& nbsp & nbsp SRVNUMERICN = SRV_TDS_NUMERICN
& nbsp & nbsp SRVFLTN = SRV_TDS_FLTN
& nbsp & nbsp SRVMONEYN = SRV_TDS_MONEYN
& nbsp & nbsp SRVDATETIMN = SRV_TDS_DATETIMN
& nbsp & nbsp SRVMONEY4 = SRV_TDS_MONEY4
& nbsp & nbsp SRVINT8 = SRV_TDS_INT8 // SQL 2000 y más tarde
& nbsp & nbsp SRVBIGVARBINARY = SRV_TDS_BIGVARBINARY
& nbsp & nbsp SRVBIGVARCHAR = SRV_TDS_BIGVARCHAR
& nbsp & nbsp SRVBIGBINARY = SRV_TDS_BIGBINARY
& nbsp & nbsp SRVBIGCHAR = SRV_TDS_BIGCHAR
& nbsp & nbsp SRVNVARCHAR = SRV_TDS_NVARCHAR
& nbsp & nbsp SRVNCHAR = SRV_TDS_NCHAR
// los valores de srv_symbol parámetro de tipo
& nbsp SRV_ERROR = 0
& nbsp SRV_DONE = 1
& nbsp SRV_DATATYPE = 2
& nbsp SRV_EVENT = 4
// los valores de srv_symbol símbolo de parámetro, cuando el tipo = SRV_ERROR
& nbsp & nbsp SRV_ENO_OS_ERR = 0
& nbsp & nbsp SRV_INFO = 1
& nbsp & nbsp SRV_FATAL_PROCESS = 10
& nbsp & nbsp SRV_FATAL_SERVER = 19
// Tipos de eventos de servidor
// También: los valores de srv_symbol símbolo de parámetro, cuando el tipo = SRV_EVENT
& nbsp & nbsp SRV_CONTINUE = 0
& nbsp & nbsp SRV_LANGUAGE = 1
& nbsp & nbsp SRV_CONNECT = 2
& nbsp & nbsp SRV_RPC = 3
& nbsp & nbsp SRV_RESTART = 4
& nbsp & nbsp SRV_DISCONNECT = 5
& nbsp & nbsp SRV_ATTENTION = 6
& nbsp & nbsp SRV_SLEEP = 7
& nbsp & nbsp SRV_START = 8
& nbsp & nbsp SRV_STOP = 9
& nbsp & nbsp SRV_EXIT = 10
& nbsp & nbsp SRV_CANCEL = 11
& nbsp & nbsp SRV_SETUP = 12
& nbsp & nbsp SRV_CLOSE = 13
& nbsp & nbsp SRV_PRACK = 14
& nbsp & nbsp SRV_PRERROR = 15
& nbsp & nbsp SRV_ATTENTION_ACK = 16
& nbsp & nbsp SRV_CONNECT_V7 = 16 // TDS tipo de TDS 7 los clientes. Sobrecargado con SRV_ATTENTION_ACK
& nbsp & nbsp SRV_SKIP = 17
& nbsp & nbsp SRV_TRANSMGR = 18
& nbsp & nbsp SRV_OLEDB = 20
& nbsp & nbsp SRV_INTERNAL_HANDLER = 99
& nbsp & nbsp SRV_PROGRAMMER_DEFINED = 100
// los valores de srv_config parámetro de opción
& nbsp & nbsp SRV_CONNECTIONS = 1
& nbsp & nbsp SRV_LOGFILE = 2
& nbsp & nbsp SRV_STACKSIZE = 3
& nbsp & nbsp SRV_REMOTE_ACCESS = 7
& nbsp & nbsp SRV_REMOTE_CONNECTIONS = 9
& nbsp & nbsp SRV_MAX_PACKETS = 10
& nbsp & nbsp SRV_MAXWORKINGTHREADS = 11
& nbsp & nbsp SRV_MINWORKINGTHREADS = 12
& nbsp & nbsp SRV_THREADTIMEOUT = 13
& nbsp & nbsp SRV_MAX_PACKETSIZE = 17
& nbsp & nbsp SRV_THREADPRIORITY = 18
& nbsp & nbsp SRV_ANSI_CODEPAGE = 19
& nbsp & nbsp SRV_DEFAULT_PACKETSIZE = 26
& nbsp & nbsp SRV_PASSTHROUGH = 27
// vlaues para srv_config valor de parámetro cuando la opción = SRV_THREADPRIORITY
& nbsp & nbsp SRV_PRIORITY_LOW = THREAD_PRIORITY_LOWEST
& nbsp & nbsp SRV_PRIORITY_NORMAL = THREAD_PRIORITY_NORMAL
& nbsp & nbsp SRV_PRIORITY_HIGH = THREAD_PRIORITY_HIGHEST
& nbsp & nbsp SRV_PRIORITY_CRITICAL = THREAD_PRIORITY_TIME_CRITICAL
// los valores de srv_sfield parámetro de campo
& nbsp & nbsp SRV_SERVERNAME = 0
& nbsp & nbsp SRV_VERSION = 6
// Longitud para indicar cadena terminada en null
& nbsp & nbsp SRV_NULLTERM = -1
// los valores de msgtype parámetro a srv_sendmsg

& nbsp & nbsp SRV_MSG_INFO = 1
& nbsp & nbsp SRV_MSG_ERROR = 2
// los valores de parámetro de estado para srv_senddone
// También: los valores para el símbolo de parámetros para srv_symbol cuando type = SRV_DONE
& nbsp & nbsp SRV_DONE_FINAL = $0000
& nbsp & nbsp SRV_DONE_MORE = $0001
& nbsp & nbsp SRV_DONE_ERROR = $0002
& nbsp & nbsp SRV_DONE_COUNT = $0010
& nbsp & nbsp SRV_DONE_RPC_IN_BATCH = $0080
// valores devueltos de srv_paramstatus
& nbsp & nbsp SRV_PARAMRETURN = $0001
& nbsp & nbsp SRV_PARAMDEFAULT = $0002
// valores devueltos de srv_rpcoptions
& nbsp & nbsp SRV_RECOMPILE = $0001
& nbsp & nbsp SRV_NOMETADATA = $0002
// los valores de parámetro de campo a srv_pfield
// SRV_LANGUAGE 1 ya definido anteriormente
// SRV_EVENT 4 ya definido anteriormente
& nbsp & nbsp SRV_SPID = 10
& nbsp & nbsp SRV_NETSPID = 11
& nbsp & nbsp SRV_TYPE = 12
& nbsp & nbsp SRV_STATUS = 13
& nbsp & nbsp SRV_RMTSERVER = 14
& nbsp & nbsp SRV_HOST = 15
& nbsp & nbsp SRV_USER = 16
& nbsp & nbsp SRV_PWD = 17
& nbsp & nbsp SRV_CPID = 18
& nbsp & nbsp SRV_APPLNAME = 19
& nbsp & nbsp SRV_TDS = 20
& nbsp & nbsp SRV_CLIB = 21
& nbsp & nbsp SRV_LIBVERS = 22
& nbsp & nbsp SRV_ROWSENT = 23
& nbsp & nbsp SRV_BCPFLAG = 24
& nbsp & nbsp SRV_NATLANG = 25
& nbsp & nbsp SRV_PIPEHANDLE = 26
& nbsp & nbsp SRV_NETWORK_MODULE = 27
& nbsp & nbsp SRV_NETWORK_VERSION = 28
& nbsp & nbsp SRV_NETWORK_CONNECTION = 29
& nbsp & nbsp SRV_LSECURE = 30
& nbsp & nbsp SRV_SAXP = 31
& nbsp & nbsp SRV_UNICODE_USER = 33
& nbsp & nbsp SRV_UNICODE_PWD = 35
& nbsp & nbsp SRV_SPROC_CODEPAGE = 36
// el valor de retorno de SRV_TDSVERSION macro
& nbsp & nbsp SRV_TDS_NONE = 0
& nbsp & nbsp SRV_TDS_2_0 = 1
& nbsp & nbsp SRV_TDS_3_4 = 2
& nbsp & nbsp SRV_TDS_4_2 = 3
& nbsp & nbsp SRV_TDS_6_0 = 4
& nbsp & nbsp SRV_TDS_7_0 = 5
// Devolver valores de Api
tipo
& nbsp SRVRETCODE = Integer // ÉXITO o no
& nbsp RETCODE = Integer
const
& nbsp & nbsp ÉXITO = 1 // el regreso Exitoso de valor
& nbsp & nbsp FALLAR = 0 // Incorrecta el valor de retorno
& nbsp & nbsp SRV_DUPLICATE_HANDLER= 2 // adicional del valor de retorno de srv_pre/post_handle
// & & & & & & & & & & & & & & & & & & & & & & & &
//PreDeclare estructuras
//
{struct srv_server
typedef struct srv_server SRV_SERVER
struct srv_config
typedef struct srv_config SRV_CONFIG
struct srv_proc
typedef struct srv_proc SRV_PROC }
tipo
& nbsp & nbsp SRV_SERVER = Puntero
& nbsp & nbsp SRV_CONFIG = Puntero
& nbsp & nbsp SRV_PROC = Puntero
// & & & & & & & & & & & & & & & & & & & & & & & &
// & & & & & & & & & & & & & & & & & & & & & & & &
// ODS MACROs & Api
// que Describe y el envío de un conjunto de resultados
función srv_describe(srvproc: SRV_PROC
& nbsp & nbsp colnumber: Integer column_name: PCHAR namelen: Integer
& nbsp & nbsp desttype, destlen, srctype, srclen: Integer srcData: Puntero
): Integer cdecl
función srv_setutype(srvproc: SRV_PROC columna: Integer usertype: Longint): Integer cdecl
función srv_setcoldata(srvproc: SRV_PROC columna: Integer datos: Puntero): Integer cdecl
función srv_setcollen(srvproc: SRV_PROC columna, len: Integer): Integer cdecl
función srv_sendrow(srvproc: SRV_PROC): Integer cdecl
función srv_senddone(srvproc: SRV_PROC estado, curcmd: Word count: Longint): Integer cdecl
// Tratar con la ampliación de los parámetros de los procedimientos
función srv_rpcparams(srvproc: SRV_PROC): Integer cdecl
función srv_paraminfo(srvproc: SRV_PROC n: Integer pbType: PByte
& nbsp & nbsp pcbMaxLen, pcbActualLen: PULONG pbData: PByte pfNull: PBOOL): Integer cdecl
función srv_paramsetoutput(srvproc: SRV_PROC
& nbsp & nbsp n: Integer pbData: PByte cbLen: ULONG fNull: BOOL): Integer cdecl
función srv_paramdata(srvproc: SRV_PROC n: Entero): Puntero cdecl
función srv_paramlen(srvproc: SRV_PROC n: Integer): Integer cdecl
función srv_parammaxlen(srvproc: SRV_PROC n: Integer): Integer cdecl
función srv_paramtype(srvproc: SRV_PROC n: Entero): Entero cdecl
función srv_paramset(srvproc: SRV_PROC n: Integer datos: Puntero int: Integer): Integer cdecl
función srv_paramname(srvproc: SRV_PROC n: Entero var len: Integer): PChar cdecl
función srv_paramnumber(srvproc: SRV_PROC nombre: PChar namelen: Integer): Integer cdecl
// & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
// & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
// El resto de estas Api se admiten, en SQL Server 7.0,
// pero no puede ser admitido después de SQL Server 7.0
// MACROs
{ SRV_GETCONFIG(a)srv_getconfig ( a )
& nbsp & nbsp SRV_GETSERVER(a)srv_getserver ( a )
& nbsp & nbsp SRV_GOT_ATTENTION(a)srv_got_attention ( a )
SRV_EVENTDATA(a)srv_eventdata ( a )
SRV_IODEAD(a)srv_iodead ( a )
SRV_TDSVERSION(a)srv_tdsversion ( a )}
función srv_getconfig(servidor: SRV_SERVER): SRV_CONFIG cdecl
función srv_getserver(srvproc: SRV_PROC): SRV_SERVER cdecl
función srv_got_attention(srvproc: SRV_PROC): Bool cdecl
función srv_eventdata(srvproc: SRV_PROC): Puntero cdecl
// de Memoria
función srv_alloc(ulSize: Longint): Puntero cdecl
función srv_bmove(de: Puntero toma de fuerza: recuento de Puntero: Longint): Integer cdecl
función srv_bzero(ubicación: recuento de Puntero: Longint): Integer cdecl
función srv_free(ptr: Puntero): Entero cdecl
función srv_config_fn(config: SRV_CONFIG opción: Longint valor: PChar valuelen: Integer): Integer cdecl
función srv_config_alloc: SRV_CONFIG cdecl
función srv_convert(srvproc: SRV_PROC srctype: Integer src: Puntero srclen: DBINT
& nbsp & nbsp desttype: Integer dest: Puntero destlen: DBINT): Integer cdecl
{
int (* srv_errhandle(int (* controlador)(SRV_SERVER * servidor de,
SRV_PROC * srvproc,
int srverror,
BYTE de gravedad,
BYTE de estado,
int oserrnum,
char * errtext,
int errtextlen,
char * oserrtext,
int oserrtextlen)))
& nbsp & nbsp & nbsp ( SRV_SERVER * server,
SRV_PROC * srvproc,
int srverror,
BYTE de gravedad,
BYTE de estado,
int oserrnum,
char * errtext,
int errtextlen,
char * oserrtext,
int oserrtextlen )
}
función srv_event_fn(srvproc: SRV_PROC evento: Integer datos: PByte): Integer cdecl
función srv_getuserdata(srvproc: SRV_PROC): Puntero cdecl
función srv_getbindtoken(srvproc: SRV_PROC token_buf: PChar): Integer cdecl
función srv_getdtcxact(srvproc: SRV_PROC ppv: Puntero): Integer cdecl
//typedef int (* EventHandler)(void*)
tipo
& nbsp & nbsp EventHandler = Puntero
función srv_handle(servidor: SRV_SERVER int: Longint controlador: EventHandler): Evento andler cdecl
función srv_impersonate_client(srvproc: SRV_PROC): Integer cdecl
función srv_init(config: SRV_CONFIG connectname: PChar namelen: Integer): SRV_SERVER cdecl
función srv_iodead(srvproc: SRV_PROC): Bool cdecl
función srv_langcpy(srvproc: SRV_PROC inicio, nbytes: Longint de búfer: PChar): Longint cdecl
función srv_langlen(srvproc: SRV_PROC): Longint cdecl
función srv_langptr(srvproc: SRV_PROC): Puntero cdecl
función srv_log(servidor: SRV_SERVER datestamp: Bool error: PChar msglen: Integer): Integer cdecl
función srv_paramstatus(srvproc: SRV_PROC n: Integer): Integer cdecl
función srv_pfield(srvproc: SRV_PROC campo: Integer len: PInteger): PChar cdecl
función srv_returnval(srvproc: SRV_PROC value_name: PDBCHAR len: Integer estado: Byte
& nbsp & nbsp iType, maxlen, datalen: DBINT valor: PByte): Integer cdecl
función srv_revert_to_self(srvproc: SRV_PROC): Integer cdecl
función srv_rpcdb(srvproc: SRV_PROC len: PInteger): PChar cdecl
función srv_rpcname(srvproc: SRV_PROC len: PInteger): PChar cdecl
función srv_rpcnumber(srvproc: SRV_PROC): Integer cdecl
función srv_rpcoptions(srvproc: SRV_PROC): Palabra cdecl
función srv_rpcowner(srvproc: SRV_PROC len: PInteger): PChar cdecl
función srv_run(servidor: SRV_SERVER): Integer cdecl
función srv_sendmsg(srvproc: SRV_PROC
& nbsp & nbsp msgtype: Integer msgnum: DBINT msgClass, estado: DBTINYINT
& nbsp & nbsp rpcname: PChar rpcnamelen: Integer
& nbsp & nbsp linenum: Palabra de error: PChar msglen: Integer): Integer cdecl
función srv_ansi_sendmsg(srvproc: SRV_PROC
& nbsp & nbsp msgtype: Entero msgnum: DBINT msgClass, estado: DBTINYINT
& nbsp & nbsp rpcname: PChar rpcnamelen: Integer
& nbsp & nbsp linenum: Palabra de error: PChar msglen: Integer): Integer cdecl
función srv_sendstatus(srvproc: SRV_PROC estado: Longint): Integer cdecl
función srv_setuserdata(srvproc: SRV_PROC ptr: Puntero): Integer cdecl
función srv_sfield(servidor: SRV_SERVER campo: Integer len: PInteger): PChar cdecl
función srv_symbol(iType, símbolo: Integer len: PInteger): PChar cdecl
función srv_tdsversion(srvproc: SRV_PROC): Integer cdecl
función srv_writebuf(srvproc: SRV_PROC ptr: Puntero a contar: Word): Integer cdecl
función srv_willconvert(srctype, desttype: Integer): Bool cdecl
procedimiento srv_ackattention(srvproc: SRV_PROC) cdecl
función srv_terminatethread(srvproc: SRV_PROC): Entero cdecl
función srv_sendstatistics(srvproc: SRV_PROC): Integer cdecl
función srv_clearstatistics(srvproc: SRV_PROC): Integer cdecl
función srv_setevent(servidor: SRV_SERVER evento: Integer): Integer cdecl
función srv_message_handler(srvproc: SRV_PROC
& nbsp & nbsp errornum: Integer gravedad, estado: Byte oserrnum: Integer errtext: PChar
& nbsp & nbsp errtextlen: Integer oserrtext: PChar oserrtextlen: Integer): Entero cdecl
función srv_pre_handle(servidor: SRV_SERVER srvproc: SRV_PROC
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp evento: Longint controlador: EventHandler quitar: Bool): Integer cdecl
función srv_post_handle(servidor: SRV_SERVER srvproc: SRV_PROC
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp evento: Longint controlador: EventHandler quitar: Bool): Integer cdecl
función srv_post_completion_queue(srvproc: SRV_PROC inbuf: PChar inbuflen: PChar): Integer cdecl
función srv_IgnoreAnsiToOem(srvproc: SRV_PROC bTF: BOOL): Entero cdecl
//#ifdef __cplusplus
//}
//#endif
//#pragma pack()
const
& nbsp & nbsp SS_MAJOR_VERSION = 7
& nbsp & nbsp SS_MINOR_VERSION = 00
& nbsp & nbsp SS_LEVEL_VERSION = 0000
& nbsp & nbsp SS_MINIMUM_VERSION = '7.00.00.0000'
& nbsp & nbsp ODS_VERSION = ((SS_MAJOR_VERSION shl 24) o (SS_MINOR_VERSION shl 16))
//#endif //_ODS_SRV_H_
//////////////////////////////////////////////////////////////////
// Sugerido de implementación de __GetXpVersion
//
//__declspec(dllexport) ULONG __GetXpVersion()
//{
//volver ODS_VERSION
//}
//////////////////////////////////////////////////////////////////
aplicación
const
& nbsp & nbsp sLibName = 'Opends60.DLL'

función srv_describe externo sLibName nombre de 'srv_describe'
función srv_setutype externo sLibName nombre de 'srv_setutype'
función srv_setcoldata externo sLibName nombre de 'srv_setcoldata'
función srv_setcollen externo sLibName nombre de 'srv_setcollen'
función srv_sendrow externo sLibName nombre de 'srv_sendrow'
función srv_senddone externo sLibName nombre de 'srv_senddone'
// Tratar con la ampliación de los parámetros de los procedimientos
función srv_rpcparams externo sLibName nombre de 'srv_rpcparams'
función srv_paraminfo externo sLibName nombre de 'srv_paraminfo'
función srv_paramsetoutput externo sLibName nombre de 'srv_paramsetoutput'
función srv_paramdata externo sLibName nombre de 'srv_paramdata'
función srv_paramlen externo sLibName nombre de 'srv_paramlen'
función srv_parammaxlen externo sLibName nombre de 'srv_parammaxlen'
función srv_paramtype externo sLibName nombre de 'srv_paramtype'
función srv_paramset externo sLibName nombre de 'srv_paramset'
función srv_paramname externo sLibName nombre de 'srv_paramname'
función srv_paramnumber externo sLibName nombre de 'srv_paramnumber'
// & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
// El resto de estas Api se admiten, en SQL Server 7.0,
// pero no puede ser admitido después de SQL Server 7.0
función srv_getconfig externo sLibName nombre de 'srv_getconfig'
función srv_getserver externo sLibName nombre de 'srv_getserver'
función srv_got_attention externo sLibName nombre de 'srv_got_attention'
función srv_eventdata externo sLibName nombre de 'srv_eventdata'
// de Memoria
función srv_alloc externo sLibName nombre de 'srv_alloc'
función srv_bmove externo sLibName nombre de 'srv_bmove'
función srv_bzero externo sLibName nombre de 'srv_bzero'
función srv_free externo sLibName nombre de 'srv_free'
función srv_config_fn externo sLibName nombre de 'srv_config'
función srv_config_alloc externo sLibName nombre de 'srv_config_alloc'
función srv_convert externo sLibName nombre de 'srv_convert'
función srv_event_fn externo sLibName nombre de 'srv_event'
función srv_getuserdata externo sLibName nombre de 'srv_getuserdata'
función srv_getbindtoken externo sLibName nombre de 'srv_getbindtoken'
función srv_getdtcxact externo sLibName nombre de 'srv_getdtcxact'
función srv_handle externo sLibName nombre de 'srv_handle'
función srv_impersonate_client externo sLibName nombre de 'srv_impersonate_client'
función srv_init externo sLibName nombre de 'srv_init'
función srv_iodead externo sLibName nombre de 'srv_iodead'
función srv_langcpy








Los procedimientos almacenados extendidos con delphi


Los procedimientos almacenados extendidos con delphi : Multi-millones de consejos para hacer su vida mas facil.


¿alguna vez has intentado crear un procedimiento almacenado en SQL Server?
¿Que sucede si la funcionalidad que usted desea incorporar no esta dentro del SQL, pero en tu proyecto de Delphi? Microsoft proporciona ODS (Servicios Abiertos de Datos), que es una API para ayudarle a crear la funcionalidad mediante la adicion de DLL para SQL Server que contienen los Procedimientos Almacenados Extendidos.
Esta es la manera de hacerlo....
Como un bono especial, este articulo tambien es una solucion simple para cifrar sus datos en SQL Server utilizando Procedimientos Almacenados Extendidos.
¿Que necesitamos?
1) opends60.dll (de una instalacion completa con herramientas de desarrollador de MSSQL o MSDE)
2) MsOdsApi.pas-AUTOR: Leonid 'MC' Belousov (www.bramc.ru/soft/) archivo de Encabezado para el uso opends60.dll) (incluido al final del articulo)
3) Un Local de SQL Server para pruebas (MSDE va a hacer muy bien).
NOTA: Para la criptografia he utilizado los componentes que se encuentran bajo la licencia MIT aqui:
http://www.cityinthesky.co.uk/cryptography.html
Medidas:
1) Crear un nuevo archivo DLL.

2) la creacion de una unidad y en la clausula uses agregar el MsOdsApi de la unidad.

3) En el archivo de la Biblioteca justo debajo de otros Usos de la clausula de complemento de las Exportaciones y de los nombres de las funciones de exportacion de:
biblioteca MyEncryptDll
usos
& nbsp & nbsp SysUtils,
& nbsp & nbsp Clases,
& nbsp & nbsp Unit1 en ' Unit1.pas'
las exportaciones
& nbsp & nbsp xp_DoEncrypt,
& nbsp & nbsp xp_DoDecrypt
begin
final.

4) En la Unidad de archivo de solo en virtud de la clausula uses añadir su funcion de referencia:
funcion xp_DoEncrypt(pSrvProc: SRV_PROC): Integer cdecl
funcion xp_DoDecrypt(pSrvProc: SRV_PROC): Integer cdecl
NOTAS: cdecl es necesario para las SAO a ser capaz de llamar a sus funciones.
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SRV_PROC es un identificador para el procedimiento almacenado de la informacion.

5) El codigo de la DoEncrypt es esta:
Basado en el codigo fuente por Leonid 'MC' Belousov (www.bramc.ru/soft/)
(DoDecrypt es exactamente el mismo que con un solo DecryptString(s) de la llamada.
funcion xp_Encrypt(pSrvProc: SRV_PROC): Integer cdecl
var
& nbsp & nbsp yo, sz: Integer
& nbsp & nbsp bType: Byte
& nbsp & nbsp fNull: Bool
& nbsp & nbsp cbMaxLen, cbActualLen: ULONG
& nbsp & nbsp myData,myanswer,myKey:array [0..255] of char
& nbsp & nbsp FDCP_3des: TDCP_3des
& nbsp & nbsp s:string
& nbsp & nbsp ps:pchar
begin
& nbsp & nbsp for i:=0 to 255
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp myData[i]:=#0
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp myanswer[i]:=#0
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp myKey[i]:=#0
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp si srv_rpcparams(pSrvProc) = 2 entonces // Comprobar si los parametros de entrada estan presentes...
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp srv_paraminfo(pSrvProc, 1, @bType, // que Vamos a utilizar el 1er parametro de entrada!
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp @cbMaxLen, @cbActualLen, // NOTA: asumimos aqui lo que solo 2 de los parametros
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp @myData[0], @fNull) //de tipo String puede pasar!!!
& nbsp & nbsp & nbsp & nbsp bType:=SRVVARCHAR
& nbsp & nbsp & nbsp & nbsp srv_paraminfo(pSrvProc, 2, @bType,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp @cbMaxLen, @cbActualLen,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp @myKey[0], @fNull)
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp else
& nbsp & nbsp & nbsp & nbsp MyData := ' // No hay parametros de entrada? Utilice el valor predeterminado en su lugar.
& nbsp & nbsp //CODIGO de CIFRADO por DEBAJO USTED PUEDE HACER LO QUE se NECESITA AQUI CON LOS VALORES de PARAMETRO
& nbsp & nbsp FDCP_3des:=TDCP_3des.Create(nil)
& nbsp & nbsp FDCP_3des.BlockSize=64
& nbsp & nbsp FDCP_3des.Algoritmo:='3DES'
& nbsp & nbsp FDCP_3des.CipherMode:=cmCBC
& nbsp & nbsp FDCP_3des.Id:=24
& nbsp & nbsp FDCP_3des.MaxKeySize:=192
& nbsp & nbsp FDCP_3des.InitStr(myKey,TDCP_sha1)
& nbsp & nbsp s:=cadena de caracteres(mydata)
& nbsp & nbsp strpcopy(myAnswer,FDCP_3des.EncryptString(s))
& nbsp & nbsp FDCP_3des.Quemar
& nbsp & nbsp // CONFIGURACION de la RESPUESTA DE los VALORES PCHAR Y LLEGAR TAMAÑO
& nbsp & nbsp s:=cadena de caracteres(myAnswer)
& nbsp & nbsp sz:=length(s)
& nbsp & nbsp ps:=allocmem(sz)
& nbsp & nbsp ps:=pchar(s)
& nbsp & nbsp // Describir las columnas
& nbsp & nbsp // (en Realidad, usted esta haciendo que para cada tipo de datos y cada columna que desea devolver).
& nbsp & nbsp srv_describe(pSrvProc,1 , 'Valor', SRV_NULLTERM,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SRVVARCHAR, sz,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SRVVARCHAR, sz, nil)
& nbsp & nbsp & nbsp & nbsp // Comenzar de salida...
& nbsp & nbsp srv_setcoldata(pSrvProc, 1, @p[0])
& nbsp & nbsp srv_sendrow(pSrvProc) // Enviar la fila.
// Vamos a volver parametro de salida (por ejemplo).
& nbsp & nbsp srv_senddone(pSrvProc, // por ultimo, enviar los datos para SQL Server:
& nbsp & nbsp & nbsp & nbsp (SRV_DONE_COUNT o SRV_DONE_MORE), 0, 1) // enviar los resultados de un mensaje de finalizacion.
& nbsp & nbsp // LIBERAR el CIFRADO de COMPONENTES
& nbsp & nbsp FreeAndNil(FDCP_3des)
& nbsp & nbsp resultado := 1 // Informe de exito (1 = EXITO, 0 = NO)
fin
NOTA: Hay un numero de cosas que usted puede hacer con ODS. Este es solo un ejemplo de Delphi. Usted puede leer la ODS ayudar en MSDN y hacer aun mas.

6) las Pruebas y la Depuracion: (Fuente Leonid 'MC' Belousov (www.bramc.ru/soft/))
A) la Instalacion de SQL 7.0/2000 en su estacion de trabajo (o instalar Delphi en la estacion de trabajo donde esta instalado SQL Server).
B) Registrar tu Xp en SQL Server.
& nbsp & nbsp & nbsp NOTAS:
& nbsp & nbsp & nbsp Registro de Xp como esta:
& nbsp & nbsp & nbsp & nbsp & nbsp maestro
& nbsp & nbsp & nbsp & nbsp & nbsp ir
& nbsp & nbsp & nbsp & nbsp & nbsp sp_addextendedproc 'xp_DoEncrypt', 'MyEncryptDll.dll'
& nbsp & nbsp & nbsp & nbsp & nbsp ir
& nbsp & nbsp & nbsp & nbsp & nbsp sp_addextendedproc 'xp_DoDecrypt', 'MyEncryptDll.dll'
& nbsp & nbsp & nbsp & nbsp & nbsp ir
& nbsp & nbsp & nbsp Anular el registro de Xp como este:
& nbsp & nbsp & nbsp & nbsp & nbsp maestro
& nbsp & nbsp & nbsp & nbsp & nbsp ir
& nbsp & nbsp & nbsp & nbsp & nbsp sp_dropextendedproc 'xp_DoEncrypt'
& nbsp & nbsp & nbsp & nbsp & nbsp ir
& nbsp & nbsp & nbsp & nbsp & nbsp sp_dropextendedproc 'xp_DoDecrypt'
& nbsp & nbsp & nbsp & nbsp & nbsp ir
& nbsp & nbsp & nbsp Desbloquear DLL en el caso de que siendo utilizado por SQL como la siguiente:
& nbsp & nbsp & nbsp & nbsp & nbsp maestro
& nbsp & nbsp & nbsp & nbsp & nbsp ir
& nbsp & nbsp & nbsp & nbsp & nbsp DBCC MyEncryptDll(GRATIS)
& nbsp & nbsp & nbsp & nbsp & nbsp ir
C) En Delphi, seleccione desde el menu principal Ejecutar -> Parametros de Ejecucion.
En la Aplicacion Host, especifique una ruta de acceso a su Servidor SQL server ejecutable (sqlservr.exe). Para SQL 7.0, esto es suficiente. Para SQL 2000, en el campo de Parametros especificar un parametro de linea de comando '-sYOUR_SQL_NAME', donde YOUR_SQL_NAME es el nombre asignado a su Servidor SQL server durante la instalacion.
Establecer puntos de interrupcion en el codigo de Delphi y ejecutar el proyecto. SQL Server se inicia como una aplicacion de consola.
D) puede ejecutar el Xp desde el Analizador de Consultas y el codigo de seguimiento en Delphi.
& nbsp & nbsp & nbsp NOTA:
& nbsp & nbsp & nbsp Ejecutar un procedimiento almacenado extendido se hace asi:
& nbsp & nbsp & nbsp exec master..xp_DoEncrypt 'ValueToEncrypt','KeyValue'
& nbsp & nbsp & nbsp ir
E) Para salir de la aplicacion, presione Ctrl Pausa en el SQL Server de la consola de la ventana.
& & & & & & & & & & & & & & & & & & & & & & & & & & & -
Final del articulo. Abajo sigue una unidad requerida para el ODS.
& & & & & & & & & & & & & & & & & & & & & & & & & & & -
MsOdsApi.pas (Copiar de la linea de abajo)
{
& nbsp & nbsp - Maestro del Cluster de la Biblioteca -
& nbsp & nbsp Copyright © 1996-2002 Leonid Belousov (tambien conocido como Maestro del Cluster)
& nbsp & nbsp mailto: [email protected]
& nbsp & nbsp www.bramc.ru/soft/
& nbsp & nbsp - Descripcion: traduccion de C-encabezados de Microsoft Open de Datos de la API de Servicios
}
unidad de MsOdsApi
// & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
// Servicios Abiertos de Datos de encabezado de archivo: srv.h
// Copyright (c) 1989, 1990, 1991, 1997 por Microsoft corporation
//
// para Evitar la doble inclusion
//#ifndef _ODS_SRV_H_
// _ODS_SRV_H_
//#incluir 'de windows.h'
// ODS usa pack(4) en todos los tipos de CPU
//#pragma pack(4)
//#ifdef __cplusplus
//extern 'C' {
//#endif
// definir el modelo
//#si!!!define( FAR )
// mucho, MUCHO
//#endif
// & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
// Formatos de tipos de datos
//#si!!!define(DBTYPEDEFS) // no entren en conflicto con DBLIB definiciones
//#si!!!define(MAXNUMERICLEN) // No entren en conflicto con ODBC definiciones
// DBTYPEDEFS
interfaz
usos
& nbsp & nbsp Windows
tipo
& nbsp & nbsp DBBOOL = Byte
& nbsp & nbsp DBBYTE = Byte
& nbsp & nbsp DBTINYINT = Byte
& nbsp & nbsp DBSMALLINT = Smallint
& nbsp & nbsp DBUSMALLINT = Word
& nbsp & nbsp DBINT = Longint
& nbsp & nbsp DBCHAR = Char
& nbsp & nbsp PDBCHAR = ^DBCHAR
& nbsp & nbsp DBBINARY = Byte
& nbsp & nbsp DBBIT = Byte
& nbsp & nbsp DBFLT8 = Doble
& nbsp & nbsp srv_datetime = record
& nbsp & nbsp & nbsp & nbsp // Formato para SRVDATETIME
& nbsp & nbsp & nbsp & nbsp dtdays: Longint // numero de dias desde 1/1/1900
& nbsp & nbsp & nbsp & nbsp dttime: Longword // numero 300 segunda desde mediados
& nbsp & nbsp final
& nbsp & nbsp DBDATETIME = srv_datetime
& nbsp & nbsp srv_dbdatetime4 = record
& nbsp & nbsp & nbsp & nbsp // Formato para SRVDATETIM4
& nbsp & nbsp & nbsp & nbsp numdias: Palabra // numero de dias desde 1/1/1900
& nbsp & nbsp & nbsp & nbsp nummins: Palabra // numero de minutos sicne de la medianoche
& nbsp & nbsp final
& nbsp & nbsp DBDATETIM4 = srv_dbdatetime4
& nbsp & nbsp srv_money = record
& nbsp & nbsp & nbsp & nbsp // Formato para SRVMONEY
& nbsp & nbsp & nbsp & nbsp mnyhigh: Longint
& nbsp & nbsp & nbsp & nbsp mnylow : Longword
& nbsp & nbsp final
& nbsp & nbsp DBMONEY = srv_money
& nbsp & nbsp DBFLT4 = Doble
& nbsp & nbsp DBMONEY4 = Longint
const
& nbsp & nbsp MAXNUMERICDIG = 38
& nbsp & nbsp DEFAULTPRECISION = 19 // 18
& nbsp & nbsp DEFAULTSCALE = 0
& nbsp & nbsp MAXNUMERICLEN = 16
tipo
& nbsp & nbsp srv_dbnumeric = lleno de registro
& nbsp & nbsp & nbsp & nbsp // Formato para SRVNUMERIC,SRVNUMERICN,SRVDECIMAL SRVDECIMALN
& nbsp & nbsp & nbsp & nbsp precision: Byte
& nbsp & nbsp & nbsp & nbsp escala : Byte
& nbsp & nbsp & nbsp & nbsp signo : Byte // 1 = Positivo, 0 = Negativo
& nbsp & nbsp & nbsp & nbsp val : array [0..MAXNUMERICLEN-1] of Byte // Collar de little-endian, de valor
& nbsp & nbsp final
& nbsp & nbsp estructura dbnumeric = srv_dbnumeric
& nbsp & nbsp DBDECIMAL = estructura dbnumeric
//#endif // #si!!!define(MAXNUMERICLEN)
//#endif // #si!!!define( DBTYPEDEFS )
// & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
// Constantes utilizadas por la Api
// Tokens de Tipo
const
& nbsp & nbsp SRV_TDS_NULL = $1f
& nbsp & nbsp SRV_TDS_TEXT = $23
& nbsp & nbsp SRV_TDS_GUID = $24
& nbsp & nbsp SRV_TDS_VARBINARY = $25
& nbsp & nbsp SRV_TDS_INTN = $26
& nbsp & nbsp SRV_TDS_VARCHAR = $27
& nbsp & nbsp SRV_TDS_BINARY = $2d
& nbsp & nbsp SRV_TDS_IMAGE = $22
& nbsp & nbsp SRV_TDS_CHAR = $2f
& nbsp & nbsp SRV_TDS_INT1 = $30
& nbsp & nbsp SRV_TDS_BIT = $32
& nbsp & nbsp SRV_TDS_INT2 = $34
& nbsp & nbsp SRV_TDS_DECIMAL = $37
& nbsp & nbsp SRV_TDS_INT4 = $38
& nbsp & nbsp SRV_TDS_DATETIM4 = $3a
& nbsp & nbsp SRV_TDS_FLT4 = $3b
& nbsp & nbsp SRV_TDS_MONEY = $3c
& nbsp & nbsp SRV_TDS_DATETIME = $3d
& nbsp & nbsp SRV_TDS_FLT8 = $3e
& nbsp & nbsp SRV_TDS_NUMERIC = $3f
& nbsp & nbsp SRV_TDS_NTEXT = $63
& nbsp & nbsp SRV_TDS_BITN = $68
& nbsp & nbsp SRV_TDS_DECIMALN = $6a
& nbsp & nbsp SRV_TDS_NUMERICN = $6c
& nbsp & nbsp SRV_TDS_FLTN = $6d
& nbsp & nbsp SRV_TDS_MONEYN = $6e
& nbsp & nbsp SRV_TDS_DATETIMN = $6f
& nbsp & nbsp SRV_TDS_MONEY4 = $7a
& nbsp & nbsp SRV_TDS_INT8 = $7f // SQL 2000 y mas tarde
& nbsp & nbsp SRV_TDS_BIGVARBINARY = $A5
& nbsp & nbsp SRV_TDS_BIGVARCHAR = $A7
& nbsp & nbsp SRV_TDS_BIGBINARY = $AD
& nbsp & nbsp SRV_TDS_BIGCHAR = $AF
& nbsp & nbsp SRV_TDS_NVARCHAR = $e7
& nbsp & nbsp SRV_TDS_NCHAR = $ef
// tipos de datos
// Tambien: los valores de parametro de simbolo para srv_symbol cuando type = SRV_DATATYPE
& nbsp & nbsp SRVNULL = SRV_TDS_NULL
& nbsp & nbsp SRVTEXT = SRV_TDS_TEXT
& nbsp & nbsp SRVGUID = SRV_TDS_GUID
& nbsp & nbsp SRVVARBINARY = SRV_TDS_VARBINARY
& nbsp & nbsp SRVINTN = SRV_TDS_INTN
& nbsp & nbsp SRVVARCHAR = SRV_TDS_VARCHAR
& nbsp & nbsp SRVBINARY = SRV_TDS_BINARY
& nbsp & nbsp SRVIMAGE = SRV_TDS_IMAGE
& nbsp & nbsp SRVCHAR = SRV_TDS_CHAR
& nbsp & nbsp SRVINT1 = SRV_TDS_INT1
& nbsp & nbsp SRVBIT = SRV_TDS_BIT
& nbsp & nbsp SRVINT2 = SRV_TDS_INT2
& nbsp & nbsp SRVDECIMAL = SRV_TDS_DECIMAL
& nbsp & nbsp SRVINT4 = SRV_TDS_INT4
& nbsp & nbsp SRVDATETIM4 = SRV_TDS_DATETIM4
& nbsp & nbsp SRVFLT4 = SRV_TDS_FLT4
& nbsp & nbsp SRVMONEY = SRV_TDS_MONEY
& nbsp & nbsp SRVDATETIME = SRV_TDS_DATETIME
& nbsp & nbsp SRVFLT8 = SRV_TDS_FLT8
& nbsp & nbsp SRVNUMERIC = SRV_TDS_NUMERIC
& nbsp & nbsp SRVNTEXT = SRV_TDS_NTEXT
& nbsp & nbsp SRVBITN = SRV_TDS_BITN
& nbsp & nbsp SRVDECIMALN = SRV_TDS_DECIMALN
& nbsp & nbsp SRVNUMERICN = SRV_TDS_NUMERICN
& nbsp & nbsp SRVFLTN = SRV_TDS_FLTN
& nbsp & nbsp SRVMONEYN = SRV_TDS_MONEYN
& nbsp & nbsp SRVDATETIMN = SRV_TDS_DATETIMN
& nbsp & nbsp SRVMONEY4 = SRV_TDS_MONEY4
& nbsp & nbsp SRVINT8 = SRV_TDS_INT8 // SQL 2000 y mas tarde
& nbsp & nbsp SRVBIGVARBINARY = SRV_TDS_BIGVARBINARY
& nbsp & nbsp SRVBIGVARCHAR = SRV_TDS_BIGVARCHAR
& nbsp & nbsp SRVBIGBINARY = SRV_TDS_BIGBINARY
& nbsp & nbsp SRVBIGCHAR = SRV_TDS_BIGCHAR
& nbsp & nbsp SRVNVARCHAR = SRV_TDS_NVARCHAR
& nbsp & nbsp SRVNCHAR = SRV_TDS_NCHAR
// los valores de srv_symbol parametro de tipo
& nbsp SRV_ERROR = 0
& nbsp SRV_DONE = 1
& nbsp SRV_DATATYPE = 2
& nbsp SRV_EVENT = 4
// los valores de srv_symbol simbolo de parametro, cuando el tipo = SRV_ERROR
& nbsp & nbsp SRV_ENO_OS_ERR = 0
& nbsp & nbsp SRV_INFO = 1
& nbsp & nbsp SRV_FATAL_PROCESS = 10
& nbsp & nbsp SRV_FATAL_SERVER = 19
// Tipos de eventos de servidor
// Tambien: los valores de srv_symbol simbolo de parametro, cuando el tipo = SRV_EVENT
& nbsp & nbsp SRV_CONTINUE = 0
& nbsp & nbsp SRV_LANGUAGE = 1
& nbsp & nbsp SRV_CONNECT = 2
& nbsp & nbsp SRV_RPC = 3
& nbsp & nbsp SRV_RESTART = 4
& nbsp & nbsp SRV_DISCONNECT = 5
& nbsp & nbsp SRV_ATTENTION = 6
& nbsp & nbsp SRV_SLEEP = 7
& nbsp & nbsp SRV_START = 8
& nbsp & nbsp SRV_STOP = 9
& nbsp & nbsp SRV_EXIT = 10
& nbsp & nbsp SRV_CANCEL = 11
& nbsp & nbsp SRV_SETUP = 12
& nbsp & nbsp SRV_CLOSE = 13
& nbsp & nbsp SRV_PRACK = 14
& nbsp & nbsp SRV_PRERROR = 15
& nbsp & nbsp SRV_ATTENTION_ACK = 16
& nbsp & nbsp SRV_CONNECT_V7 = 16 // TDS tipo de TDS 7 los clientes. Sobrecargado con SRV_ATTENTION_ACK
& nbsp & nbsp SRV_SKIP = 17
& nbsp & nbsp SRV_TRANSMGR = 18
& nbsp & nbsp SRV_OLEDB = 20
& nbsp & nbsp SRV_INTERNAL_HANDLER = 99
& nbsp & nbsp SRV_PROGRAMMER_DEFINED = 100
// los valores de srv_config parametro de opcion
& nbsp & nbsp SRV_CONNECTIONS = 1
& nbsp & nbsp SRV_LOGFILE = 2
& nbsp & nbsp SRV_STACKSIZE = 3
& nbsp & nbsp SRV_REMOTE_ACCESS = 7
& nbsp & nbsp SRV_REMOTE_CONNECTIONS = 9
& nbsp & nbsp SRV_MAX_PACKETS = 10
& nbsp & nbsp SRV_MAXWORKINGTHREADS = 11
& nbsp & nbsp SRV_MINWORKINGTHREADS = 12
& nbsp & nbsp SRV_THREADTIMEOUT = 13
& nbsp & nbsp SRV_MAX_PACKETSIZE = 17
& nbsp & nbsp SRV_THREADPRIORITY = 18
& nbsp & nbsp SRV_ANSI_CODEPAGE = 19
& nbsp & nbsp SRV_DEFAULT_PACKETSIZE = 26
& nbsp & nbsp SRV_PASSTHROUGH = 27
// vlaues para srv_config valor de parametro cuando la opcion = SRV_THREADPRIORITY
& nbsp & nbsp SRV_PRIORITY_LOW = THREAD_PRIORITY_LOWEST
& nbsp & nbsp SRV_PRIORITY_NORMAL = THREAD_PRIORITY_NORMAL
& nbsp & nbsp SRV_PRIORITY_HIGH = THREAD_PRIORITY_HIGHEST
& nbsp & nbsp SRV_PRIORITY_CRITICAL = THREAD_PRIORITY_TIME_CRITICAL
// los valores de srv_sfield parametro de campo
& nbsp & nbsp SRV_SERVERNAME = 0
& nbsp & nbsp SRV_VERSION = 6
// Longitud para indicar cadena terminada en null
& nbsp & nbsp SRV_NULLTERM = -1
// los valores de msgtype parametro a srv_sendmsg

& nbsp & nbsp SRV_MSG_INFO = 1
& nbsp & nbsp SRV_MSG_ERROR = 2
// los valores de parametro de estado para srv_senddone
// Tambien: los valores para el simbolo de parametros para srv_symbol cuando type = SRV_DONE
& nbsp & nbsp SRV_DONE_FINAL = $0000
& nbsp & nbsp SRV_DONE_MORE = $0001
& nbsp & nbsp SRV_DONE_ERROR = $0002
& nbsp & nbsp SRV_DONE_COUNT = $0010
& nbsp & nbsp SRV_DONE_RPC_IN_BATCH = $0080
// valores devueltos de srv_paramstatus
& nbsp & nbsp SRV_PARAMRETURN = $0001
& nbsp & nbsp SRV_PARAMDEFAULT = $0002
// valores devueltos de srv_rpcoptions
& nbsp & nbsp SRV_RECOMPILE = $0001
& nbsp & nbsp SRV_NOMETADATA = $0002
// los valores de parametro de campo a srv_pfield
// SRV_LANGUAGE 1 ya definido anteriormente
// SRV_EVENT 4 ya definido anteriormente
& nbsp & nbsp SRV_SPID = 10
& nbsp & nbsp SRV_NETSPID = 11
& nbsp & nbsp SRV_TYPE = 12
& nbsp & nbsp SRV_STATUS = 13
& nbsp & nbsp SRV_RMTSERVER = 14
& nbsp & nbsp SRV_HOST = 15
& nbsp & nbsp SRV_USER = 16
& nbsp & nbsp SRV_PWD = 17
& nbsp & nbsp SRV_CPID = 18
& nbsp & nbsp SRV_APPLNAME = 19
& nbsp & nbsp SRV_TDS = 20
& nbsp & nbsp SRV_CLIB = 21
& nbsp & nbsp SRV_LIBVERS = 22
& nbsp & nbsp SRV_ROWSENT = 23
& nbsp & nbsp SRV_BCPFLAG = 24
& nbsp & nbsp SRV_NATLANG = 25
& nbsp & nbsp SRV_PIPEHANDLE = 26
& nbsp & nbsp SRV_NETWORK_MODULE = 27
& nbsp & nbsp SRV_NETWORK_VERSION = 28
& nbsp & nbsp SRV_NETWORK_CONNECTION = 29
& nbsp & nbsp SRV_LSECURE = 30
& nbsp & nbsp SRV_SAXP = 31
& nbsp & nbsp SRV_UNICODE_USER = 33
& nbsp & nbsp SRV_UNICODE_PWD = 35
& nbsp & nbsp SRV_SPROC_CODEPAGE = 36
// el valor de retorno de SRV_TDSVERSION macro
& nbsp & nbsp SRV_TDS_NONE = 0
& nbsp & nbsp SRV_TDS_2_0 = 1
& nbsp & nbsp SRV_TDS_3_4 = 2
& nbsp & nbsp SRV_TDS_4_2 = 3
& nbsp & nbsp SRV_TDS_6_0 = 4
& nbsp & nbsp SRV_TDS_7_0 = 5
// Devolver valores de Api
tipo
& nbsp SRVRETCODE = Integer // EXITO o no
& nbsp RETCODE = Integer
const
& nbsp & nbsp EXITO = 1 // el regreso Exitoso de valor
& nbsp & nbsp FALLAR = 0 // Incorrecta el valor de retorno
& nbsp & nbsp SRV_DUPLICATE_HANDLER= 2 // adicional del valor de retorno de srv_pre/post_handle
// & & & & & & & & & & & & & & & & & & & & & & & &
//PreDeclare estructuras
//
{struct srv_server
typedef struct srv_server SRV_SERVER
struct srv_config
typedef struct srv_config SRV_CONFIG
struct srv_proc
typedef struct srv_proc SRV_PROC }
tipo
& nbsp & nbsp SRV_SERVER = Puntero
& nbsp & nbsp SRV_CONFIG = Puntero
& nbsp & nbsp SRV_PROC = Puntero
// & & & & & & & & & & & & & & & & & & & & & & & &
// & & & & & & & & & & & & & & & & & & & & & & & &
// ODS MACROs & Api
// que Describe y el envio de un conjunto de resultados
funcion srv_describe(srvproc: SRV_PROC
& nbsp & nbsp colnumber: Integer column_name: PCHAR namelen: Integer
& nbsp & nbsp desttype, destlen, srctype, srclen: Integer srcData: Puntero
): Integer cdecl
funcion srv_setutype(srvproc: SRV_PROC columna: Integer usertype: Longint): Integer cdecl
funcion srv_setcoldata(srvproc: SRV_PROC columna: Integer datos: Puntero): Integer cdecl
funcion srv_setcollen(srvproc: SRV_PROC columna, len: Integer): Integer cdecl
funcion srv_sendrow(srvproc: SRV_PROC): Integer cdecl
funcion srv_senddone(srvproc: SRV_PROC estado, curcmd: Word count: Longint): Integer cdecl
// Tratar con la ampliacion de los parametros de los procedimientos
funcion srv_rpcparams(srvproc: SRV_PROC): Integer cdecl
funcion srv_paraminfo(srvproc: SRV_PROC n: Integer pbType: PByte
& nbsp & nbsp pcbMaxLen, pcbActualLen: PULONG pbData: PByte pfNull: PBOOL): Integer cdecl
funcion srv_paramsetoutput(srvproc: SRV_PROC
& nbsp & nbsp n: Integer pbData: PByte cbLen: ULONG fNull: BOOL): Integer cdecl
funcion srv_paramdata(srvproc: SRV_PROC n: Entero): Puntero cdecl
funcion srv_paramlen(srvproc: SRV_PROC n: Integer): Integer cdecl
funcion srv_parammaxlen(srvproc: SRV_PROC n: Integer): Integer cdecl
funcion srv_paramtype(srvproc: SRV_PROC n: Entero): Entero cdecl
funcion srv_paramset(srvproc: SRV_PROC n: Integer datos: Puntero int: Integer): Integer cdecl
funcion srv_paramname(srvproc: SRV_PROC n: Entero var len: Integer): PChar cdecl
funcion srv_paramnumber(srvproc: SRV_PROC nombre: PChar namelen: Integer): Integer cdecl
// & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
// & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
// El resto de estas Api se admiten, en SQL Server 7.0,
// pero no puede ser admitido despues de SQL Server 7.0
// MACROs
{ SRV_GETCONFIG(a)srv_getconfig ( a )
& nbsp & nbsp SRV_GETSERVER(a)srv_getserver ( a )
& nbsp & nbsp SRV_GOT_ATTENTION(a)srv_got_attention ( a )
SRV_EVENTDATA(a)srv_eventdata ( a )
SRV_IODEAD(a)srv_iodead ( a )
SRV_TDSVERSION(a)srv_tdsversion ( a )}
funcion srv_getconfig(servidor: SRV_SERVER): SRV_CONFIG cdecl
funcion srv_getserver(srvproc: SRV_PROC): SRV_SERVER cdecl
funcion srv_got_attention(srvproc: SRV_PROC): Bool cdecl
funcion srv_eventdata(srvproc: SRV_PROC): Puntero cdecl
// de Memoria
funcion srv_alloc(ulSize: Longint): Puntero cdecl
funcion srv_bmove(de: Puntero toma de fuerza: recuento de Puntero: Longint): Integer cdecl
funcion srv_bzero(ubicacion: recuento de Puntero: Longint): Integer cdecl
funcion srv_free(ptr: Puntero): Entero cdecl
funcion srv_config_fn(config: SRV_CONFIG opcion: Longint valor: PChar valuelen: Integer): Integer cdecl
funcion srv_config_alloc: SRV_CONFIG cdecl
funcion srv_convert(srvproc: SRV_PROC srctype: Integer src: Puntero srclen: DBINT
& nbsp & nbsp desttype: Integer dest: Puntero destlen: DBINT): Integer cdecl
{
int (* srv_errhandle(int (* controlador)(SRV_SERVER * servidor de,
SRV_PROC * srvproc,
int srverror,
BYTE de gravedad,
BYTE de estado,
int oserrnum,
char * errtext,
int errtextlen,
char * oserrtext,
int oserrtextlen)))
& nbsp & nbsp & nbsp ( SRV_SERVER * server,
SRV_PROC * srvproc,
int srverror,
BYTE de gravedad,
BYTE de estado,
int oserrnum,
char * errtext,
int errtextlen,
char * oserrtext,
int oserrtextlen )
}
funcion srv_event_fn(srvproc: SRV_PROC evento: Integer datos: PByte): Integer cdecl
funcion srv_getuserdata(srvproc: SRV_PROC): Puntero cdecl
funcion srv_getbindtoken(srvproc: SRV_PROC token_buf: PChar): Integer cdecl
funcion srv_getdtcxact(srvproc: SRV_PROC ppv: Puntero): Integer cdecl
//typedef int (* EventHandler)(void*)
tipo
& nbsp & nbsp EventHandler = Puntero
funcion srv_handle(servidor: SRV_SERVER int: Longint controlador: EventHandler): Evento andler cdecl
funcion srv_impersonate_client(srvproc: SRV_PROC): Integer cdecl
funcion srv_init(config: SRV_CONFIG connectname: PChar namelen: Integer): SRV_SERVER cdecl
funcion srv_iodead(srvproc: SRV_PROC): Bool cdecl
funcion srv_langcpy(srvproc: SRV_PROC inicio, nbytes: Longint de bufer: PChar): Longint cdecl
funcion srv_langlen(srvproc: SRV_PROC): Longint cdecl
funcion srv_langptr(srvproc: SRV_PROC): Puntero cdecl
funcion srv_log(servidor: SRV_SERVER datestamp: Bool error: PChar msglen: Integer): Integer cdecl
funcion srv_paramstatus(srvproc: SRV_PROC n: Integer): Integer cdecl
funcion srv_pfield(srvproc: SRV_PROC campo: Integer len: PInteger): PChar cdecl
funcion srv_returnval(srvproc: SRV_PROC value_name: PDBCHAR len: Integer estado: Byte
& nbsp & nbsp iType, maxlen, datalen: DBINT valor: PByte): Integer cdecl
funcion srv_revert_to_self(srvproc: SRV_PROC): Integer cdecl
funcion srv_rpcdb(srvproc: SRV_PROC len: PInteger): PChar cdecl
funcion srv_rpcname(srvproc: SRV_PROC len: PInteger): PChar cdecl
funcion srv_rpcnumber(srvproc: SRV_PROC): Integer cdecl
funcion srv_rpcoptions(srvproc: SRV_PROC): Palabra cdecl
funcion srv_rpcowner(srvproc: SRV_PROC len: PInteger): PChar cdecl
funcion srv_run(servidor: SRV_SERVER): Integer cdecl
funcion srv_sendmsg(srvproc: SRV_PROC
& nbsp & nbsp msgtype: Integer msgnum: DBINT msgClass, estado: DBTINYINT
& nbsp & nbsp rpcname: PChar rpcnamelen: Integer
& nbsp & nbsp linenum: Palabra de error: PChar msglen: Integer): Integer cdecl
funcion srv_ansi_sendmsg(srvproc: SRV_PROC
& nbsp & nbsp msgtype: Entero msgnum: DBINT msgClass, estado: DBTINYINT
& nbsp & nbsp rpcname: PChar rpcnamelen: Integer
& nbsp & nbsp linenum: Palabra de error: PChar msglen: Integer): Integer cdecl
funcion srv_sendstatus(srvproc: SRV_PROC estado: Longint): Integer cdecl
funcion srv_setuserdata(srvproc: SRV_PROC ptr: Puntero): Integer cdecl
funcion srv_sfield(servidor: SRV_SERVER campo: Integer len: PInteger): PChar cdecl
funcion srv_symbol(iType, simbolo: Integer len: PInteger): PChar cdecl
funcion srv_tdsversion(srvproc: SRV_PROC): Integer cdecl
funcion srv_writebuf(srvproc: SRV_PROC ptr: Puntero a contar: Word): Integer cdecl
funcion srv_willconvert(srctype, desttype: Integer): Bool cdecl
procedimiento srv_ackattention(srvproc: SRV_PROC) cdecl
funcion srv_terminatethread(srvproc: SRV_PROC): Entero cdecl
funcion srv_sendstatistics(srvproc: SRV_PROC): Integer cdecl
funcion srv_clearstatistics(srvproc: SRV_PROC): Integer cdecl
funcion srv_setevent(servidor: SRV_SERVER evento: Integer): Integer cdecl
funcion srv_message_handler(srvproc: SRV_PROC
& nbsp & nbsp errornum: Integer gravedad, estado: Byte oserrnum: Integer errtext: PChar
& nbsp & nbsp errtextlen: Integer oserrtext: PChar oserrtextlen: Integer): Entero cdecl
funcion srv_pre_handle(servidor: SRV_SERVER srvproc: SRV_PROC
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp evento: Longint controlador: EventHandler quitar: Bool): Integer cdecl
funcion srv_post_handle(servidor: SRV_SERVER srvproc: SRV_PROC
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp evento: Longint controlador: EventHandler quitar: Bool): Integer cdecl
funcion srv_post_completion_queue(srvproc: SRV_PROC inbuf: PChar inbuflen: PChar): Integer cdecl
funcion srv_IgnoreAnsiToOem(srvproc: SRV_PROC bTF: BOOL): Entero cdecl
//#ifdef __cplusplus
//}
//#endif
//#pragma pack()
const
& nbsp & nbsp SS_MAJOR_VERSION = 7
& nbsp & nbsp SS_MINOR_VERSION = 00
& nbsp & nbsp SS_LEVEL_VERSION = 0000
& nbsp & nbsp SS_MINIMUM_VERSION = '7.00.00.0000'
& nbsp & nbsp ODS_VERSION = ((SS_MAJOR_VERSION shl 24) o (SS_MINOR_VERSION shl 16))
//#endif //_ODS_SRV_H_
//////////////////////////////////////////////////////////////////
// Sugerido de implementacion de __GetXpVersion
//
//__declspec(dllexport) ULONG __GetXpVersion()
//{
//volver ODS_VERSION
//}
//////////////////////////////////////////////////////////////////
aplicacion
const
& nbsp & nbsp sLibName = 'Opends60.DLL'

funcion srv_describe externo sLibName nombre de 'srv_describe'
funcion srv_setutype externo sLibName nombre de 'srv_setutype'
funcion srv_setcoldata externo sLibName nombre de 'srv_setcoldata'
funcion srv_setcollen externo sLibName nombre de 'srv_setcollen'
funcion srv_sendrow externo sLibName nombre de 'srv_sendrow'
funcion srv_senddone externo sLibName nombre de 'srv_senddone'
// Tratar con la ampliacion de los parametros de los procedimientos
funcion srv_rpcparams externo sLibName nombre de 'srv_rpcparams'
funcion srv_paraminfo externo sLibName nombre de 'srv_paraminfo'
funcion srv_paramsetoutput externo sLibName nombre de 'srv_paramsetoutput'
funcion srv_paramdata externo sLibName nombre de 'srv_paramdata'
funcion srv_paramlen externo sLibName nombre de 'srv_paramlen'
funcion srv_parammaxlen externo sLibName nombre de 'srv_parammaxlen'
funcion srv_paramtype externo sLibName nombre de 'srv_paramtype'
funcion srv_paramset externo sLibName nombre de 'srv_paramset'
funcion srv_paramname externo sLibName nombre de 'srv_paramname'
funcion srv_paramnumber externo sLibName nombre de 'srv_paramnumber'
// & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
// El resto de estas Api se admiten, en SQL Server 7.0,
// pero no puede ser admitido despues de SQL Server 7.0
funcion srv_getconfig externo sLibName nombre de 'srv_getconfig'
funcion srv_getserver externo sLibName nombre de 'srv_getserver'
funcion srv_got_attention externo sLibName nombre de 'srv_got_attention'
funcion srv_eventdata externo sLibName nombre de 'srv_eventdata'
// de Memoria
funcion srv_alloc externo sLibName nombre de 'srv_alloc'
funcion srv_bmove externo sLibName nombre de 'srv_bmove'
funcion srv_bzero externo sLibName nombre de 'srv_bzero'
funcion srv_free externo sLibName nombre de 'srv_free'
funcion srv_config_fn externo sLibName nombre de 'srv_config'
funcion srv_config_alloc externo sLibName nombre de 'srv_config_alloc'
funcion srv_convert externo sLibName nombre de 'srv_convert'
funcion srv_event_fn externo sLibName nombre de 'srv_event'
funcion srv_getuserdata externo sLibName nombre de 'srv_getuserdata'
funcion srv_getbindtoken externo sLibName nombre de 'srv_getbindtoken'
funcion srv_getdtcxact externo sLibName nombre de 'srv_getdtcxact'
funcion srv_handle externo sLibName nombre de 'srv_handle'
funcion srv_impersonate_client externo sLibName nombre de 'srv_impersonate_client'
funcion srv_init externo sLibName nombre de 'srv_init'
funcion srv_iodead externo sLibName nombre de 'srv_iodead'
funcion srv_langcpy

Los procedimientos almacenados extendidos con delphi

Los procedimientos almacenados extendidos con delphi : Multi-millones de consejos para hacer su vida más fácil.
Recommander aux amis
  • gplus
  • pinterest

Comentario

Dejar un comentario

Clasificación