- 主题:我们很多同事都是完全不用unique_ptr,一律shared_ptr
OCI数据库接口,人家只接受C串。
另外,我这个是数据库包装工具库,要能够适应C用户和C++用户。
目的是让码农避免写SQL语句,因为会很多次的重复的对列名(成员名)进行枚举,繁琐易错。这个跟序列化反序列化一样,是泛型程序。
insert into tabname (枚举一遍)values(:占位符,再枚举一遍);
绑定变量,枚举一遍。
赋值,再枚举一遍。
100多个列,列名老长,每个作业,都要好几次SQL,烦不烦屎山代码?
【 在 z16166 的大作中提到: 】
: 如果还需要c_str()这种操作,那说明代码还在用字符串指针,还是用pure C的风格在写代码
: 另外,sprintf()也是pure C的搞法,C++的搞法是std::format()或者fmt::format(),强调编译期的type-safe检查。
:
--
修改:ylh1969 FROM 114.244.128.*
FROM 114.244.128.*
对于52楼的问题,你有何高招,解决一个泛型工具,完成一个通用的SQL操作,简单的,就来一个通用的insert吧。
能够提供的参数有:数据库句柄,表名,含有数据的数据结构,允许使用某种形式的模板。
我的形式如下:
int SQL_insert(数据库句柄,void *data,模板,用于生成语句的buffer);
模板里有表名。buffer是因为我不知道语句需要多长,由用户提供,够长就行。全是指针。
可以让AI弄一下。
【 在 z16166 的大作中提到: 】
: 如果还需要c_str()这种操作,那说明代码还在用字符串指针,还是用pure C的风格在写代码
: 另外,sprintf()也是pure C的搞法,C++的搞法是std::format()或者fmt::format(),强调编译期的type-safe检查。
:
--
修改:ylh1969 FROM 114.244.128.*
FROM 114.244.128.*
53楼,不用指针,玩一个?
【 在 hgoldfish 的大作中提到: 】
: 这种情况怎么会用指针?
: 用值语义非常方便。
: c++ 如今有 move 语义,这种传递数据最佳的方案就是直接返回结果,别让客户把指针传进来。虽然底层也可以理解成指针,但配合 RAII 或者 uniqure_ptr,应用层的程度员不再需要管指针了。
: ...................
--
FROM 114.244.128.*
补充一点,数据库操作,可以使用离散变量或struct。
但是离散变量,我没办法写出通用函数,所以必然要通过一个技术:
Struct Relational Mapping ,相当于JAVA的ORM。结构体与数据库表结构的对应。
另外,如果模板是自动生成,基本不用写列名。手动制作的,写一次就行了,到处用。
【 在 ylh1969 的大作中提到: 】
: 对于52楼的问题,你有何高招,解决一个泛型工具,完成一个通用的SQL操作,简单的,就来一个通用的insert吧。
: 能够提供的参数有:数据库句柄,表名,含有数据的数据结构,允许使用某种形式的模板。
: 我的形式如下:
: ...................
--
修改:ylh1969 FROM 114.244.128.*
FROM 114.244.128.*
简单情况可以。
53楼的函数,最后那个buffer,可以省略,内部创建string,用cstr()提交,用完销毁。
【 在 hgoldfish 的大作中提到: 】
: 值语义没开销的。
: 比如 std::string,在返回结果的时候会自动使用 move 语义优化。
: 传递时,实际上只是复制了个指针,跟你直接用指针一样的开销。
: ...................
--
FROM 114.244.128.*
ok,我慢慢看。步骤差了许多,原理看看行不行。
看起来还是编译期泛型。
【 在 z16166 的大作中提到: 】
: pure C的我没兴趣搞了。
: AI给的modern c++方式的:
: #include <iostream>
: ...................
--
修改:ylh1969 FROM 114.244.128.*
FROM 114.244.128.*
sql注入不用考虑,拼接是内部过程,不对外。
外部只提供数据,才不管语句。
【 在 z16166 的大作中提到: 】
: C++现在还没反射(提案阶段,没正式标准),所以反射struct的字段那个搞法,和pure C是差不多的,但可以用模板。
: sql语句是变参的,用C++的变参模板来拼接sql字符串是最合适的(不考虑拼接字符串可能带来的sql注入漏洞等问题的话)。
:
--
FROM 114.244.128.*
绑定那段,AI完全理解错啦。不是那个操作。
可以考虑模板与struct完全分离。。
【 在 z16166 的大作中提到: 】
: pure C的我没兴趣搞了。
: AI给的modern c++方式的:
: #include <iostream>
: ...................
--
修改:ylh1969 FROM 114.244.128.*
FROM 114.244.128.*
这是由数据库接口确定的,我只能服从。
绑定的数据,只能使用指针。
我看错了,它没有操作绑定,只是cout了,看看而已。
原则上,能判断类型,能找到地址就能绑定。
这是个编译期泛型,要想改成运行期泛型,可以用该办法生成独立模板,通用的功能可以做成运行时库,接受独立的结构和独立的模板即可。
【 在 z16166 的大作中提到: 】
: 就是操作任意struct的任意member field。
: 你想要什么样的绑定操作?
:
--
修改:ylh1969 FROM 114.244.128.*
FROM 114.244.128.*
可以把f做成独立模板。
【 在 z16166 的大作中提到: 】
: f.ptr就是绑定的字段成员的地址啊
: f.name是字段的名字
: cout那些打印是可以无视的,那只是演示怎么用那些数据。
: ...................
--
FROM 114.244.128.*