erweiterte Prozedur



  • Hallo,

    wer hat schon mal eine "dll" erstellt und diese als neue erweiterte Prozedur
    in den SQL-Server gepackt.
    Wie mach man es, weis jemand vieleich wo man ein beispiel runterladen kann
    Vielen Dank



  • Ich weis man kann mit dem Assistent eine Erweiterte Prozedur erstellen aber mein Problem ist wie kriege ich da ( in der dll ) par Parameter vor allem CString und wie gebe ich die wieder zurück ??
    Bitte um Hilfe



  • So habe ich das ganze bis jetzt geschafft.
    Mein Problem ich kann keinen output Parameter angeben in die Prozedur und auch ausgeben als Datentyp

    #include <stdafx.h>
    
    #define XP_NOERROR              0
    #define XP_ERROR                1
    #define MAXCOLNAME				25
    #define MAXNAME					25
    #define MAXTEXT					255
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    RETCODE __declspec(dllexport) xp_formel(SRV_PROC *srvproc);
    
    #ifdef __cplusplus
    }
    #endif
    
    RETCODE __declspec(dllexport) xp_formel(SRV_PROC *srvproc)
    {	
    	int a = 0;
    	int b = 0,zehler = 0;
    	int iLength,iType,iParamCount,i = 0;
    	CString szText,szTemp,sInt;
    	CString szOutBuffer = "";
    
    	//Get the number of parameters passed to the Extended stored procedure.
    
    	iParamCount=srv_rpcparams(srvproc);
    	if (iParamCount == -1)
    	{        
            return (XP_ERROR);
    	}
    	// Parse for all parameters that have been Passed
    	// Note SQL Extended stored procedure use start index 1 unlike 0 in C
    	// but quite like Basic
    	for (i = 1; i <= iParamCount; i++) 
    	{
    		szText = _T("");
    		//Retrieve the data length of the Extended stored procedure call parameter.
    		iLength=srv_paramlen(srvproc,i);
    		//Retrieve the data type of the Extended stored procedure call parameter.
    		iType=srv_paramtype(srvproc,i);
    		if(iLength <= 0)
    		{
    			return (XP_ERROR);
    		}
    		else
    		{
    			switch(iType)
    			{
    				case SRVCHAR://character data type.
    						szText.Format("%s",(const char *) srv_paramdata (srvproc,i));						
    						break;							
    				case SRVVARCHAR://Variable-length character data type.
    						szText.Format("%s",(const char *) srv_paramdata (srvproc,i));										
    						break;																	
    				case SRVINTN://tinyint, smallint, or int data type, null values allowed.						
    						sInt.Format("%d",*((int*) srv_paramdata (srvproc,i)));												
    						zehler ++;
    						if(zehler==1)
    							a = atoi(sInt);
    						if(zehler!=1)
    							b= atoi(sInt);
    						break;							
    				//Handling for other data types
    				default: 
    						a=b=0;
    						szText = "";
    						break;							
    
    			}
    		}
    	}
    	iLength = szOutBuffer.GetLength();		
    	char buffer[20];
    	long c = a+b;
    	szOutBuffer = _ltoa(c,buffer,10);
    
    	int status = srv_paramstatus(srvproc, i+1);
    
    	//Defines the column Output_Info and source and destination data types for a specific column in a row.
    	srv_describe(srvproc,1,"Output_Info",255,SRVVARCHAR,iLength,SRVVARCHAR,iLength,(void *)(szOutBuffer.GetBuffer( iLength )));
    	//Send the output result set to the SQL Server for viewing in clients like ISQLW
    	srv_sendrow(srvproc);
    	//Inform the Server that you are finsihed with the send
    	//else subsequent ODS calls will cause an Invalid Cursor State 
    	//as it is still waiting for the information
    	srv_senddone(srvproc,SRV_DONE_FINAL,0,0);
    	szOutBuffer.ReleaseBuffer();
    
    	return XP_NOERROR ;
    }
    

Anmelden zum Antworten