Вызов ADO.NET из MATLAB

Можно вызвать .NET из MATLAB, поэтому я подумал, что попытаюсь использовать ADO.NET для подключения к базе данных.

Кажется, я столкнулся с проблемой блокировки - в любое время, когда вы пытаетесь создать объект Command, это вызывает ошибку.

Вы можете попробовать это самостоятельно:

>> 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.
>>

Есть ли у кого-нибудь понимание этого? Похоже, что чистая и простая ошибка в части MATLAB - возможно, это происходит с каждым .NET-классом, у которого есть свойство, называемое "Connection".

Должен ли я просто бросить полотенце и отказаться от использования MATLAB, чтобы поговорить с базой данных с помощью .NET?

Ответ (спасибо исследованиям Фазиля): обновите MATLAB до версии, большей чем 2009a.

3 ответа

Я не могу воспроизвести проблему в MATLAB. Какую версию MATLAB вы используете?

>> 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: []
 **********************: 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
>>


Должен ли я просто бросить полотенце и отказаться от использования MATLAB, чтобы поговорить с базой данных с помощью .NET?

Нет, но поймите, вы также можете использовать Java от MATLAB, что довольно просто, если вы знакомы с JDBC.

Мне пришлось написать функцию быстрого помощника, так как Class.forName(), похоже, не уважал MATLAB javaclasspath, и мне пришлось явно преобразовывать строки с помощью char(), но в остальном он работал нормально:

// 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);
 }
}

Пример m файла:

% 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();


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)

licensed under cc by-sa 3.0 with attribution.