// *************************************************************************** // Copyright (C) 1991-2003 SQLDev.Net // // $BeginHeader$ // // @file@: CreateJob.cpp // @author@: Gert E.R. Drapers (GertD@SQLDev.Net) // @description@: Example: Creating a job using SQL-DMO // @remarks@: // @created@: 2003-02-27 // @lastsaved@: 2003-03-01 // // update history: // @version@ @initials@ @updatedate@ @release@ @description@ // 00001 GED 2003-03-01 v1.0.0.1 added jobstep and schedule // 00000 GED 2003-02-27 v1.0.0.0 created // // @EndHeader@ // *************************************************************************** #define STRICT // strict type checking #define UNICODE // Unicode #define _UNICODE // Unicode #define WIN32_LEAN_AND_MEAN // do not include the world #define INC_OLE2 // include OLE/COM files #include #include #include #include #include "C:\Program Files\Microsoft SQL Server\80\Tools\DevTools\Include\sqldmoid.h" #include "C:\Program Files\Microsoft SQL Server\80\Tools\DevTools\Include\sqldmo.h" void DisplayError(); INT _tmain(INT argc, TCHAR* argv[], TCHAR* envp[]) { HRESULT hr; TCHAR lpServer[] = _T("(local)\\dev"); TCHAR lpJobName[] = _T("MyJob"); TCHAR lpJobDescription[] = _T("Job description"); LPSQLDMOSERVER2 pSQLServer = NULL; LPSQLDMOJOBSERVER2 pJobServer = NULL; LPSQLDMOJOB pJob = NULL; LPSQLDMOJOBS pJobs = NULL; LPSQLDMOJOBSTEP pJobStep = NULL; LPSQLDMOJOBSTEPS pJobSteps = NULL; LPSQLDMOJOBSCHEDULE pJobSchedule = NULL; LPSQLDMOSCHEDULE pSchedule = NULL; LPSQLDMOJOBSCHEDULES pJobSchedules = NULL; if FAILED(hr = CoInitialize(NULL)) { goto error; } // initialize SQLServer object // if FAILED(hr = CoCreateInstance(CLSID_SQLDMOServer2, NULL, CLSCTX_INPROC_SERVER, IID_ISQLDMOServer2, (LPVOID*)&pSQLServer)) { goto error; } // connect to the server using Windows authentication // hr = pSQLServer->SetLoginSecure(TRUE); hr = pSQLServer->Connect(lpServer); // get the JobServer object representing the SQL Agent bound to the SQL Server you are connected to // if FAILED(hr = pSQLServer->GetJobServer((LPSQLDMOJOBSERVER*) &pJobServer)) { goto error; } // get the job object, if exists, Remove, so we can create it again // if SUCCEEDED(hr = pJobServer->GetJobByName(lpJobName, (LPSQLDMOJOB*) &pJob)) { hr = pJob->Remove(); pJob->Release(); pJob = NULL; } // create new, empty Job object // if FAILED(hr = CoCreateInstance(CLSID_SQLDMOJob, NULL, CLSCTX_INPROC_SERVER, IID_ISQLDMOJob, (LPVOID*)&pJob)) { goto error; } hr = pJob->SetName(lpJobName); hr = pJob->SetDescription(lpJobDescription); // get Jobs collection // if FAILED(hr = pJobServer->GetJobs((LPSQLDMOJOBS*) &pJobs)) { goto error; } // add Job object to the Jobs collection // you need to add the job to the collection first, // before you can get the JobSteps and JobSchedules collections // if FAILED(hr = pJobs->Add(pJob)) { goto error; } // create a new JobStep object // if FAILED(hr = CoCreateInstance(CLSID_SQLDMOJobStep, NULL, CLSCTX_INPROC_SERVER, IID_ISQLDMOJobStep, (LPVOID*)&pJobStep)) { goto error; } // set JobStep properties // hr = pJobStep->SetStepID(1); hr = pJobStep->SetName(_T("Job step 1")); hr = pJobStep->SetSubSystem(_T("TSQL")); hr = pJobStep->SetCommand(_T("select 1")); hr = pJobStep->SetFlags(0); hr = pJobStep->SetAdditionalParameters(NULL); hr = pJobStep->SetCmdExecSuccessCode(0); hr = pJobStep->SetOnSuccessAction(SQLDMOJobStepAction_QuitWithSuccess); // Since only jobstep, otherwise useSQLDMOJobStepAction_GotoNextStep hr = pJobStep->SetOnFailStep(SQLDMOJobStepAction_QuitWithFailure); BSTR strName = NULL; pSQLServer->GetTrueName(&strName); hr = pJobStep->SetServer(strName); SysFreeString(strName); hr = pJobStep->SetDatabaseName(_T("tempdb")); hr = pJobStep->SetDatabaseUserName(NULL); // as self hr = pJobStep->SetRetryAttempts(0); hr = pJobStep->SetRetryInterval(0); hr = pJobStep->SetOSRunPriority(SQLDMORunPri_Normal); hr = pJobStep->SetOutputFileName(_T("c:\\jobstep1.log")); // get JobSteps collection // if FAILED(hr = pJob->GetJobSteps(&pJobSteps)) { goto error; } // add JobStep to collection, repeat this step for as many JobSteps you need in you Job // if FAILED(hr = pJobSteps->Add(pJobStep)) { goto error; } // create a JobSchedule object // if FAILED(hr = CoCreateInstance(CLSID_SQLDMOJobSchedule, NULL, CLSCTX_INPROC_SERVER, IID_ISQLDMOJobSchedule, (LPVOID*)&pJobSchedule)) { goto error; } // set JobSchedule properties // hr = pJobSchedule->SetName(_T("Schedule 1")); hr = pJobSchedule->SetEnabled(TRUE); // get pointer to Schedule object // if FAILED(hr = pJobSchedule->GetSchedule(&pSchedule)) { goto error; } // set the Schedule object properties // hr = pSchedule->SetFrequencyType(SQLDMOFreq_Daily); hr = pSchedule->SetFrequencyInterval(1); hr = pSchedule->SetFrequencySubDay(SQLDMOFreqSub_Hour); hr = pSchedule->SetFrequencySubDayInterval(1); hr = pSchedule->SetFrequencyRelativeInterval(SQLDMOFreqRel_Unknown); hr = pSchedule->SetFrequencyRecurrenceFactor(0); hr = pSchedule->SetActiveStartDate(20030301); hr = pSchedule->SetActiveEndDate(99991231); hr = pSchedule->SetActiveStartTimeOfDay(0); hr = pSchedule->SetActiveEndTimeOfDay(235959); // get JobSchedules collection // if FAILED(hr = pJob->GetJobSchedules(&pJobSchedules)) { goto error; } // add JobSchedule to the Job if FAILED(hr = pJobSchedules->Add(pJobSchedule)) { goto error; } // Now you can run the job // if FAILED(hr = pJob->Invoke()) { goto error; } hr = S_OK; error: if FAILED(hr) { DisplayError(); } if (pJobSchedule) { pJobSchedule->Release(); pJobSchedule = NULL; } if (pSchedule) { pSchedule->Release(); pSchedule = NULL; } if (pJobSchedules) { pJobSchedules->Release(); pJobSchedules = NULL; } if (pJobStep) { pJobStep->Release(); pJobStep = NULL; } if (pJobSteps) { pJobSteps->Release(); pJobSteps = NULL; } if (pJob) { pJob->Release(); pJob = NULL; } if (pJobs) { pJobs->Release(); pJobs = NULL; } if (pJobServer) { pJobServer->Release(); pJobServer = NULL; } if (pSQLServer) { pSQLServer->DisConnect(); pSQLServer->Release(); pSQLServer = NULL; } CoUninitialize(); return hr; } void DisplayError() { LPERRORINFO pErrorInfo = NULL; BSTR strDescription; BSTR strSource; GetErrorInfo(0, &pErrorInfo); pErrorInfo->GetDescription (&strDescription); pErrorInfo->GetSource(&strSource); _tprintf(_T("%s\n"), (LPTSTR) strDescription); _tprintf(_T("%s\n"), (LPTSTR) strSource); pErrorInfo->Release(); SysFreeString(strDescription); SysFreeString(strSource); }