【问题标题】:Invoking ADO.NET from MATLAB从 MATLAB 调用 ADO.NET
【发布时间】:2012-04-07 22:53:12
【问题描述】:

可以从 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 服务吗?如果是这样,让它为你做数据库工作?
  • MATLAB 提供了许多选项来调用以不同语言编写的组件。但是,我正在尝试短期最简单的解决方案。

标签: ado.net matlab


【解决方案1】:
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 会告诉我在我单步执行代码的情况下该属性不存在。在我没有单步执行代码的情况下,整个环境都会崩溃。
【解决方案2】:

我是否应该认输并放弃使用 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();

【讨论】:

    【解决方案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: []
        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
    
    >> 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-22
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      • 2011-03-12
      相关资源
      最近更新 更多