我正在开发一个使用ODBC进行数据访问的传统C ++应用程序。来自C#背景,我真的很想念ADO风格的数据访问。
我正在编写一个包装器(因为我们实际上不能使用ADO)来减少数据访问的痛苦。这意味着没有char
数组,没有手动文本blob流,也没有明确的列绑定。
我正在努力解决如何存储/返回数据值的问题。至少在C#中,您可以声明object
并将其转换为任何内容(只要该类型是可转换的)。
我当前的C ++解决方案是使用boost::any
将数据值存储在自定义DataColumnValue
对象中。此类具有转换和赋值运算符,适用于我们的应用程序中使用的各种类型(超过10个)。这里有一点复杂性,因为如果您在int
中存储boost::any
并尝试boost::any_cast<long>
,则会获得boost::bad_any_cast
。客户端对象不必知道值是如何在内部存储的。
有没有人有尝试存储/返回其类型仅在运行时已知的值的经验?有更好/更清洁的方式吗?
答案 0 :(得分:1)
我在当天的一些一次性项目中使用OTL(http://otl.sourceforge.net/)来连接C ++和一些SQL Server数据库。它是基于流的,因此它可以为您进行类型转换。我确实发现流范例有时令人困惑,因为我必须在查询顺序中取消流的值 - 我从来没有想过如何从记录流中提取命名值。
但除此之外它完美无瑕。
关于Boost.Any,之前我已经实现了类似的结构,将COM Variant复制为C ++联合。使用Boost.Variant / Any你可能需要添加额外的模板特化以支持你正在尝试的特定数据类型转换(long毕竟不是int)。除了类型数量的可扩展性之外,我认为您的方法没有任何特别的缺点。