Les procédures stockées étendues avec delphi
Avez-vous déjà essayé de créer une procédure stockée sur un Serveur SQL?
Que faire si la fonctionnalité que vous souhaitez intégrer n'est pas à l'intérieur du SQL, mais dans votre projet Delphi? Microsoft fournit des ODS (Open Data Services), qui est une API pour vous aider à créer une telle fonctionnalité en ajoutant DLL à votre Serveur SQL server qui contient les Procédures Stockées Étendues.
C'est comment vous le faites....
Comme un bonus spécial, cet article est aussi une solution simple pour le cryptage de vos données à l'intérieur de SQL Server à l'aide de Procédures Stockées Étendues.
de Quoi avons-nous besoin?
1) opends60.dll (à partir d'une installation complète avec les outils de développement de MSSQL ou MSDE)
2) MsOdsApi.pas-AUTEUR: Leonid ' MC ' de Belousov (www.bramc.ru/soft/) en-Tête de fichier à utiliser opends60.dll) (inclus à la fin de l'article)
3) Un Serveur SQL Local pour les tests (MSDE fera l'affaire).
NOTE: Pour la cryptographie j'ai utilisé les composants trouvés sous licence MIT ici:
http://www.cityinthesky.co.uk/cryptography.html
Mesures:
1) Créer une nouvelle DLL.
2) Créer une unité et dans la clause uses ajouter le MsOdsApi unité.
3) Dans le fichier de la Bibliothèque juste sous ther Utilise la clause ajouter les Exportations et les noms des fonctions à l'exportation:
bibliothèque MyEncryptDll
& nbsp & nbsp SysUtils,
& nbsp & nbsp Classes,
& nbsp & nbsp Unit1 dans ' Unit1.pas'
les exportations
& nbsp & nbsp xp_DoEncrypt,
& nbsp & nbsp xp_DoDecrypt
begin
à la fin.
4) Dans le fichier Unité seulement en vertu de la clause uses ajouter votre référence de fonction:
fonction de xp_DoEncrypt(pSrvProc: SRV_PROC): Integer cdecl
fonction de xp_DoDecrypt(pSrvProc: SRV_PROC): Integer cdecl
REMARQUES: cdecl est nécessaire pour ODS pour être en mesure d'appeler tes fonctions.
& ! & ! & ! & ! & ! & ! & nbsp SRV_PROC est un handle de la procédure stockée l'information.
5) Le code de la DoEncrypt est ceci:
Basé sur le code source par Leonid ' MC ' de Belousov (www.bramc.ru/soft/)
(DoDecrypt est exactement le même, avec juste un DecryptString(s) d'appel.
fonction de xp_Encrypt(pSrvProc: SRV_PROC): Integer cdecl
var
& nbsp & nbsp j', sz: Integer
& nbsp & nbsp bfigure: Octet
& nbsp & nbsp fNull: Bool
& nbsp & nbsp cbMaxLen, cbActualLen: ULONG
& nbsp & nbsp myData,myanswer,maclé:array [0..255] de char
& nbsp & nbsp FDCP_3des: TDCP_3des
& nbsp & nbsp s:string
& nbsp & nbsp ps:pchar
begin
& nbsp & nbsp for i:=0 à 255 ne
& ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & nbsp myData[i]:=#0
& ! & ! & ! & ! & ! & nbsp myanswer[i]:=#0
& ! & ! & ! & ! & ! & nbsp maclé[i]:=#0
& ! & ! & ! & nbsp fin
& nbsp & nbsp si srv_rpcparams(pSrvProc) = 2 alors // Vérifier si les paramètres d'entrée sont présents...
& ! & ! & ! & nbsp commencer
& ! & ! & ! & nbsp srv_paraminfo(pSrvProc, 1, @bfigure, // nous allons utiliser le 1er paramètre d'entrée!
& ! & ! & ! & ! & ! & ! & nbsp @cbMaxLen, @cbActualLen, // REMARQUE: Nous supposons ici que seulement 2 paramètres
& ! & ! & ! & ! & ! & ! & nbsp @myData[0], @fNull) //de type Chaîne de caractères peut être passé!!!
& ! & ! & ! & nbsp bfigure:=SRVVARCHAR
& ! & ! & ! & nbsp srv_paraminfo(pSrvProc, 2, @bfigure,
& ! & ! & ! & ! & ! & ! & nbsp @cbMaxLen, @cbActualLen,
& ! & ! & ! & ! & ! & ! & nbsp @maclé[0], @fNull)
& ! & ! & ! & nbsp fin
& nbsp & nbsp else
& ! & ! & ! & nbsp MyData := ' // Pas de paramètres d'entrée? Utiliser la valeur par défaut à la place.
& nbsp & nbsp //CODE de CRYPTAGE ci-DESSOUS, VOUS POUVEZ FAIRE ce que VOUS avez BESOIN ICI AVEC LES VALEURS de PARAMÈTRE
& nbsp & nbsp FDCP_3des:=TDCP_3des.Create(nil)
& nbsp & nbsp FDCP_3des.La taille de bloc:=64
& nbsp & nbsp FDCP_3des.Algorithme:='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:=chaîne de caractères(mydata)
& nbsp & nbsp strpcopy(myAnswer,FDCP_3des.EncryptString(s))
& nbsp & nbsp FDCP_3des.Graver
& nbsp & nbsp // RÉPONDRE VALEURS DE PCHAR ET à la TAILLE
& nbsp & nbsp s:=chaîne de caractères(myAnswer)
& nbsp & nbsp sz:=longueur(s)
& nbsp & nbsp ps:=allocmem(sz)
& nbsp & nbsp ps:=pchar(s)
& nbsp & nbsp // Décrire les colonnes
& nbsp & nbsp // (en Fait, vous faites que pour chaque type de données et chaque colonne que vous souhaitez retourner).
& nbsp & nbsp srv_describe(pSrvProc,1 , 'Valeur', SRV_NULLTERM,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp SRVVARCHAR, sz,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp SRVVARCHAR, sz, nil)
& ! & ! & ! & nbsp // début de la sortie...
& nbsp & nbsp srv_setcoldata(pSrvProc, 1, @p[0])
& nbsp & nbsp srv_sendrow(pSrvProc) // Envoyer la ligne.
// Laisser revenir paramètre de sortie (juste pour l'exemple).
& nbsp & nbsp srv_senddone(pSrvProc, // Enfin envoyer des données au Serveur SQL server:
& ! & ! & ! & nbsp (SRV_DONE_COUNT ou SRV_DONE_MORE), 0, 1) // envoyer les résultats à l'achèvement du message.
& nbsp & nbsp // libération de CHIFFREMENT COMPOSANT
& nbsp & nbsp FreeAndNil(FDCP_3des)
& nbsp & nbsp résultat := 1 // Rapport de réussite (1 = RÉUSSIR, 0 = NON)
fin
REMARQUE: Il existe un certain nombre de choses que vous pouvez faire avec ODS. C'est juste un exemple pour Delphi. Vous pouvez lire l'ODS aider dans MSDN et faire encore plus.
6) de Test et de Débogage: (Source Leonid ' MC ' de Belousov (www.bramc.ru/soft/))
A) l'Installation de SQL 7.0/2000 sur votre poste de travail (ou d'installer Delphi sur poste de travail sur lequel SQL Server est installé).
B) Enregistrer votre Xp sur SQL Server.
& nbsp & nbsp & nbsp REMARQUES:
& nbsp & nbsp & nbsp Registre Xp comme ceci:
& ! & ! & ! & ! & nbsp utiliser master
& ! & ! & ! & ! & nbsp aller
& ! & ! & ! & ! & nbsp sp_addextendedproc 'xp_DoEncrypt', 'MyEncryptDll.dll'
& ! & ! & ! & ! & nbsp aller
& ! & ! & ! & ! & nbsp sp_addextendedproc 'xp_DoDecrypt', 'MyEncryptDll.dll'
& ! & ! & ! & ! & nbsp aller
& nbsp & nbsp & nbsp annuler l'inscription d'Xp comme ceci:
& ! & ! & ! & ! & nbsp utiliser master
& ! & ! & ! & ! & nbsp aller
& ! & ! & ! & ! & nbsp sp_dropextendedproc 'xp_DoEncrypt'
& ! & ! & ! & ! & nbsp aller
& ! & ! & ! & ! & nbsp sp_dropextendedproc 'xp_DoDecrypt'
& ! & ! & ! & ! & nbsp aller
& nbsp & nbsp & nbsp Déverrouiller DLL dans le cas où il encore utilisé par SQL comme ceci:
& ! & ! & ! & ! & nbsp utiliser master
& ! & ! & ! & ! & nbsp aller
& ! & ! & ! & ! & nbsp DBCC MyEncryptDll(GRATUIT)
& ! & ! & ! & ! & nbsp aller
C) En Delphi, sélectionnez à partir du menu principal Exécuter -> Paramètres de course.
Dans l'Application Hôte, spécifiez un chemin d'accès à votre Serveur SQL server exécutable (sqlservr.exe). Pour SQL 7.0, c'est assez. Pour SQL 2000, dans le champ Paramètres de spécifier un paramètre de ligne de commande '-sYOUR_SQL_NAME', où YOUR_SQL_NAME est le nom attribué à votre Serveur SQL server lors de l'installation.
Définir des points d'arrêt dans votre code Delphi et l'exécution du projet. SQL Server démarre comme une application console.
D) Vous pouvez exécuter votre Xp à partir de l'Analyseur de Requêtes et de retracer le code en Delphi.
& nbsp & nbsp & nbsp NOTE:
& nbsp & nbsp & nbsp Exécution d'une procédure stockée étendue est fait comme ceci:
& nbsp & nbsp & nbsp exec maître..xp_DoEncrypt 'ValueToEncrypt','KeyValue'
& nbsp & nbsp & nbsp aller
E) Pour quitter l'application, appuyez sur Ctrl Pause dans le SQL Server fenêtre de la console.
& & & & & & & & & & & & & & & & & & & & & & & & & & & -
à la Fin de l'article. Soufflet suit une unité nécessaire pour ODS.
& & & & & & & & & & & & & & & & & & & & & & & & & & & -
MsOdsApi.pas (Copie de la ligne ci-dessous)
{
& nbsp & nbsp - Master Cluster de la Bibliothèque de l' -
& nbsp & nbsp Copyright © 1996-2002 Leonid Belousov (aka Master Cluster)
& nbsp & nbsp mailto: [email protected]
& nbsp nbsp & www.bramc.ru/soft/
& nbsp & nbsp - Description: traduction de la C-les en-têtes de Microsoft API Open Data Services
}
unité de MsOdsApi
// & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
// Ouverture des Services de Données de fichier d'en-tête: srv.h
// le droit d'Auteur (c) 1989, 1990, 1991, 1997 par Microsoft.
//
// Éviter la double inclusion
//#ifndef _ODS_SRV_H_
// _ODS_SRV_H_
//#include 'windows.h'
// ODS utilise(pack de 4) sur tous les types de PROCESSEUR
//#pragma pack(4)
//#ifdef __cplusplus
//extern 'C' {
//#endif
// définir un modèle
//#si !défini( de LOIN )
// loin, LOIN,
//#endif
// & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
// les Formats de types de données
//#si !défini(DBTYPEDEFS) // N'entrent pas en conflit avec DBLIB définitions
//#si !défini(MAXNUMERICLEN) // Ne pas entrer en conflit avec ODBC définitions
// DBTYPEDEFS
interface
& nbsp & nbsp Windows
type
& nbsp & nbsp DBBOOL = Octet
& nbsp & nbsp DBBYTE = Octet
& nbsp & nbsp DBTINYINT = Octet
& nbsp & nbsp DBSMALLINT = Smallint
& nbsp & nbsp DBUSMALLINT = Mot
& nbsp & nbsp DBINT = Longint
& nbsp & nbsp DBCHAR = Char
& nbsp & nbsp PDBCHAR = ^DBCHAR
& nbsp & nbsp DBBINARY = Octet
& nbsp & nbsp DBBIT = Octet
& nbsp & nbsp DBFLT8 = Double
& nbsp & nbsp srv_datetime = enregistrement
& ! & ! & ! & nbsp // Format de SRVDATETIME
& ! & ! & nbsp & nbsp dtdays: Longint // nombre de jours depuis le 1/1/1900
& ! & ! & ! & nbsp dttime: Longword // numéro de la 300ème de seconde depuis la mi
& nbsp & nbsp fin
& nbsp & nbsp DBDATETIME = srv_datetime
& nbsp & nbsp srv_dbdatetime4 = enregistrement
& ! & ! & ! & nbsp // Format de SRVDATETIM4
& ! & ! & ! & nbsp numdays: Mot // nombre de jours depuis le 1/1/1900
& ! & ! & ! & nbsp nummins: Mot // nombre de minutes comme minuit
& nbsp & nbsp fin
& nbsp & nbsp DBDATETIM4 = srv_dbdatetime4
& nbsp & nbsp srv_money = enregistrement
& ! & ! & ! & nbsp // Format de SRVMONEY
& ! & ! & ! & nbsp mnyhigh: Longint
& ! & ! & ! & nbsp mnylow : Longword
& nbsp & nbsp fin
& nbsp & nbsp DBMONEY = srv_money
& nbsp & nbsp DBFLT4 = Double
& nbsp & nbsp DBMONEY4 = Longint
const
& nbsp & nbsp MAXNUMERICDIG = 38
& nbsp & nbsp DEFAULTPRECISION = 19 // 18
& nbsp & nbsp DEFAULTSCALE = 0
& nbsp & nbsp MAXNUMERICLEN = 16
type
& nbsp & nbsp srv_dbnumeric = paniers enregistrement
& ! & ! & ! & nbsp // Format de SRVNUMERIC,SRVNUMERICN,SRVDECIMAL,SRVDECIMALN
& ! & ! & ! & nbsp précision: Octet
& ! & ! & ! & nbsp échelle : Octet
& ! & ! & ! & nbsp signe : Byte // 1 = Positif, 0 = Négatif
& ! & ! & ! & nbsp val : array [0..MAXNUMERICLEN-1] of Byte // Collier little-endian valeur
& nbsp & nbsp fin
& nbsp & nbsp structure dbnumeric = srv_dbnumeric
& nbsp & nbsp DBDECIMAL = structure dbnumeric
//#endif // #si !défini(MAXNUMERICLEN)
//#endif // #si !défini( DBTYPEDEFS )
// & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
// les Constantes utilisées par les Api
// Jetons de Type
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 et plus tard
& 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
// les Types de données
// Aussi: les valeurs de paramètre de symbole de srv_symbol quand le 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 et plus tard
& 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
// les valeurs de srv_symbol paramètre de type
& nbsp SRV_ERROR = 0
& nbsp SRV_DONE = 1
& nbsp SRV_DATATYPE = 2
& nbsp SRV_EVENT = 4
// les valeurs de srv_symbol symbole de paramètre, quand le type = 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
// les Types d'événements du serveur
// Aussi: les valeurs pour srv_symbol symbole de paramètre, quand le type = 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 type de TDS 7 clients. Surchargé avec 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
// les valeurs de srv_config option paramètre
& 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 pour srv_config valeur de paramètre lors de l'option = SRV_THREADPRIORITY
& nbsp & nbsp SRV_PRIORITY_LOW = NIVEAU
& 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
// les valeurs de srv_sfield champ de paramètre
& nbsp & nbsp SRV_SERVERNAME = 0
& nbsp & nbsp SRV_VERSION = 6
// la Longueur d'indiquer chaîne est null
& nbsp & nbsp SRV_NULLTERM = -1
// les valeurs de msgtype paramètre srv_sendmsg
& nbsp & nbsp SRV_MSG_INFO = 1
& nbsp & nbsp SRV_MSG_ERROR = 2
// les valeurs de paramètre d'état à srv_senddone
// Aussi: les valeurs de symbole de paramètres à srv_symbol quand le 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
// les valeurs de retour de srv_paramstatus
& nbsp & nbsp SRV_PARAMRETURN = $0001
& nbsp & nbsp SRV_PARAMDEFAULT = $0002
// les valeurs de retour de srv_rpcoptions
& nbsp & nbsp SRV_RECOMPILE = $0001
& nbsp & nbsp SRV_NOMETADATA = $0002
// les valeurs de paramètre de champ à srv_pfield
// SRV_LANGUAGE 1 déjà défini ci-dessus
// SRV_EVENT 4 déjà défini ci-dessus
& 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
// valeur de retour 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
// les valeurs de Retour de Api
type
& nbsp SRVRETCODE = Integer // RÉUSSIR ou ÉCHOUER
& nbsp RETCODE = Integer
const
& nbsp & nbsp RÉUSSIR = 1 // Succès de la valeur de retour
& nbsp & nbsp FAIL = 0 // Échec de valeur de retour
& nbsp & nbsp SRV_DUPLICATE_HANDLER= 2 // retour supplémentaire de la valeur pour srv_pre/post_handle
// & & & & & & & & & & & & & & & & & & & & & & & &
//PreDeclare structures
//
{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 }
type
& nbsp & nbsp SRV_SERVER = Pointeur
& nbsp & nbsp SRV_CONFIG = Pointeur
& nbsp & nbsp SRV_PROC = Pointeur
// & & & & & & & & & & & & & & & & & & & & & & & &
// & & & & & & & & & & & & & & & & & & & & & & & &
// ODS MACROs & Api
// description et l'envoi d'un jeu de résultats
fonction de srv_describe(srvproc: SRV_PROC
& nbsp & nbsp colnumber: Integer column_name: PCHAR namelen: Integer
& nbsp & nbsp desttype, destlen, srctype, srclen: Integer srcData: Pointeur
): Integer cdecl
fonction de srv_setutype(srvproc: SRV_PROC colonne: Integer usertype: Longint): Integer cdecl
fonction de srv_setcoldata(srvproc: SRV_PROC colonne: données Integer: Pointeur): Integer cdecl
fonction de srv_setcollen(srvproc: SRV_PROC colonne, len: Integer): Integer cdecl
fonction de srv_sendrow(srvproc: SRV_PROC): Integer cdecl
fonction de srv_senddone(srvproc: SRV_PROC état, curcmd: Word count: Longint): Integer cdecl
// Traiter avec extension de la Procédure de paramètres
fonction de srv_rpcparams(srvproc: SRV_PROC): Integer cdecl
fonction de srv_paraminfo(srvproc: SRV_PROC n: Integer pbType: PByte
& nbsp & nbsp pcbMaxLen, pcbActualLen: PULONG pbData: PByte pfNull: PBOOL): Integer cdecl
fonction de srv_paramsetoutput(srvproc: SRV_PROC
& nbsp & nbsp n: Integer pbData: PByte cbLen: ULONG fNull: BOOL): Integer cdecl
fonction de srv_paramdata(srvproc: SRV_PROC n: Entier): Pointeur cdecl
fonction de srv_paramlen(srvproc: SRV_PROC n: Integer): Integer cdecl
fonction de srv_parammaxlen(srvproc: SRV_PROC n: Integer): Integer cdecl
fonction de srv_paramtype(srvproc: SRV_PROC n: Entier): Entier cdecl
fonction de srv_paramset(srvproc: SRV_PROC n: Integer données: Pointeur int: Entier): Entier cdecl
fonction de srv_paramname(srvproc: SRV_PROC n: Entier var len: Integer): PChar cdecl
fonction de srv_paramnumber(srvproc: SRV_PROC nom: PChar namelen: Integer): Integer cdecl
// & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
// & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
// Le reste de ces Api sont toujours pris en charge dans SQL Server 7.0,
// mais ne peuvent pas être pris en charge, après SQL Server 7.0
// MACROs
{ SRV_GETCONFIG(a)srv_getconfig ( a )
& nbsp & nbsp SRV_GETSERVER(a)srv_getserver ( un )
& nbsp & nbsp SRV_GOT_ATTENTION(a)srv_got_attention ( un )
SRV_EVENTDATA(a)srv_eventdata ( un )
SRV_IODEAD(a)srv_iodead ( un )
SRV_TDSVERSION(a)srv_tdsversion ( a )}
fonction de srv_getconfig(serveur: SRV_SERVER): SRV_CONFIG cdecl
fonction de srv_getserver(srvproc: SRV_PROC): SRV_SERVER cdecl
fonction de srv_got_attention(srvproc: SRV_PROC): Bool cdecl
fonction de srv_eventdata(srvproc: SRV_PROC): Pointeur cdecl
// la Mémoire
fonction de srv_alloc(ulSize: Longint): Pointeur cdecl
fonction de srv_bmove(à partir de: Pointeur de la prise de force: Pointeur count: Longint): Integer cdecl
fonction de srv_bzero(localisation: Pointeur count: Longint): Integer cdecl
fonction de srv_free(ptr: Pointeur): Entier cdecl
fonction de srv_config_fn(config: SRV_CONFIG option: Longint valeur: PChar valuelen: Integer): Integer cdecl
fonction de srv_config_alloc: SRV_CONFIG cdecl
fonction de srv_convert(srvproc: SRV_PROC srctype: Integer src: Pointeur srclen: DBINT
& nbsp & nbsp desttype: Integer dest: Pointeur destlen: DBINT): Integer cdecl
{
int (* srv_errhandle(int (* handler)(SRV_SERVER * serveur,
SRV_PROC * srvproc,
int srverror,
OCTET de gravité,
OCTET d'état,
int oserrnum,
char * errtext,
int errtextlen,
char * oserrtext,
int oserrtextlen)))
& nbsp & nbsp & nbsp ( SRV_SERVER * serveur,
SRV_PROC * srvproc,
int srverror,
OCTET de gravité,
OCTET d'état,
int oserrnum,
char * errtext,
int errtextlen,
char * oserrtext,
int oserrtextlen )
}
fonction de srv_event_fn(srvproc: SRV_PROC événement: données Integer: PByte): Integer cdecl
fonction de srv_getuserdata(srvproc: SRV_PROC): Pointeur cdecl
fonction de srv_getbindtoken(srvproc: SRV_PROC token_buf: PChar): Integer cdecl
fonction de srv_getdtcxact(srvproc: SRV_PROC ppv: Pointeur): Integer cdecl
//typedef int (* Gestionnaire d'événements)(void*)
type
& nbsp & nbsp Gestionnaire = Pointeur
fonction de srv_handle(serveur: SRV_SERVER int: Longint gestionnaire: le Gestionnaire d'événements): Événement andler cdecl
fonction de srv_impersonate_client(srvproc: SRV_PROC): Integer cdecl
fonction de srv_init(config: SRV_CONFIG connectname: PChar namelen: Integer): SRV_SERVER cdecl
fonction de srv_iodead(srvproc: SRV_PROC): Bool cdecl
fonction de srv_langcpy(srvproc: SRV_PROC démarrer, nbytes: Longint tampon: PChar): Longint cdecl
fonction de srv_langlen(srvproc: SRV_PROC): Longint cdecl
fonction de srv_langptr(srvproc: SRV_PROC): Pointeur cdecl
fonction de srv_log(serveur: SRV_SERVER datestamp: Bool msg: PChar msglen: Integer): Integer cdecl
fonction de srv_paramstatus(srvproc: SRV_PROC n: Integer): Integer cdecl
fonction de srv_pfield(srvproc: SRV_PROC champ: Integer len: PInteger): PChar cdecl
fonction de srv_returnval(srvproc: SRV_PROC value_name: PDBCHAR len: Integer statut: Octet
& nbsp & nbsp iType, maxlen, variable 'datalen' contient: DBINT valeur: PByte): Integer cdecl
fonction de srv_revert_to_self(srvproc: SRV_PROC): Integer cdecl
fonction de srv_rpcdb(srvproc: SRV_PROC len: PInteger): PChar cdecl
fonction de srv_rpcname(srvproc: SRV_PROC len: PInteger): PChar cdecl
fonction de srv_rpcnumber(srvproc: SRV_PROC): Integer cdecl
fonction de srv_rpcoptions(srvproc: SRV_PROC): Mot cdecl
fonction de srv_rpcowner(srvproc: SRV_PROC len: PInteger): PChar cdecl
fonction de srv_run(serveur: SRV_SERVER): Integer cdecl
fonction de srv_sendmsg(srvproc: SRV_PROC
& nbsp & nbsp msgtype: Integer msgnum: DBINT msgClass, etat: DBTINYINT
& nbsp & nbsp rpcname: PChar rpcnamelen: Integer
& nbsp & nbsp numligne: Word msg: PChar msglen: Integer): Integer cdecl
fonction de srv_ansi_sendmsg(srvproc: SRV_PROC
& nbsp & nbsp msgtype: Entier msgnum: DBINT msgClass, etat: DBTINYINT
& nbsp & nbsp rpcname: PChar rpcnamelen: Integer
& nbsp & nbsp numligne: Word msg: PChar msglen: Integer): Integer cdecl
fonction de srv_sendstatus(srvproc: SRV_PROC statut: Longint): Integer cdecl
fonction de srv_setuserdata(srvproc: SRV_PROC ptr: Pointeur): Integer cdecl
fonction de srv_sfield(serveur: SRV_SERVER champ: Integer len: PInteger): PChar cdecl
fonction de srv_symbol(iType, symbole: Integer len: PInteger): PChar cdecl
fonction de srv_tdsversion(srvproc: SRV_PROC): Integer cdecl
fonction de srv_writebuf(srvproc: SRV_PROC ptr: Pointeur count: Word): Integer cdecl
fonction de srv_willconvert(srctype, desttype: Entier): Booléen cdecl
procédure srv_ackattention(srvproc: SRV_PROC) cdecl
fonction de srv_terminatethread(srvproc: SRV_PROC): Entier cdecl
fonction de srv_sendstatistics(srvproc: SRV_PROC): Integer cdecl
fonction de srv_clearstatistics(srvproc: SRV_PROC): Integer cdecl
fonction de srv_setevent(serveur: SRV_SERVER événement: Integer): Integer cdecl
fonction de srv_message_handler(srvproc: SRV_PROC
& nbsp & nbsp errornum: Integer gravité, l'état: Octet oserrnum: Integer errtext: PChar
& nbsp & nbsp errtextlen: Integer oserrtext: PChar oserrtextlen: Integer): Entier cdecl
fonction de srv_pre_handle(serveur: SRV_SERVER srvproc: SRV_PROC
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp événement: Longint gestionnaire: le Gestionnaire d'événements supprimer: Bool): Integer cdecl
fonction de srv_post_handle(serveur: SRV_SERVER srvproc: SRV_PROC
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp événement: Longint gestionnaire: le Gestionnaire d'événements supprimer: Bool): Integer cdecl
fonction de srv_post_completion_queue(srvproc: SRV_PROC inbuf: PChar inbuflen: PChar): Integer cdecl
fonction de srv_IgnoreAnsiToOem(srvproc: SRV_PROC bTF: BOOL): Entier 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) ou (SS_MINOR_VERSION shl 16))
//#endif //_ODS_SRV_H_
//////////////////////////////////////////////////////////////////
// a Suggéré la mise en œuvre de l' __GetXpVersion
//
//__declspec(dllexport) ULONG __GetXpVersion()
//{
//retourne ODS_VERSION
//}
//////////////////////////////////////////////////////////////////
application
const
& nbsp & nbsp sLibName = 'Opends60.DLL'
fonction de srv_describe externe sLibName nom 'srv_describe'
fonction de srv_setutype externe sLibName nom 'srv_setutype'
fonction de srv_setcoldata externe sLibName nom 'srv_setcoldata'
fonction de srv_setcollen externe sLibName nom 'srv_setcollen'
fonction de srv_sendrow externe sLibName nom 'srv_sendrow'
fonction de srv_senddone externe sLibName nom 'srv_senddone'
// Traiter avec extension de la Procédure de paramètres
fonction de srv_rpcparams externe sLibName nom 'srv_rpcparams'
fonction de srv_paraminfo externe sLibName nom 'srv_paraminfo'
fonction de srv_paramsetoutput externe sLibName nom 'srv_paramsetoutput'
fonction de srv_paramdata externe sLibName nom 'srv_paramdata'
fonction de srv_paramlen externe sLibName nom 'srv_paramlen'
fonction de srv_parammaxlen externe sLibName nom 'srv_parammaxlen'
fonction de srv_paramtype externe sLibName nom 'srv_paramtype'
fonction srv_paramset externe sLibName nom 'srv_paramset'
fonction de srv_paramname externe sLibName nom 'srv_paramname'
fonction de srv_paramnumber externe sLibName nom 'srv_paramnumber'
// & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
// Le reste de ces Api sont toujours pris en charge dans SQL Server 7.0,
// mais ne peuvent pas être pris en charge, après SQL Server 7.0
fonction de srv_getconfig externe sLibName nom 'srv_getconfig'
fonction de srv_getserver externe sLibName nom 'srv_getserver'
fonction de srv_got_attention externe sLibName nom 'srv_got_attention'
fonction de srv_eventdata externe sLibName nom 'srv_eventdata'
// la Mémoire
fonction de srv_alloc externe sLibName nom 'srv_alloc'
fonction de srv_bmove externe sLibName nom 'srv_bmove'
fonction srv_bzero externe sLibName nom 'srv_bzero'
fonction de srv_free externe sLibName nom 'srv_free'
fonction de srv_config_fn externe sLibName nom 'srv_config'
fonction de srv_config_alloc externe sLibName nom 'srv_config_alloc'
fonction de srv_convert externe sLibName nom 'srv_convert'
fonction de srv_event_fn externe sLibName nom 'srv_event'
fonction de srv_getuserdata externe sLibName nom 'srv_getuserdata'
fonction de srv_getbindtoken externe sLibName nom 'srv_getbindtoken'
fonction srv_getdtcxact externe sLibName nom 'srv_getdtcxact'
fonction de srv_handle externe sLibName nom 'srv_handle'
fonction de srv_impersonate_client externe sLibName nom 'srv_impersonate_client'
fonction de srv_init externe sLibName nom 'srv_init'
fonction de srv_iodead externe sLibName nom 'srv_iodead'
fonction de srv_langcpy
Les procedures stockees etendues avec delphi
Les procedures stockees etendues avec delphi : Plusieurs milliers de conseils pour vous faciliter la vie.
Avez-vous deja essaye de creer une procedure stockee sur un Serveur SQL?
Que faire si la fonctionnalite que vous souhaitez integrer n'est pas a l'interieur du SQL, mais dans votre projet Delphi? Microsoft fournit des ODS (Open Data Services), qui est une API pour vous aider a creer une telle fonctionnalite en ajoutant DLL a votre Serveur SQL server qui contient les Procedures Stockees Etendues.
C'est comment vous le faites....
Comme un bonus special, cet article est aussi une solution simple pour le cryptage de vos donnees a l'interieur de SQL Server a l'aide de Procedures Stockees Etendues.
de Quoi avons-nous besoin?
1) opends60.dll (a partir d'une installation complete avec les outils de developpement de MSSQL ou MSDE)
2) MsOdsApi.pas-AUTEUR: Leonid ' MC ' de Belousov (www.bramc.ru/soft/) en-Tete de fichier a utiliser opends60.dll) (inclus a la fin de l'article)
3) Un Serveur SQL Local pour les tests (MSDE fera l'affaire).
NOTE: Pour la cryptographie j'ai utilise les composants trouves sous licence MIT ici:
http://www.cityinthesky.co.uk/cryptography.html
Mesures:
1) Creer une nouvelle DLL.
2) Creer une unite et dans la clause uses ajouter le MsOdsApi unite.
3) Dans le fichier de la Bibliotheque juste sous ther Utilise la clause ajouter les Exportations et les noms des fonctions a l'exportation:
bibliotheque MyEncryptDll
& nbsp & nbsp SysUtils,
& nbsp & nbsp Classes,
& nbsp & nbsp Unit1 dans ' Unit1.pas'
les exportations
& nbsp & nbsp xp_DoEncrypt,
& nbsp & nbsp xp_DoDecrypt
begin
a la fin.
4) Dans le fichier Unite seulement en vertu de la clause uses ajouter votre reference de fonction:
fonction de xp_DoEncrypt(pSrvProc: SRV_PROC): Integer cdecl
fonction de xp_DoDecrypt(pSrvProc: SRV_PROC): Integer cdecl
REMARQUES: cdecl est necessaire pour ODS pour etre en mesure d'appeler tes fonctions.
& ! & ! & ! & ! & ! & ! & nbsp SRV_PROC est un handle de la procedure stockee l'information.
5) Le code de la DoEncrypt est ceci:
Base sur le code source par Leonid ' MC ' de Belousov (www.bramc.ru/soft/)
(DoDecrypt est exactement le meme, avec juste un DecryptString(s) d'appel.
fonction de xp_Encrypt(pSrvProc: SRV_PROC): Integer cdecl
var
& nbsp & nbsp j', sz: Integer
& nbsp & nbsp bfigure: Octet
& nbsp & nbsp fNull: Bool
& nbsp & nbsp cbMaxLen, cbActualLen: ULONG
& nbsp & nbsp myData,myanswer,macle:array [0..255] de char
& nbsp & nbsp FDCP_3des: TDCP_3des
& nbsp & nbsp s:string
& nbsp & nbsp ps:pchar
begin
& nbsp & nbsp for i:=0 a 255 ne
& ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & nbsp myData[i]:=#0
& ! & ! & ! & ! & ! & nbsp myanswer[i]:=#0
& ! & ! & ! & ! & ! & nbsp macle[i]:=#0
& ! & ! & ! & nbsp fin
& nbsp & nbsp si srv_rpcparams(pSrvProc) = 2 alors // Verifier si les parametres d'entree sont presents...
& ! & ! & ! & nbsp commencer
& ! & ! & ! & nbsp srv_paraminfo(pSrvProc, 1, @bfigure, // nous allons utiliser le 1er parametre d'entree!
& ! & ! & ! & ! & ! & ! & nbsp @cbMaxLen, @cbActualLen, // REMARQUE: Nous supposons ici que seulement 2 parametres
& ! & ! & ! & ! & ! & ! & nbsp @myData[0], @fNull) //de type Chaîne de caracteres peut etre passe!!!
& ! & ! & ! & nbsp bfigure:=SRVVARCHAR
& ! & ! & ! & nbsp srv_paraminfo(pSrvProc, 2, @bfigure,
& ! & ! & ! & ! & ! & ! & nbsp @cbMaxLen, @cbActualLen,
& ! & ! & ! & ! & ! & ! & nbsp @macle[0], @fNull)
& ! & ! & ! & nbsp fin
& nbsp & nbsp else
& ! & ! & ! & nbsp MyData := ' // Pas de parametres d'entree? Utiliser la valeur par defaut a la place.
& nbsp & nbsp //CODE de CRYPTAGE ci-DESSOUS, VOUS POUVEZ FAIRE ce que VOUS avez BESOIN ICI AVEC LES VALEURS de PARAMETRE
& nbsp & nbsp FDCP_3des:=TDCP_3des.Create(nil)
& nbsp & nbsp FDCP_3des.La taille de bloc:=64
& nbsp & nbsp FDCP_3des.Algorithme:='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:=chaîne de caracteres(mydata)
& nbsp & nbsp strpcopy(myAnswer,FDCP_3des.EncryptString(s))
& nbsp & nbsp FDCP_3des.Graver
& nbsp & nbsp // REPONDRE VALEURS DE PCHAR ET a la TAILLE
& nbsp & nbsp s:=chaîne de caracteres(myAnswer)
& nbsp & nbsp sz:=longueur(s)
& nbsp & nbsp ps:=allocmem(sz)
& nbsp & nbsp ps:=pchar(s)
& nbsp & nbsp // Decrire les colonnes
& nbsp & nbsp // (en Fait, vous faites que pour chaque type de donnees et chaque colonne que vous souhaitez retourner).
& nbsp & nbsp srv_describe(pSrvProc,1 , 'Valeur', SRV_NULLTERM,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp SRVVARCHAR, sz,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp SRVVARCHAR, sz, nil)
& ! & ! & ! & nbsp // debut de la sortie...
& nbsp & nbsp srv_setcoldata(pSrvProc, 1, @p[0])
& nbsp & nbsp srv_sendrow(pSrvProc) // Envoyer la ligne.
// Laisser revenir parametre de sortie (juste pour l'exemple).
& nbsp & nbsp srv_senddone(pSrvProc, // Enfin envoyer des donnees au Serveur SQL server:
& ! & ! & ! & nbsp (SRV_DONE_COUNT ou SRV_DONE_MORE), 0, 1) // envoyer les resultats a l'achevement du message.
& nbsp & nbsp // liberation de CHIFFREMENT COMPOSANT
& nbsp & nbsp FreeAndNil(FDCP_3des)
& nbsp & nbsp resultat := 1 // Rapport de reussite (1 = REUSSIR, 0 = NON)
fin
REMARQUE: Il existe un certain nombre de choses que vous pouvez faire avec ODS. C'est juste un exemple pour Delphi. Vous pouvez lire l'ODS aider dans MSDN et faire encore plus.
6) de Test et de Debogage: (Source Leonid ' MC ' de Belousov (www.bramc.ru/soft/))
A) l'Installation de SQL 7.0/2000 sur votre poste de travail (ou d'installer Delphi sur poste de travail sur lequel SQL Server est installe).
B) Enregistrer votre Xp sur SQL Server.
& nbsp & nbsp & nbsp REMARQUES:
& nbsp & nbsp & nbsp Registre Xp comme ceci:
& ! & ! & ! & ! & nbsp utiliser master
& ! & ! & ! & ! & nbsp aller
& ! & ! & ! & ! & nbsp sp_addextendedproc 'xp_DoEncrypt', 'MyEncryptDll.dll'
& ! & ! & ! & ! & nbsp aller
& ! & ! & ! & ! & nbsp sp_addextendedproc 'xp_DoDecrypt', 'MyEncryptDll.dll'
& ! & ! & ! & ! & nbsp aller
& nbsp & nbsp & nbsp annuler l'inscription d'Xp comme ceci:
& ! & ! & ! & ! & nbsp utiliser master
& ! & ! & ! & ! & nbsp aller
& ! & ! & ! & ! & nbsp sp_dropextendedproc 'xp_DoEncrypt'
& ! & ! & ! & ! & nbsp aller
& ! & ! & ! & ! & nbsp sp_dropextendedproc 'xp_DoDecrypt'
& ! & ! & ! & ! & nbsp aller
& nbsp & nbsp & nbsp Deverrouiller DLL dans le cas ou il encore utilise par SQL comme ceci:
& ! & ! & ! & ! & nbsp utiliser master
& ! & ! & ! & ! & nbsp aller
& ! & ! & ! & ! & nbsp DBCC MyEncryptDll(GRATUIT)
& ! & ! & ! & ! & nbsp aller
C) En Delphi, selectionnez a partir du menu principal Executer -> Parametres de course.
Dans l'Application Hote, specifiez un chemin d'acces a votre Serveur SQL server executable (sqlservr.exe). Pour SQL 7.0, c'est assez. Pour SQL 2000, dans le champ Parametres de specifier un parametre de ligne de commande '-sYOUR_SQL_NAME', ou YOUR_SQL_NAME est le nom attribue a votre Serveur SQL server lors de l'installation.
Definir des points d'arret dans votre code Delphi et l'execution du projet. SQL Server demarre comme une application console.
D) Vous pouvez executer votre Xp a partir de l'Analyseur de Requetes et de retracer le code en Delphi.
& nbsp & nbsp & nbsp NOTE:
& nbsp & nbsp & nbsp Execution d'une procedure stockee etendue est fait comme ceci:
& nbsp & nbsp & nbsp exec maître..xp_DoEncrypt 'ValueToEncrypt','KeyValue'
& nbsp & nbsp & nbsp aller
E) Pour quitter l'application, appuyez sur Ctrl Pause dans le SQL Server fenetre de la console.
& & & & & & & & & & & & & & & & & & & & & & & & & & & -
a la Fin de l'article. Soufflet suit une unite necessaire pour ODS.
& & & & & & & & & & & & & & & & & & & & & & & & & & & -
MsOdsApi.pas (Copie de la ligne ci-dessous)
{
& nbsp & nbsp - Master Cluster de la Bibliotheque de l' -
& nbsp & nbsp Copyright © 1996-2002 Leonid Belousov (aka Master Cluster)
& nbsp & nbsp mailto: [email protected]
& nbsp nbsp & www.bramc.ru/soft/
& nbsp & nbsp - Description: traduction de la C-les en-tetes de Microsoft API Open Data Services
}
unite de MsOdsApi
// & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
// Ouverture des Services de Donnees de fichier d'en-tete: srv.h
// le droit d'Auteur (c) 1989, 1990, 1991, 1997 par Microsoft.
//
// Eviter la double inclusion
//#ifndef _ODS_SRV_H_
// _ODS_SRV_H_
//#include 'windows.h'
// ODS utilise(pack de 4) sur tous les types de PROCESSEUR
//#pragma pack(4)
//#ifdef __cplusplus
//extern 'C' {
//#endif
// definir un modele
//#si !defini( de LOIN )
// loin, LOIN,
//#endif
// & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
// les Formats de types de donnees
//#si !defini(DBTYPEDEFS) // N'entrent pas en conflit avec DBLIB definitions
//#si !defini(MAXNUMERICLEN) // Ne pas entrer en conflit avec ODBC definitions
// DBTYPEDEFS
interface
& nbsp & nbsp Windows
type
& nbsp & nbsp DBBOOL = Octet
& nbsp & nbsp DBBYTE = Octet
& nbsp & nbsp DBTINYINT = Octet
& nbsp & nbsp DBSMALLINT = Smallint
& nbsp & nbsp DBUSMALLINT = Mot
& nbsp & nbsp DBINT = Longint
& nbsp & nbsp DBCHAR = Char
& nbsp & nbsp PDBCHAR = ^DBCHAR
& nbsp & nbsp DBBINARY = Octet
& nbsp & nbsp DBBIT = Octet
& nbsp & nbsp DBFLT8 = Double
& nbsp & nbsp srv_datetime = enregistrement
& ! & ! & ! & nbsp // Format de SRVDATETIME
& ! & ! & nbsp & nbsp dtdays: Longint // nombre de jours depuis le 1/1/1900
& ! & ! & ! & nbsp dttime: Longword // numero de la 300eme de seconde depuis la mi
& nbsp & nbsp fin
& nbsp & nbsp DBDATETIME = srv_datetime
& nbsp & nbsp srv_dbdatetime4 = enregistrement
& ! & ! & ! & nbsp // Format de SRVDATETIM4
& ! & ! & ! & nbsp numdays: Mot // nombre de jours depuis le 1/1/1900
& ! & ! & ! & nbsp nummins: Mot // nombre de minutes comme minuit
& nbsp & nbsp fin
& nbsp & nbsp DBDATETIM4 = srv_dbdatetime4
& nbsp & nbsp srv_money = enregistrement
& ! & ! & ! & nbsp // Format de SRVMONEY
& ! & ! & ! & nbsp mnyhigh: Longint
& ! & ! & ! & nbsp mnylow : Longword
& nbsp & nbsp fin
& nbsp & nbsp DBMONEY = srv_money
& nbsp & nbsp DBFLT4 = Double
& nbsp & nbsp DBMONEY4 = Longint
const
& nbsp & nbsp MAXNUMERICDIG = 38
& nbsp & nbsp DEFAULTPRECISION = 19 // 18
& nbsp & nbsp DEFAULTSCALE = 0
& nbsp & nbsp MAXNUMERICLEN = 16
type
& nbsp & nbsp srv_dbnumeric = paniers enregistrement
& ! & ! & ! & nbsp // Format de SRVNUMERIC,SRVNUMERICN,SRVDECIMAL,SRVDECIMALN
& ! & ! & ! & nbsp precision: Octet
& ! & ! & ! & nbsp echelle : Octet
& ! & ! & ! & nbsp signe : Byte // 1 = Positif, 0 = Negatif
& ! & ! & ! & nbsp val : array [0..MAXNUMERICLEN-1] of Byte // Collier little-endian valeur
& nbsp & nbsp fin
& nbsp & nbsp structure dbnumeric = srv_dbnumeric
& nbsp & nbsp DBDECIMAL = structure dbnumeric
//#endif // #si !defini(MAXNUMERICLEN)
//#endif // #si !defini( DBTYPEDEFS )
// & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
// les Constantes utilisees par les Api
// Jetons de Type
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 et plus tard
& 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
// les Types de donnees
// Aussi: les valeurs de parametre de symbole de srv_symbol quand le 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 et plus tard
& 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
// les valeurs de srv_symbol parametre de type
& nbsp SRV_ERROR = 0
& nbsp SRV_DONE = 1
& nbsp SRV_DATATYPE = 2
& nbsp SRV_EVENT = 4
// les valeurs de srv_symbol symbole de parametre, quand le type = 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
// les Types d'evenements du serveur
// Aussi: les valeurs pour srv_symbol symbole de parametre, quand le type = 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 type de TDS 7 clients. Surcharge avec 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
// les valeurs de srv_config option parametre
& 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 pour srv_config valeur de parametre lors de l'option = SRV_THREADPRIORITY
& nbsp & nbsp SRV_PRIORITY_LOW = NIVEAU
& 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
// les valeurs de srv_sfield champ de parametre
& nbsp & nbsp SRV_SERVERNAME = 0
& nbsp & nbsp SRV_VERSION = 6
// la Longueur d'indiquer chaîne est null
& nbsp & nbsp SRV_NULLTERM = -1
// les valeurs de msgtype parametre srv_sendmsg
& nbsp & nbsp SRV_MSG_INFO = 1
& nbsp & nbsp SRV_MSG_ERROR = 2
// les valeurs de parametre d'etat a srv_senddone
// Aussi: les valeurs de symbole de parametres a srv_symbol quand le 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
// les valeurs de retour de srv_paramstatus
& nbsp & nbsp SRV_PARAMRETURN = $0001
& nbsp & nbsp SRV_PARAMDEFAULT = $0002
// les valeurs de retour de srv_rpcoptions
& nbsp & nbsp SRV_RECOMPILE = $0001
& nbsp & nbsp SRV_NOMETADATA = $0002
// les valeurs de parametre de champ a srv_pfield
// SRV_LANGUAGE 1 deja defini ci-dessus
// SRV_EVENT 4 deja defini ci-dessus
& 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
// valeur de retour 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
// les valeurs de Retour de Api
type
& nbsp SRVRETCODE = Integer // REUSSIR ou ECHOUER
& nbsp RETCODE = Integer
const
& nbsp & nbsp REUSSIR = 1 // Succes de la valeur de retour
& nbsp & nbsp FAIL = 0 // Echec de valeur de retour
& nbsp & nbsp SRV_DUPLICATE_HANDLER= 2 // retour supplementaire de la valeur pour srv_pre/post_handle
// & & & & & & & & & & & & & & & & & & & & & & & &
//PreDeclare structures
//
{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 }
type
& nbsp & nbsp SRV_SERVER = Pointeur
& nbsp & nbsp SRV_CONFIG = Pointeur
& nbsp & nbsp SRV_PROC = Pointeur
// & & & & & & & & & & & & & & & & & & & & & & & &
// & & & & & & & & & & & & & & & & & & & & & & & &
// ODS MACROs & Api
// description et l'envoi d'un jeu de resultats
fonction de srv_describe(srvproc: SRV_PROC
& nbsp & nbsp colnumber: Integer column_name: PCHAR namelen: Integer
& nbsp & nbsp desttype, destlen, srctype, srclen: Integer srcData: Pointeur
): Integer cdecl
fonction de srv_setutype(srvproc: SRV_PROC colonne: Integer usertype: Longint): Integer cdecl
fonction de srv_setcoldata(srvproc: SRV_PROC colonne: donnees Integer: Pointeur): Integer cdecl
fonction de srv_setcollen(srvproc: SRV_PROC colonne, len: Integer): Integer cdecl
fonction de srv_sendrow(srvproc: SRV_PROC): Integer cdecl
fonction de srv_senddone(srvproc: SRV_PROC etat, curcmd: Word count: Longint): Integer cdecl
// Traiter avec extension de la Procedure de parametres
fonction de srv_rpcparams(srvproc: SRV_PROC): Integer cdecl
fonction de srv_paraminfo(srvproc: SRV_PROC n: Integer pbType: PByte
& nbsp & nbsp pcbMaxLen, pcbActualLen: PULONG pbData: PByte pfNull: PBOOL): Integer cdecl
fonction de srv_paramsetoutput(srvproc: SRV_PROC
& nbsp & nbsp n: Integer pbData: PByte cbLen: ULONG fNull: BOOL): Integer cdecl
fonction de srv_paramdata(srvproc: SRV_PROC n: Entier): Pointeur cdecl
fonction de srv_paramlen(srvproc: SRV_PROC n: Integer): Integer cdecl
fonction de srv_parammaxlen(srvproc: SRV_PROC n: Integer): Integer cdecl
fonction de srv_paramtype(srvproc: SRV_PROC n: Entier): Entier cdecl
fonction de srv_paramset(srvproc: SRV_PROC n: Integer donnees: Pointeur int: Entier): Entier cdecl
fonction de srv_paramname(srvproc: SRV_PROC n: Entier var len: Integer): PChar cdecl
fonction de srv_paramnumber(srvproc: SRV_PROC nom: PChar namelen: Integer): Integer cdecl
// & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
// & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
// Le reste de ces Api sont toujours pris en charge dans SQL Server 7.0,
// mais ne peuvent pas etre pris en charge, apres SQL Server 7.0
// MACROs
{ SRV_GETCONFIG(a)srv_getconfig ( a )
& nbsp & nbsp SRV_GETSERVER(a)srv_getserver ( un )
& nbsp & nbsp SRV_GOT_ATTENTION(a)srv_got_attention ( un )
SRV_EVENTDATA(a)srv_eventdata ( un )
SRV_IODEAD(a)srv_iodead ( un )
SRV_TDSVERSION(a)srv_tdsversion ( a )}
fonction de srv_getconfig(serveur: SRV_SERVER): SRV_CONFIG cdecl
fonction de srv_getserver(srvproc: SRV_PROC): SRV_SERVER cdecl
fonction de srv_got_attention(srvproc: SRV_PROC): Bool cdecl
fonction de srv_eventdata(srvproc: SRV_PROC): Pointeur cdecl
// la Memoire
fonction de srv_alloc(ulSize: Longint): Pointeur cdecl
fonction de srv_bmove(a partir de: Pointeur de la prise de force: Pointeur count: Longint): Integer cdecl
fonction de srv_bzero(localisation: Pointeur count: Longint): Integer cdecl
fonction de srv_free(ptr: Pointeur): Entier cdecl
fonction de srv_config_fn(config: SRV_CONFIG option: Longint valeur: PChar valuelen: Integer): Integer cdecl
fonction de srv_config_alloc: SRV_CONFIG cdecl
fonction de srv_convert(srvproc: SRV_PROC srctype: Integer src: Pointeur srclen: DBINT
& nbsp & nbsp desttype: Integer dest: Pointeur destlen: DBINT): Integer cdecl
{
int (* srv_errhandle(int (* handler)(SRV_SERVER * serveur,
SRV_PROC * srvproc,
int srverror,
OCTET de gravite,
OCTET d'etat,
int oserrnum,
char * errtext,
int errtextlen,
char * oserrtext,
int oserrtextlen)))
& nbsp & nbsp & nbsp ( SRV_SERVER * serveur,
SRV_PROC * srvproc,
int srverror,
OCTET de gravite,
OCTET d'etat,
int oserrnum,
char * errtext,
int errtextlen,
char * oserrtext,
int oserrtextlen )
}
fonction de srv_event_fn(srvproc: SRV_PROC evenement: donnees Integer: PByte): Integer cdecl
fonction de srv_getuserdata(srvproc: SRV_PROC): Pointeur cdecl
fonction de srv_getbindtoken(srvproc: SRV_PROC token_buf: PChar): Integer cdecl
fonction de srv_getdtcxact(srvproc: SRV_PROC ppv: Pointeur): Integer cdecl
//typedef int (* Gestionnaire d'evenements)(void*)
type
& nbsp & nbsp Gestionnaire = Pointeur
fonction de srv_handle(serveur: SRV_SERVER int: Longint gestionnaire: le Gestionnaire d'evenements): Evenement andler cdecl
fonction de srv_impersonate_client(srvproc: SRV_PROC): Integer cdecl
fonction de srv_init(config: SRV_CONFIG connectname: PChar namelen: Integer): SRV_SERVER cdecl
fonction de srv_iodead(srvproc: SRV_PROC): Bool cdecl
fonction de srv_langcpy(srvproc: SRV_PROC demarrer, nbytes: Longint tampon: PChar): Longint cdecl
fonction de srv_langlen(srvproc: SRV_PROC): Longint cdecl
fonction de srv_langptr(srvproc: SRV_PROC): Pointeur cdecl
fonction de srv_log(serveur: SRV_SERVER datestamp: Bool msg: PChar msglen: Integer): Integer cdecl
fonction de srv_paramstatus(srvproc: SRV_PROC n: Integer): Integer cdecl
fonction de srv_pfield(srvproc: SRV_PROC champ: Integer len: PInteger): PChar cdecl
fonction de srv_returnval(srvproc: SRV_PROC value_name: PDBCHAR len: Integer statut: Octet
& nbsp & nbsp iType, maxlen, variable 'datalen' contient: DBINT valeur: PByte): Integer cdecl
fonction de srv_revert_to_self(srvproc: SRV_PROC): Integer cdecl
fonction de srv_rpcdb(srvproc: SRV_PROC len: PInteger): PChar cdecl
fonction de srv_rpcname(srvproc: SRV_PROC len: PInteger): PChar cdecl
fonction de srv_rpcnumber(srvproc: SRV_PROC): Integer cdecl
fonction de srv_rpcoptions(srvproc: SRV_PROC): Mot cdecl
fonction de srv_rpcowner(srvproc: SRV_PROC len: PInteger): PChar cdecl
fonction de srv_run(serveur: SRV_SERVER): Integer cdecl
fonction de srv_sendmsg(srvproc: SRV_PROC
& nbsp & nbsp msgtype: Integer msgnum: DBINT msgClass, etat: DBTINYINT
& nbsp & nbsp rpcname: PChar rpcnamelen: Integer
& nbsp & nbsp numligne: Word msg: PChar msglen: Integer): Integer cdecl
fonction de srv_ansi_sendmsg(srvproc: SRV_PROC
& nbsp & nbsp msgtype: Entier msgnum: DBINT msgClass, etat: DBTINYINT
& nbsp & nbsp rpcname: PChar rpcnamelen: Integer
& nbsp & nbsp numligne: Word msg: PChar msglen: Integer): Integer cdecl
fonction de srv_sendstatus(srvproc: SRV_PROC statut: Longint): Integer cdecl
fonction de srv_setuserdata(srvproc: SRV_PROC ptr: Pointeur): Integer cdecl
fonction de srv_sfield(serveur: SRV_SERVER champ: Integer len: PInteger): PChar cdecl
fonction de srv_symbol(iType, symbole: Integer len: PInteger): PChar cdecl
fonction de srv_tdsversion(srvproc: SRV_PROC): Integer cdecl
fonction de srv_writebuf(srvproc: SRV_PROC ptr: Pointeur count: Word): Integer cdecl
fonction de srv_willconvert(srctype, desttype: Entier): Booleen cdecl
procedure srv_ackattention(srvproc: SRV_PROC) cdecl
fonction de srv_terminatethread(srvproc: SRV_PROC): Entier cdecl
fonction de srv_sendstatistics(srvproc: SRV_PROC): Integer cdecl
fonction de srv_clearstatistics(srvproc: SRV_PROC): Integer cdecl
fonction de srv_setevent(serveur: SRV_SERVER evenement: Integer): Integer cdecl
fonction de srv_message_handler(srvproc: SRV_PROC
& nbsp & nbsp errornum: Integer gravite, l'etat: Octet oserrnum: Integer errtext: PChar
& nbsp & nbsp errtextlen: Integer oserrtext: PChar oserrtextlen: Integer): Entier cdecl
fonction de srv_pre_handle(serveur: SRV_SERVER srvproc: SRV_PROC
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp evenement: Longint gestionnaire: le Gestionnaire d'evenements supprimer: Bool): Integer cdecl
fonction de srv_post_handle(serveur: SRV_SERVER srvproc: SRV_PROC
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp evenement: Longint gestionnaire: le Gestionnaire d'evenements supprimer: Bool): Integer cdecl
fonction de srv_post_completion_queue(srvproc: SRV_PROC inbuf: PChar inbuflen: PChar): Integer cdecl
fonction de srv_IgnoreAnsiToOem(srvproc: SRV_PROC bTF: BOOL): Entier 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) ou (SS_MINOR_VERSION shl 16))
//#endif //_ODS_SRV_H_
//////////////////////////////////////////////////////////////////
// a Suggere la mise en œuvre de l' __GetXpVersion
//
//__declspec(dllexport) ULONG __GetXpVersion()
//{
//retourne ODS_VERSION
//}
//////////////////////////////////////////////////////////////////
application
const
& nbsp & nbsp sLibName = 'Opends60.DLL'
fonction de srv_describe externe sLibName nom 'srv_describe'
fonction de srv_setutype externe sLibName nom 'srv_setutype'
fonction de srv_setcoldata externe sLibName nom 'srv_setcoldata'
fonction de srv_setcollen externe sLibName nom 'srv_setcollen'
fonction de srv_sendrow externe sLibName nom 'srv_sendrow'
fonction de srv_senddone externe sLibName nom 'srv_senddone'
// Traiter avec extension de la Procedure de parametres
fonction de srv_rpcparams externe sLibName nom 'srv_rpcparams'
fonction de srv_paraminfo externe sLibName nom 'srv_paraminfo'
fonction de srv_paramsetoutput externe sLibName nom 'srv_paramsetoutput'
fonction de srv_paramdata externe sLibName nom 'srv_paramdata'
fonction de srv_paramlen externe sLibName nom 'srv_paramlen'
fonction de srv_parammaxlen externe sLibName nom 'srv_parammaxlen'
fonction de srv_paramtype externe sLibName nom 'srv_paramtype'
fonction srv_paramset externe sLibName nom 'srv_paramset'
fonction de srv_paramname externe sLibName nom 'srv_paramname'
fonction de srv_paramnumber externe sLibName nom 'srv_paramnumber'
// & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
// Le reste de ces Api sont toujours pris en charge dans SQL Server 7.0,
// mais ne peuvent pas etre pris en charge, apres SQL Server 7.0
fonction de srv_getconfig externe sLibName nom 'srv_getconfig'
fonction de srv_getserver externe sLibName nom 'srv_getserver'
fonction de srv_got_attention externe sLibName nom 'srv_got_attention'
fonction de srv_eventdata externe sLibName nom 'srv_eventdata'
// la Memoire
fonction de srv_alloc externe sLibName nom 'srv_alloc'
fonction de srv_bmove externe sLibName nom 'srv_bmove'
fonction srv_bzero externe sLibName nom 'srv_bzero'
fonction de srv_free externe sLibName nom 'srv_free'
fonction de srv_config_fn externe sLibName nom 'srv_config'
fonction de srv_config_alloc externe sLibName nom 'srv_config_alloc'
fonction de srv_convert externe sLibName nom 'srv_convert'
fonction de srv_event_fn externe sLibName nom 'srv_event'
fonction de srv_getuserdata externe sLibName nom 'srv_getuserdata'
fonction de srv_getbindtoken externe sLibName nom 'srv_getbindtoken'
fonction srv_getdtcxact externe sLibName nom 'srv_getdtcxact'
fonction de srv_handle externe sLibName nom 'srv_handle'
fonction de srv_impersonate_client externe sLibName nom 'srv_impersonate_client'
fonction de srv_init externe sLibName nom 'srv_init'
fonction de srv_iodead externe sLibName nom 'srv_iodead'
fonction de srv_langcpy
Les procédures stockées étendues avec delphi
By commentfaire
Les procédures stockées étendues avec delphi : Plusieurs milliers de conseils pour vous faciliter la vie.