2017-09-22 21 views
2

我需要从Matlab内部连接到SQLServer数据库。在MATLAB中使用SQLServer JDBC驱动程序

注意事项:

  1. 购买许可证Matlab的数据库工具箱不是option--我只能用核心与Matlab和Java。
  2. 当初始化Matlab时,我不能假设任何有关Java路径的东西。
  3. 请不要告诉我使用Python。我已经知道,但我工作的公司不...


这是我到目前为止已经完成了...

我已经下载了SQL Server JDBC驱动程序从here

我创建了一个sandbox目录,如下图所示内容...

Sandbox

这里是我的Matlab代码。

% Connection params 
server = 'myServerName'; 
port = 1433; 
dbname = 'myDatabase'; 
user = 'user1'; 
pass = 'password'; 

url = sprintf('jdbc:sqlserver://%s:%d;DatabaseName=%s',server,port,dbname); 


% Importing Java libraries 
import java.sql.*; 
import java.sql.DriverManager; 
import java.sql.DriverManager.*; 

% Add the Microsoft SQL Server JAR to Java path 
javaaddpath('<path_to_this_folder>\sqljdbc41.jar'); %for JRE7 
import com.microsoft.sqlserver.jdbc.* 


% Try to instantiate the JDBC Driver 
% This way DOES work 
% (https://stackoverflow.com/questions/24438359/connecting-matlab-and-mysql-with-the-jdbc-driver) 
if true 
    d = com.microsoft.sqlserver.jdbc.SQLServerDriver; 

    urlValid = d.acceptsURL(url); 

    props = java.util.Properties; 
    props.put('user',user); 
    props.put('password',pass); 

    con = d.connect(url, props); 

% This way DOES NOT work. 
%I referred to the sample code included with the JDBC to write this. 
else 
    % Matlab Doc says this is similar to calling... 
    % Class.forName(...) 
    javaObjectEDT('com.microsoft.sqlserver.jdbc.SQLServerDriver'); 

    driver = DriverManager.getDriver(url); 

    con = DriverManager.getConnection(url, user, pass); 

end 

看起来无论什么原因,DeviceManager都没有正确加载驱动程序。

Java exception occurred: 
java.sql.SQLException: No suitable driver 

    at java.sql.DriverManager.getDriver(Unknown Source) 

有没有办法解决这个问题还是应该我只是直接通过驱动程序本身连接滚动的方法DriverManager.getDriver(url)抛出一个异常...?我想不出为什么重要。会有什么后果吗?我应该使用DataSource方法吗?

谢谢!

+0

我不知道Matlab,所以这个评论。 '正常'的方式是使用'DriverManager.getConnection',而不是'DriverManager.getDriver'然后是'Driver.getConnection'。该错误表明驱动程序尚未与驱动程序管理器一起加载(注册),所以或者'javaObjectEDT'不能像广告一样工作,或者Matlab在类加载中应用限制,从而阻止它的工作。请注意,'DriverManager.getConnection'在'DriverManager.getDriver'上应用了一些额外的技巧,所以我会先尝试一下。 –

+0

@MarkRotteveel。这是我的理解,'DriverManager.getDriver(url)'只是搜索DriverManager,看看是否有加载的驱动程序可以处理给定的网址。它实际上并没有对加载的驱动程序做任何事情。我不明白这会怎样改变下面这一行,即'DriverManager.getConnection' – Evan

+0

@MarkRotteveel。话虽如此,但Matlab很可能会限制某些类加载。让我在那里做一些挖掘。 – Evan

回答

0

您可能想尝试将驱动程序添加到静态Java路径而不是动态Java路径。每当我使用数据库驱动程序时,如果它们处于动态路径上,似乎都会遇到麻烦;我不确定为什么,但他们似乎需要以一种特殊的方式加载,如果他们处于动态路径中,那么这种加载方式不能很好地工作。

相关问题