Datasnap问题(显示错误字段类型的数据集)

时间:2014-03-19 16:01:37

标签: delphi datasnap

我基本上遵循这个例子: http://www.youtube.com/watch?v=B4uxLLIUddg

新 - >其他 - > Datasnap Server - > VCL表格申请表 (所有默认设置,端口211正常工作,TDSServerModule)。

然后在SQLite中创建了一个表:

CREATE TABLE [T1] (
  [ID] INTEGER PRIMARY KEY AUTOINCREMENT, 
  [DATE] DATE, 
  [TIME] TIME);

在我的ServerMethodsUnit1上,我删除了一个TSQLConnection。 将驱动程序更改为Sqlite。 删除了LoginPrompt。 连接正常。 添加了TSQLDataset并将其连接到我的SQLITECONNECTION。 将CommandText设置为我的T1(表名)。 让它活跃而没有问题。 添加了datasetprovider1并将其排列到我的数据集(表T1)。 全部保存。 运行服务器没有问题。随着服务器的运行,我构建了客户端:

在我的项目中,我添加了一个新项目(vcl表单应用程序)。 添加了SQLConnection组件。 将其驱动程序名称设置为Datasnap。 删除了loginprompt。 在表单上我删除了DSProviderConnection1。 将它连接到我的sqlconnection。 将其ServerClassname设置为TServerMethods1。 测试连接 - 两者都可以正常工作。 删除了Clientdataset。将其RemoteServer属性连接到DSProviderConnection1的属性。 ProviderName到DataSetProvider1。 连接成功。 Clientdataset处于活动状态。 添加了一个DataSource.Linked到我的Clientdataset。 所有连接都有效。所以我添加了一个GUI。 丢弃了TDBGrid和TDBNavigator。将它们链接到Datasource1。 我注意到的第一个奇怪的事情是所有字段都显示Widememo。 为什么这个领域完全不同,我不知道。 去了字段编辑器,添加字段和检查BlobType时 全部显示ftWideMemo。

enter image description here

我试图直接在网格中插入今天的日期,并以某种方式在我的数据库中结束:1899-12-30。 检查表(服务器端的T!),DATE和TIME字段也显示widememo。

我在这里缺少什么?

3 个答案:

答案 0 :(得分:0)

SQlite打字非常松散。 日期和时间不是SQLite的一部分。 而且DBGrids不知道如何处理SQLite TEXT。

我解决这个问题的方法是在定义字段时使用VARCHAR(长度)而不是TEXT。 然后那些将在DBGrid中显示OK。我也把日期作为VARCHAR()。

另见

在Delphi的TDBGrid中显示和编辑MEMO字段 http://delphi.about.com/library/weekly/aa030105a.htm

答案 1 :(得分:0)

no such native DATE nor TIME type in SQlite3

  

SQLite没有为存储日期留出的存储类   和/或时间。相反,SQLite的内置日期和时间函数   能够将日期和时间存储为TEXT,REAL或INTEGER   值:

     
      
  • TEXT as ISO8601 strings(" YYYY-MM-DD HH:MM:SS.SSS")。
  •   
  • 真实的朱利安日数,即公元前4714年11月24日格林威治中午以来的天数。根据预示   阳历。
  •   
  • INTEGER as Unix Time,自1970-01-01 00:00:00 UTC以来的秒数。
  •   
     

应用程序可以选择在任何这些中存储日期和时间   使用内置日期格式和格式之间自由转换   时间函数。

同时确保您理解"类型亲和力" SQlite3列的功能 - 这是非常强大的,但如果你来自一个"强类型" RDBMS。

你能做的是

  • 使用Unix时间和INTEGER列 - 请参阅 DateUtils.pas 单元中的UnixToDateTime函数;
  • 或TEXT列和ISO-8601编码(我的首选)。

然后你必须在DataSnap中映射这个值 - 我知道我们mORMot units允许这个,我不完全知道DataSnap。

另外看一下非常完整的at all integrated date/time functions in SQlite3

答案 2 :(得分:0)

我遇到了同样的问题,因为我的所有SQLite字段都显示为DBGrid中的WideMemo字段。

一个简单的解决方案是使用至少一(1)行''来填充相应的sqlite表。数据(没有空字段)。 当VCL组件连接时(第一次),它们似乎能够创建具有正确类型的字段。也就是说,如果右键单击TSQLDataSet组件并选择Fields Editor - >使用至少有一行数据的表创建字段,字段将被正确映射。

我没有检查它是否适用于DATE类型,但它确实适用于整数,双精度和文本。

出于某种原因,如果表为空,则所有字段都将创建为WideMemo blob。