MATLAB:为什么我没有在游标对象中得到SQL结果?

时间:2012-10-22 18:43:26

标签: database matlab cursor try-catch rowcount

我正在使用带有数据库工具箱的MATLAB R2012b来访问SQL Server 2012.我了解到使用TRY / CATCH时,SELECT @@ ROWCOUNT必须通过声明的变量传递,以返回try块后受影响的行。我发现this link给出了一个明确的例子。

当我在MATLAB中执行我的SQL脚本时,使用新的runsqlscript()命令,SQL游标对象显示成功的操作,但SQL游标对象在“数据”字段中显示(0)作为结果。我知道这并不代表插入的行数,因为我通过在SSMS中执行等效脚本来验证。

任何想法/建议表示赞赏, 谢谢, 布拉德

>> SQL_cursor
SQL_cursor =

        Attributes: []
              Data: 0
    DatabaseObject: [1x1 database]
          RowLimit: 0
          SQLQuery: [1x541 char]
           Message: [1x42 char]
              Type: 'Database Cursor Object'
         ResultSet: []
            Cursor: [1x1 com.mathworks.toolbox.database.sqlExec]
         Statement: [1x1 com.microsoft.sqlserver.jdbc.SQLServerStatement]
             Fetch: 0

% This Message is the normal text returned when there's no error
>> SQL_cursor.Message
ans = The statement did not return a result set.

% The Data value should not be zero: rows were inserted!
>> SQL_cursor.Data
ans = 0

这是我在MATLAB中执行的SQL脚本。注意通用标记('DATABASE_NAME'等)。

USE DATABASE_NAME

DECLARE @N_ROWS INT

BEGIN TRANSACTION
BEGIN TRY

BULK INSERT TABLE_NAME 
    FROM 'DATA_FILE_NAME'
    WITH 
          (
             CHECK_CONSTRAINTS,
             FIELDTERMINATOR ='\t',
             ROWTERMINATOR ='\r\n',
             FORMATFILE = 'FORMAT_FILE_NAME',
             DATAFILETYPE = 'char',
             MAXERRORS = 0,
             TABLOCK
          )            

SET @N_ROWS = @@ROWCOUNT
COMMIT TRANSACTION
END TRY

BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH

SELECT @N_ROWS

更新#1:实际上,即使没有所有的TRY / CATCH& TRANSACTION框架。精简的SQL代码在游标对象中生成相同的(0)'数据'字段:

USE DATABASE_NAME

BULK INSERT TABLE_NAME 
    FROM 'DATA_FILE_NAME'
    WITH 
          (
             CHECK_CONSTRAINTS,
             FIELDTERMINATOR ='\t',
             ROWTERMINATOR ='\r\n',
             FORMATFILE = 'FORMAT_FILE_NAME',
             DATAFILETYPE = 'char',
             MAXERRORS = 0,
             TABLOCK
          )            

SELECT @@ROWCOUNT

MATLAB结果:

>> SQL_cursor
 SQL_cursor =
        Attributes: []
              Data: 0
    DatabaseObject: [1x1 database]
          RowLimit: 0
          SQLQuery: [1x397 char]
           Message: [1x42 char]
              Type: 'Database Cursor Object'
         ResultSet: []
            Cursor: [1x1 com.mathworks.toolbox.database.sqlExec]
         Statement: [1x1 com.microsoft.sqlserver.jdbc.SQLServerStatement]
             Fetch: 0

>> SQL_cursor.Message
ans = The statement did not return a result set.
>> SQL_cursor.Data
ans = 0

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题。 我认为问题是你正在运行多个语句,即使第二个语句返回数据,第一个语句也不返回任何内容。

尝试单独运行语句。 This page给了我这个想法。