从Delphi 7迁移到Delphi XE4时出现TSQLDataset错误

4

我在我的Delphi 7应用程序中有以下的TSQLDataSet。它从表格MyTable中获取2个字段(ID和Name)。

object SQLDataSet: TSQLDataSet
    GetMetadata = False
    CommandText = 'select * from MyTable'
    MaxBlobSize = -1
    Params = <>
    SQLConnection = mySQLConnection

    object SQLDataSetID: TIntegerField
      FieldName = 'ID'
      ProviderFlags = [pfInUpdate, pfInWhere, pfInKey]
      Required = True
    end
    object SQLDataSetNAME: TStringField
      FieldName = 'NAME'
      Required = True
      Size = 50
    end
end

当我迁移到Delphi XE4时,我遇到了以下错误:
class EDatabaseError with message 'SQLDataSet: Type mismatch for field 'NAME', expecting: String actual:WideString'

这个问题可能的原因是什么,我应该如何解决呢?

注意:我正在使用firebird 2.5.2


4
TStringField更改为TWideStringField - ZigiZ
@ZigiZ - 感谢您的评论。这将解决问题,但我为什么要这样做呢?我遵循了一个链接http://isatsara.blogspot.in/2012/01/delphi-2010-expecting-string-actual.html,其中提出了这个建议,但我没有得到他的解释。还有这个http://forums.devart.com/viewtopic.php?t=22080。我应该如何向其他人证明这种改变的合理性? - user1556433
在Firebird数据库中,表“MyTable”的“NAME”字段的类型是什么? - Jeroen Wiert Pluimers
@JeroenWiertPluimers - 在Firebird中,它的类型为varchar(50)。 - user1556433
这听起来像是一个编码问题,请更新您的答案,包括:数据库、表和TSQLConnection的字符集编码。最简单的方法是提供一个小型数据库DDL加上单个表格,以及非常简单的表单+连接+数据集的.DFM + .PAS部分。这样我们就可以重现您的问题。 我认为发生的情况是,您的数据库正在使用某种形式的Unicode编码,而Delphi方面认为编码是UTF-16,因此期望WideString - Jeroen Wiert Pluimers
1个回答

1

TStringField 更改为 TWideStringField

object SQLDataSet: TSQLDataSet
    GetMetadata = False
    CommandText = 'select * from MyTable'
    MaxBlobSize = -1
    Params = <>
    SQLConnection = mySQLConnection

    object SQLDataSetID: TIntegerField
      FieldName = 'ID'
      ProviderFlags = [pfInUpdate, pfInWhere, pfInKey]
      Required = True
    end
    object SQLDataSetNAME: **TWideStringField**
      FieldName = 'NAME'
      Required = True
      Size = 50
    end
end

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