tags:

views:

197

answers:

4

It's possible to call .NET from MATLAB, so I thought I would try to use ADO.NET to connect to a database.

I seem to have hit a blocking problem - anytime you try and create a Command object, it throws an error.

You can try this yourself:

>> NET.addAssembly('System.Data');
>> sqlconn = System.Data.SqlClient.SqlConnection();
>> sqlconn.State

ans = 

    Closed    

>> % So far, so good
>> sqlcmd = System.Data.SqlClient.SqlCommand();
??? Error using ==> System.Data.SqlClient.SqlCommand
'Connection' is already defined as a property.

>> 

Does anyone have some insight into this? It seems like a pure and simple bug on MATLAB's part - maybe it happens with every .NET class that happens to have a property called "Connection".

Should I just throw in the towel and give up on using MATLAB to talk to a database using .NET?


Answer (thank's to Fazil's investigations): Upgrade MATLAB to a version greater than 2009a.

+3  A: 
NET.addAssembly('System.Data');
sqlconn = System.Data.SqlClient.SqlConnection();
sqlcmd = sqlconn.CreateCommand();
sqlcmd.CommandText = "SELECT count(id) FROM sometable";
sqlconn.Open();
sqlrdr = sqlcmd.ExecuteReader();
sqlrdr.Read();
sqlrdr.GetInt64(0)
Darin Dimitrov
Thanks, CreateCommand works. But now if I set the CommandText property MATLAB will tell me the property is not there in the cases where I'm stepping through the code. In the cases where I am not stepping through the code the entire environment crashes.
Andrew Shepherd
+2  A: 

Should I just throw in the towel and give up on using MATLAB to talk to a database using .NET?

No, but realize you can also use Java from MATLAB, which is fairly straightforward if you are familiar with JDBC.

I had to write a quick helper function since Class.forName() didn't seem to respect MATLAB's javaclasspath, and had to convert strings explicitly with char(), but otherwise it worked fine:

// MatlabDBAdapter.java

import java.sql.*;

public class MatlabDBAdapter {

    public void loadDriver(String driverClass) throws ClassNotFoundException
    {
        Class.forName(driverClass);
    }
    public Connection getConnection(String dburl) throws SQLException
    {
        return DriverManager.getConnection(dburl);
    }
}

example m-file:

% dbexample.m
% adapted from "getting started" section
% of http://www.zentus.com/sqlitejdbc/ 

% replace the following two lines with 
%    1. where you put the compiled MatlabDBAdapter, 
%    2. also where you put the driver jar file


javaaddpath('c:/appl/java/project/MatlabDBAdapter/bin');
javaaddpath('c:/appl/java/common/sqlitejdbc-v056.jar');

dba=com.example.test.database.MatlabDBAdapter();
dba.loadDriver('org.sqlite.JDBC');
conn=dba.getConnection('jdbc:sqlite:test.db');

disp ('Adding data....');   

stat = conn.createStatement();
stat.executeUpdate('drop table if exists people;');
stat.executeUpdate('create table people (name, occupation);');
prep = conn.prepareStatement(...
    'insert into people values (?, ?);');

prep.setString(1, 'Gandhi');
prep.setString(2, 'politics');
prep.addBatch();
prep.setString(1, 'Turing');
prep.setString(2, 'computers');
prep.addBatch();
prep.setString(1, 'Wittgenstein');
prep.setString(2, 'smartypants');
prep.addBatch();

conn.setAutoCommit(false);
prep.executeBatch();
conn.setAutoCommit(true);

disp ('Reading back data....');

rs = stat.executeQuery('select * from people;');
while (rs.next()) 
    % need to explicitly convert java.lang.String using char()
    disp(['name = ' char(rs.getString('name'))]);
    disp(['job = ' char(rs.getString('occupation'))]);
end
rs.close();
conn.close();
Jason S
+1  A: 

HI Andrew I'm not able to reproduce the issue in MATLAB. Which version of MATLAB are you using?

version

ans =

7.9.1.705 (R2009b) Service Pack 1

NET.addAssembly('System.Data'); sqlconn = System.Data.SqlClient.SqlConnection(); sqlconn.State sqlcmd = System.Data.SqlClient.SqlCommand()

ans =

Closed    

sqlcmd =

System.Data.SqlClient.SqlCommand handle Package: System.Data.SqlClient

Properties: Connection: [] NotificationAutoEnlist: 1 Notification: [] Transaction: [] CommandText: [1x1 System.String] CommandTimeout: 30 CommandType: [1x1 System.Data.CommandType] DesignTimeVisible: 1 Parameters: [1x1 System.Data.SqlClient.SqlParameterCollection] UpdatedRowSource: [1x1 System.Data.UpdateRowSource] Site: [] Container: []

Methods, Events, Superclasses

Fazil
I upgraded to R2010a (from R2009a). Now it works.
Andrew Shepherd
A: 

Hi,

I am trying to call stored procedure from Matlab with the same approach but got stuck when the stored procedure required input parameters. May anyone shed me some light on this? Thank you so much!

:)

Welcome to StackOverflow. You have asked a question, so you should post it as a new question, not an answer to a different question.
Andrew Shepherd

related questions