gpt4 book ai didi

c++ - 将数据库中的数据正确加载到编辑控件中,以便我可以执行 ADO 查询

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:46:30 25 4
gpt4 key购买 nike

简介及相关信息:

我有一个 MS Access 2007 数据库,其中包含一个包含 string 字段和 numerical 字段的表。 numerical 字段是 double 类型,可以为负数或正数。

我使用 ADO 连接到数据库并使用 SetDialogItemText API-edit 将其数据加载到 edit 控件中> 控件位于 对话框 中。

用户可以编辑现有数据的值(保存更改时,我使用 GetDialogItemText API 从 edit 控件获取数据)。

问题:

如果用户使用英语或美国语言环境,我的程序一切正常,但如果用户选择欧洲语言环境,那么我的ADO string不正确并报告错误。

这是预期的,因为在英文版本中它有 2 个参数 - string 和一个 double 但由于欧洲人使用逗号作为小数点 (例如美国 123.456123,456 )ADO 将其解释为具有 3 个参数 而不是两个 - 例如:

INSERT INTO table VALUES ( 'some string', 12.5 ); ---> 美国语言环境

INSERT INTO table VALUES ( 'some string', 12,5 ); ---> 错误! 3个参数代替2个

更彻底地解释:

假设我们已经使用欧洲 语言环境将数据从数据库加载到编辑控件中:

第一个包含string(Some string)和第二个十进制数(123,456)。

假设用户将 string 值更改为 Some other string 并按下 Save 按钮。

现在我的代码从 edit 控件中获取值,但错误一定会发生,因为我从第二个编辑控件中获取了 123,456(记住,用户保留了十进制数据不变 ),并且我的 ADO string 没有正确配置,因为现在它看起来像这样:

INSERT INTO table VALUES ( 'Some other string', 123,456 );-->错误! 3个参数

我的问题:

如果用户设置了欧洲语言环境,是否有办法从 MS Access 2007 数据库加载decimal 值到逗号编辑控件 changed 变成点?

或者也许我可以通过某种方式子类化编辑控件将逗号更改为点?

通过 sublclassing edit 控件可以将用户输入限制为点和字母,这样就不会出现问题。我只是想正确地从数据库加载数据,所以如果用户决定不编辑十进制数据,我的ADO string 可以无错误地执行,就像我在上面描述的例子中那样。

谢谢。

最好的问候。

最佳答案

这里有两个问题。我将使用两种语言环境进行说明:

英语(加拿大)-- EN-CA:使用 . 作为小数点分隔符
法语(加拿大)——FR-CA:使用,作为小数点分隔符

和少量 VBScript 代码(因为我没有 C++)。

问题 1:十进制数字与区域设置感知字符串之间的转换。

VBScript

x = 3/2
WScript.Echo x

当 Windows 区域设置为 EN-CA 时显示 1.5,当 Windows 区域设置为 FR-CA 时显示 1,5。该文本就是您在编辑框中看到的内容。

假设用户保持字符串不变。与其尝试使用十进制数的字符串表示,不如使用区域感知方法将字符串转换回实际的十进制数:

对于 EN-CA:

x = CDbl("1.5") + 1
WScript.Echo x

显示 2.5 表示字符串“1.5”在加 1 之前已成功转换为 Double

对于 FR-CA:

x = CDbl("1,5") + 1
WScript.Echo x

显示 2,5 表示字符串“1,5”在加 1 之前已成功转换为 Double

总结:当您从用户那里收到一个数字的文本表示时,您需要将该字符串转换(即解析)为实际的数字数据类型,并且解析机制必须是区域设置感知的。

问题 2:将号码存储在数据库中。

这里的问题是 Access SQL 不支持区域设置;它只会“说”美国英语。因此,如果您尝试在 FR-CA 下“粘合”一个 SQL 命令

x = 3/2
sql = "INSERT INTO Table1 (DoubleField) VALUES (" & x & ")"
WScript.Echo sql

您得到 INSERT INTO Table1 (DoubleField) VALUES (1,5) 并且失败了,正如您所发现的。

这里的解决方案是不要将 SQL 命令“粘合在一起”(无论如何这是一件坏事,因为 SQL 注入(inject)漏洞和其他麻烦)。相反,使用参数化查询:

Option Explicit
Dim con ' ADODB.Connection
Dim cmd ' ADODB.Command
Dim prm ' ADODB.Parameter
Dim x
Const adDouble = 5
Const adParamInput = 1

' test data:
' the following statement is valid when
' the Windows locale uses "," as the decimal separator
x = CDbl("1,5")

Set con = CreateObject("ADODB.Connection")
con.Open _
"Driver={Microsoft Access Driver (*.mdb, *.accdb)};" & _
"Dbq=C:\__tmp\main.accdb;"
Set cmd = CreateObject("ADODB.Command")
cmd.ActiveConnection = con
cmd.CommandText = "INSERT INTO Table1 (DoubleField) VALUES (?)"
Set prm = cmd.CreateParameter("?", adDouble, adParamInput, , x)
cmd.Parameters.Append prm
cmd.Execute
Set prm = Nothing
Set cmd = Nothing
con.Close
Set con = Nothing

关于c++ - 将数据库中的数据正确加载到编辑控件中,以便我可以执行 ADO 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21395499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com