在Microsoft SQL Server中使用带有XML字段的TDataset会导致奇怪的异常

时间:2016-05-01 13:56:52

标签: sql-server tsql delphi ado

我目前正在追踪我们的SQL生成器中的一个罕见问题,并能够缩小问题的根源。我创建了一个包含三个测试用例的示例,以向您显示确切的行为:

   var myList = myApp.virtualList('.list-block.virtual-list', {
   items: 
    [
    {
        title: 'Item 1',
        picture: 'path/to/picture1.jpg'
    },
    {
        title: 'Item 2',
        picture: 'path/to/picture2.jpg'
    },
    {
        title: 'Item 1000',
        picture: 'path/to/picture1000.jpg'
    },
    ],
    rowsAfter : 3,
    template: '<li class="item-content">' +
                  '<div class="item-media"><img src="{{picture}}"></div>' +
                  '<div class="item-inner">' +
                  '<div class="item-title">{{title}}</div>' +
                  '</div>' +
              '</li>'
    }); 

字段&#34;选项&#34;是XML类型。所以我的观察是,如果我引用一个具有xml作为数据类型的字段,则不能使用TDataset.FieldByName引用所有后续字段而不引发异常。

这是一些已知的错误吗?

P.S。 这是有关表的架构:

QUery.Close;
//Query.SQL.Text := Format('select Options, JobID, StatusMessage from ServerJob where JobID = %d', [ServerJobID]); // #1
//Query.SQL.Text := Format('select JobID, Options, StatusMessage from ServerJob where JobID = %d', [ServerJobID]); // #2
//Query.SQL.Text := Format('select JobID, StatusMessage, Options from ServerJob where JobID = %d', [ServerJobID]); // #3
Query.Open;

try
  JobID := Query.FieldByName('JobID').AsInteger; // #1 raises exception
                                                 // #2 ok
                                                 // #3 ok

  StatusMsg := Query.FieldByName('StatusMessage').AsString; // #1 never reaches this point
                                                            // #2 raises exception
                                                            // #3 ok
except
  on Exp: Exception do
  begin
    ExpMsg := Exp.Message; // #1 Fehler bei einem aus mehreren Schritten bestehenden Vorgang. Prüfen Sie die einzelnen Statuswerte.
                           // #2 Fehler bei einem aus mehreren Schritten bestehenden Vorgang. Prüfen Sie die einzelnen Statuswerte.
                           // #3 never reaches this point

    Query.Connection.Errors.Count; // #1 1
                                   // #2 1
                                   // #3 never reaches this point

    Query.Connection.Errors[0].Description; // #1 Expression illegal in evaluator
                                            // #2 Expression illegal in evaluator
                                            // #3 never reaches this point
    end;
  end;

我使用的是Delphi 10 Seattle和SQL server 2014。

0 个答案:

没有答案