我的产品面向葡萄牙观众,逗号为十进制符号.我通常使用CString :: Format将数字输入字符串,并考虑计算机的区域设置.虽然一般来说这是一个很好的方法,但我在格式化SQL查询方面遇到了问题,例如:
CString szInsert; szInsert.Format("INSERT INTO Vertices (X, Y) VALUES (%f, %f)", pt.X, pt.Y);
当传递值时,我得到这个字符串,这是一个不正确的查询:
INSERT INTO Vertices (X, Y) VALUES (3,56, 4,67)
如何在这些字符串中强制执行点作为小数符号,而不更改区域设置,也不必为每个浮点值创建专用字符串?
注意:这是一般性问题,而不是SQL问题.
不好的想法,你真的应该使用预备语句.使用数字进行SQL注入并不是一件容易的事,但CString :: Format并不是执行参数绑定的正确方法.
(MFC和SQL已经有一段时间了 - 结果证明这是血腥的隐藏.我开始看到我们如何最终得到SQL注入错误,感谢Microsoft.使用原始ODBC,您可以使用SQLPrepare创建一个语句(一次).通过?对于要填写的2个参数.随后,对于每个INSERT调用SQLBindParameter(stmt, 1, &X); SQLBindParameter(stmt, 2, &Y) /*extra parameters omitted, see http://msdn.microsoft.com/en-us/library/ms710963(VS.85).aspx */
.最后,调用SQLExecute以执行操作.)
关于Pukku使用ostringstream的建议的评论:为了使这与locale无关,应该明确地使用所需的语言环境灌输()流:
std::ostringstream s; s.imbue(std::locale::classic()); s << "INSERT INTO Vertices (X, Y) VALUES (" << pt.X << ", " << pt.Y << ")";
否则,使用当前的全局区域设置.
参数化查询应该完全避免这个问题.你应该看看那些.也就是说,你应该可以使用setlocale或类似的方法来改变小数分隔符.