从MATLAB调用ADO.NET

3

可以从MATLAB调用.NET,因此我尝试使用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本身的一个纯粹简单的错误 - 也许它会发生在每个具有名为“Connection”的属性的.NET类上。

我应该放弃使用MATLAB通过.NET与数据库通信吗?


答案(感谢Fazil的调查):将MATLAB升级到大于2009a的版本。


我以前从未使用过MATLAB。它能调用本地的WCF服务吗?如果可以,就让它为您处理数据库工作吧。 - Shawn Mclean
MATLAB提供了多种选项来调用使用不同语言编写的组件。然而,我正在尝试最简单的短期解决方案。 - Andrew Shepherd
3个回答

3
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)

谢谢,CreateCommand 工作正常。但是现在如果我设置 CommandText 属性,MATLAB 将告诉我该属性不存在于我正在逐步执行代码的情况下。在我不逐步执行代码的情况下,整个环境都会崩溃。 - Andrew Shepherd

3

我应该放弃使用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();

2
我无法在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: []
    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

>> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接