代码之家  ›  专栏  ›  技术社区  ›  Andrew Shepherd

从matlab调用ado.net

  •  3
  • Andrew Shepherd  · 技术社区  · 14 年前

    从matlab调用.net是可能的,所以我想我会尝试使用ado.net连接到数据库。

    我似乎遇到了一个阻塞问题——每当你试图创建一个命令对象时,它就会抛出一个错误。

    您可以自己尝试:

    >> 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中的一个纯粹而简单的bug——也许它发生在每个.NET类中,这些类恰好有一个名为“connection”的属性。

    我应该放弃使用matlab和使用.net的数据库交谈吗?


    回答(感谢Fazil的调查) :将matlab升级到大于2009a的版本 .

    3 回复  |  直到 12 年前
        1
  •  2
  •   Amro    12 年前

    我无法在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
    
    >> 
    
        2
  •  3
  •   Darin Dimitrov    14 年前
    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)
    
        3
  •  3
  •   Jason S    14 年前

    我应该放弃使用matlab和使用.net的数据库交谈吗?

    不,但是你也可以从Matlab中使用Java,如果你熟悉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();