2013-03-19 59 views
3

我遇到了使用LiveCode的问题,但我不知道问题出在哪里,或者是否与ODBC驱动程序有关。使用LiveCode通过ODBC从SQL Server检索unicode数据

LiveCode中内置的应用程序通过ODBC定期连接到SQL Server数据库,以检索各种数据。

负责该数据库的应用程序正在升级,并作为其中的一部分,所有的文本字段都被转化为Unicode文本字段。实质上,这意味着之前定义为varchar的字段现在被定义为nvarchar,而之前定义为文本的字段现在定义为ntext。 (这是顺便说一下SQL Server 2008中。)

使用我们一直在过去使用的查询,我们现在得到一个字符(在该领域的第一个字符),而不是整个文本。我可以解决这个现在在选择查询指定转换为varchar,例如当用来制造像 SELECT ID的请求的应用程序,名字从TAB1 现在使得像 SELECT ID的请求,转换(VARCHAR (255),name)AS name FROM tab1

这就行得通 - 我找回了我以前得到的东西 - 但(a)它很笨拙,(b)现在很好,当客户端正在迁移所有现有的数据存入数据库,但迟早他们可能会利用这种升级的方式在字段中输入一些Unicode字符,然后我大概不会把它们拿出来。

不幸的是我没有访问数据库或应用程序,以便插入测试数据 - 但我假设会出现这样的问题 - 最有可能不会很明显,即有将只是一个微妙的问题,我的应用程序不处理输入的数据(但认为是)。

所以:是有办法,一个LiveCode应用程序,使用当前的ODBC驱动程序,可以从一个nvarchar或ntext字段检索正确完整的数据?

+0

您目前使用哪些代码从数据库中提取数据? – runrevmark 2013-03-20 13:11:55

+0

查看以下Monte的答案 - 真正使用'revdb_query','revdb_movenext'和'revdb_columnbynumber',但是尝试使用'revQueryDatabase' /'revMoveToNextRecord' /'revDatabaseColumnNumbered'来代替,并且产生了相同的(错误的)结果。 在同一数据库的测试应用程序中使用'revDataFromQuery'确实会检索完整的数据,但不幸的是在这个应用程序中不是一个简单的选项。 – 2013-03-21 12:39:21

+0

你在使用revDatabaseColumnNumbered()的结果,还是在第三个参数中使用“持有者变量”?由于UTF-16是二进制数据,因此不能使用结果。 – runrevmark 2013-03-21 13:22:32

回答

0

嗯。取决于转换发生的位置。我没有处理这一个,所以采取一粒盐......

如果整个unicode结果是通过odbc驱动程序和LiveCode的db层的方式,那么你应该能够unidecode结果。它看起来像回来了双字节字符,第二个字节是零,如果它被视为单字节字符,它将无效终止字符串。如您所述,这是在SQL请求中转换为varchar时发生的情况。

如果转换发生在odbc图层或LC的db图层中,那么在运行到开源并且可以重写以处理unicode之前,您是不走运的。

所以,我要说不做转换为varchar,试图研究它之前unidecode的结果,你有看到你所期望的一个很好的机会。

1

是否有可能使用revDataFromQuery而不是更健壮的revQueryDatabase?我不使用revDataFromQuery,但我的猜测是它使用不支持UTF16的c字符串函数。

+0

[对不起,SO编辑限制犯规] 其实它看起来是相反的。我现在使用一般SQL工具检索示例数据(我没有交互式访问此数据库 - 可以将编译的应用程序放在有权访问的框中)。针对您的评论,我检查了两个应用程序(两年前我写过这两个应用程序):真正的应用程序没有获取Unicode数据,它使用revdb_query/revdb_columnbynumber/revdb_movenext;而成功检索数据的杂乱工具使用revDataFromQuery。 – 2013-03-21 09:30:18

+0

关于什么是新的和什么是新名称,文档似乎有点困惑:'revQueryDatabase'被认为是'revdb_query'的同义词,而'revMoveToNextRecord'和'revDatabaseColumnNumbered'被记录为新函数,与'revdb_movenext'和' revdb_columnbynumber'。 @Monte - 你似乎对内部知识有所了解 - 这是一个文档混淆,还是有可能虽然revQueryDatabase只是一个同义词,但同一套件的其他部分已经以更复杂的方式重新实现了? – 2013-03-21 09:35:31

+0

我不知道内部。我正在猜测。这两个应用程序的查询是否相同? – 2013-03-21 12:05:27

0

因此,为了所有人都能看到这个问题:事实证明,如果我只是阅读正确的文档,我应该想出这个问题 - 是我在简单中使用了revDatabaseColumnNumbered模式 -

put revDatabaseColumnNumbered(iConnID, iColNum) into tData 

...但是该模式只能返回文本,这不是我们在这里所实现的,而是二进制数据。因此,解决办法是使用第二模式,

get revDatabaseColumnNumbered(iConnID, iColNum, "tData") 

...在这一点就得到了完整的Unicode数据,然后可以决定用它做什么。根本没有revQueryDatabase代码路径的问题,只是我的错误在我如何使用revDatabaseColumnNumbered

感谢所有试图帮助我的人!