添加SAS JAR.RAR中的JAR包.
運行以下代碼:
|
import com.sas.iom.SAS.IWorkspace; import com.sas.rio.MVAConnection; public class CreditServiceImpl implements java.rmi.Remote { private String HOST = "localhost"; private String PORT = "8591"; private String JDBS_DRIVER_NAME = "com.sas.rio.MVADriver"; private String JDBS_DATEBASE_URL = "jdbc:sasiom://localhost:8591"; private String SAS_USER = "sasadm"; private String SAS_PWD = "sas123?"; public ResultSet getCreditLimit(String libnamestr,String sql )throws java.rmi.RemoteException { java.sql.Connection connection = null; java.sql.Statement statement = null; java.sql.ResultSet rs = null; IWorkspace iWorkspace = null; WorkspaceFactory wsf = null; try { wsf = new WorkspaceFactory(); Properties serverInfo = new Properties(); serverInfo.put("host", HOST); serverInfo.put("port", PORT); serverInfo.put("userName", SAS_USER); serverInfo.put("password", SAS_PWD); iWorkspace = wsf.createWorkspaceByServer(serverInfo); ILanguageService iLang = iWorkspace.LanguageService(); //String libnamecm = "libname libstg 'e:\data';"; ILanguageService sasLanguage = iWorkspace.LanguageService(); sasLanguage.Submit(libnamestr); String log = iLang.FlushLog(50000); System.out.println(log); /* Read the result via an MVAConnection */ IDataService iDataService = iWorkspace.DataService(); connection = new MVAConnection(iDataService, new Properties()); statement = connection.createStatement(); //String sql = "Select * from libstg.userinfo"; System.out.println("Curr Libname Command: " libnamestr); System.out.println(""); System.out.println("Curr Running SQL :" sql); rs = statement.executeQuery(sql); // if( rs.next() ) // { // String UserName = rs.getString("userName"); // System.out.println(UserName); // } } catch( Throwable t ) { t.printStackTrace(); java.rmi.RemoteException ex = new java.rmi.RemoteException("Error getting credit limit", t); throw ex; } finally { try{ /* Close JDBC connection if open */ if(connection != null) { if(!connection.isClosed()) connection.close(); } /* Close iWorkspace */ if(iWorkspace != null) iWorkspace.Close(); /* Shutdown WorkspaceFactory */ if(wsf != null) wsf.shutdown(); } catch(Throwable t) { } } return rs; } /** * @param args */ public static void main(String[] args) { // TODO 自動生成方法存根 CreditServiceImpl csi = new CreditServiceImpl(); String sql = "Select * from libstg.userinfo"; String libnamecm = "libname libstg 'e:\data';"; try { csi.getCreditLimit(libnamecm,sql); } catch (RemoteException e) { // TODO 自動生成 catch 塊 e.printStackTrace(); } } } |
通過IOM(「Integrated Object Model」 )伺服器,沒有必要使SAS安裝在本地系統,通過Management Console和EntERPrise Guide工具可以完美的連接到遠端的SAS主機上,需要注意的是IOM伺服器並不是代表一個具體的伺服器,在SAS IT中,有下面4中類型的IOM伺服器:
Metadata 伺服器 – 存儲和管理元資料庫,包含哪些SAS伺服器、庫、和存儲過程可用
工作空間伺服器 – 維護SAS程序環境;
存儲過程伺服器 – 運行 「canned」 SAS程序
OLAP伺服器 – 驅動CUBE數據到SAS Enterprise Guide或者其它OLAP客戶端
工作空間伺服器有下面3中類型:
Java客戶端連接到IOM伺服器使用JAVA-IOM橋
WIN客戶端連接到IOM伺服器使用COM/DCOM技術
WIN客戶端可以連接到運行在UNXI上的IOM伺服器,通過使用COM-IOM橋
對於WIN應用,IOM支持ADO通過OLEDB訪問SAS數據
對應JAVA,JDBC2.0訪問是被支持的
工作空間伺服器包含下面介面
工作空間Workspace – SAS會話
語言服務Language Service –提交SAS DATA步和過程步,接收LOG和LIST輸出,運行存儲過程
數據服務Data Service – 管理SAS庫
文件服務File Service – 管理文件標識實用工具Utilities – formats, options, result packages, host system information
存儲過程伺服器
用於存放存儲過程,其結果可以被Web(Information Delivery Portal,BI WEB服務)、Office(OFFICE插件)或者Enterprise Guide 3.0使用
假設在SAS伺服器上存在下面文件
C:temp>type IOMTest.sas %let cond=; *ProcessBody; proc print data=sashelp.class; title "Test Stored Process"; where &cond; run |
VB例子:
必須引用下面庫 SAS: Integrated Object Model (SAS System 9.1) SASWorkspaceManager 1.1 Type Library Connecting with DCOM in Visual Basic Dim obSAS As SAS.Workspace Dim obWSMgr As New SASWorkspaceManager.WorkspaceManager Private Sub Form_Load() Dim XMLInfo As String ' create Workspace server Dim obServer As New SASWorkspaceManager.ServerDef obServer.MachineDNSName = "hunding" Set obSAS = obWSMgr.Workspaces.CreateWorkspaceByServer _ ("", VisibilityProcess, obServer, "", "", xmlInfo) End Sub Private Sub cmdTest1_Click() ' use LanguageService to submit code obSAS.LanguageService.Submit _ "%include 'c:tempIOMTest.sas'; run;" MsgBox obSAS.LanguageService.FlushLog(100000) MsgBox obSAS.LanguageService.FlushList(100000) End Sub Private Sub cmdTest2_Click() 'run the stored SAS program Dim obStoredProcessService As SAS.StoredProcessService Set obStoredProcessService = _ obSAS.LanguageService.StoredProcessService obStoredProcessService.Repository = "file:c:temp" obStoredProcessService.Execute "IOMtest", "cond='sex eq ""M""'" MsgBox obSAS.LanguageService.FlushLog(100000) MsgBox obSAS.LanguageService.FlushList(1000000) Private Sub Form_Unload(Cancel As Integer) obWSMgr.Workspaces.RemoveWorkspaceByUUID _ obSAS.UniqueIdentifier obSAS.Close End Sub |
VB例子:
#include <iostream> #include <stdexcept> #include <Windows.h> using namespace std; #import "C:Program FilesSAS InstituteShared FilesIntegration Technologiessas.tlb" #import "C:Program FilesSAS InstituteShared FilesIntegration TechnologiesSASWMan.dll" int main() { SASWorkspaceManager::IWorkspaceManager2Ptr pIWorkspaceManager; SASWorkspaceManager::IServerDef2Ptr pIServerDef = NULL; SAS::IWorkspacePtr pIWorkspace; BSTR xmlInfo; HRESULT hr = CoInitialize(NULL); hr = pIWorkspaceManager.CreateInstance( pIServerDef.CreateInstance("SASWorkspaceManager.ServerDef"); pIServerDef->PutMachineDNSName("hygelac"); pIServerDef->Protocol = SASWorkspaceManager::ProtocolBridge; pIServerDef->put_Port(8591); pIWorkspace = pIWorkspaceManager->Workspaces->CreateWorkspaceByServer( _bstr_t(""), SASWorkspaceManager::VisibilityProcess, pIServerDef, // server _bstr_t("sassrv"), // login _bstr_t("sasuser"), // password &xmlInfo // connection log ); pIWorkspace->LanguageService->Submit( "%include '/home/sasadm/IOMTest.sas'; run;"); MessageBox(NULL, pIWorkspace->LanguageService->FlushLog(10000), "SAS Log", MB_OK ); MessageBox(NULL, pIWorkspace->LanguageService->FlushList(10000), "List Output", MB_OK ); pIWorkspace->Close(); } |
JAVA客戶端
編譯時使用下面命令
javac -classpath ".:C:/Program Files/SAS/SAS 9.1/core/sasmisc/sas.svc.connection.jar" IOMTest.java sas.svc.connection.jar文件位於 C:Program FilesSASSAS 9.1coresasmisc 下 |
import com.sas.services.connection.Server; import com.sas.services.connection.BridgeServer; import com.sas.services.connection.ConnectionFactoryConfiguration; import com.sas.services.connection.ConnectionFactoryInterface; import com.sas.services.connection.ConnectionFactoryException; import com.sas.services.connection.ConnectionInterface; import com.sas.services.connection.ManualConnectionFactoryConfiguration; import com.sas.iom.SAS.IWorkspace; import com.sas.iom.SAS.IWorkspaceHelper; import com.sas.iom.SAS.ILanguageService; import com.sas.iom.SAS.ILanguageServicePackage.LineTypeSeqHolder; import com.sas.iom.SASIOMDefs.GenericError; import com.sas.iom.SASIOMDefs.StringSeqHolder; public class IOMTest { public IOMTest() throws ConnectionFactoryException, GenericError { String classID = Server.CLSID_SAS; String host = "localhost"; int port = 8591; String password = "sas123?"; Server server = new BridgeServer(classID, host, port); ConnectionFactoryConfiguration cxfConfig = new ManualConnectionFactoryConfiguration( server); ConnectionFactoryManager cxfManager = new ConnectionFactoryManager(); ConnectionFactoryInterface cxf = cxfManager.getFactory(cxfConfig); ConnectionInterface cx = cxf.getConnection(userName, password); IWorkspace iWorkspace = IWorkspaceHelper.narrow(cx.getObject()); ILanguageService sasLanguage = iWorkspace.LanguageService(); sasLanguage.Submit("%include 'd:\auto.sas'; run;"); sasLanguage.FlushLogLines(Integer.MAX_VALUE, new CarriageControlSeqHolder(), new LineTypeSeqHolder(), logHldr); String[] logLines = logHldr.value; StringSeqHolder listHldr = new StringSeqHolder(); sasLanguage.FlushListLines(Integer.MAX_VALUE, new CarriageControlSeqHolder(), new LineTypeSeqHolder(), listHldr); iWorkspace.Close(); cx.close(); } public static void main(String args[]) { try { new IOMTest(); System.exit(0); } catch (Exception ex) { ex.printStackTrace(); System.exit(1); } } |
[火星人 ] 通過JAVA、VB訪問SAS IOM伺服器已經有451次圍觀