我正在尝试更新一些代码,我必须使用Binding而不是本机查询。
我正在使用ETL模型加载此数据。
这一切都始于我创建一个包含所有列定义为Text的表。
Create Table TableA ( Col1 Text, Col2 Text);
然后我使用本机查询填充表格,如
INSERT INTO TABLEA ('A', '2');
INSERT INTO TABLEA ('B', 'Bad_VALUE_Not_INT');
然后我创建一个真实的数据表
Create Table RealTableA ( Col1 Text, Col2 Integer);
然后将值插入实际表中并使用错误的数据类型删除那些here
INSERT INTO RealTableA SELECT * FROM TABLEA;
DELETE FROM RealTableA WHERE typeof(col2) != 'integer'
当我编写查询并以原生方式提交查询时,这非常有用。但我现在想要将变量绑定到一个语句而不是使用本地查询,如解释here
因此,我将代码更改为使用sqlite3_bind_text
col2
。
现在,当我使用'text'
进行查询时,SQLite认为typeof(col2)
中的每个值都是sqlite3_bind_value
,这样就会删除一切。
我觉得这很奇怪,因为类型亲和力的例子SQLite有prepared_statement。
如何在不重写初始加载后重写所有ETL查询的情况下解决此问题?
我发现了一个名为numeric
的绑定函数,它的定义听起来像是将SQLite3_value*
绑定到它的值视为我想要的。问题是需要一个{{1}}而且我不能为我的生活找出如何将文件中的文本值转换成文件值。
想法?我采用这种方法了吗?
同样为什么当我绑定值时,它们会得到一个很难的“TEXT”类型,但当我插入“TEXT”列时,它允许其他类型的摆动空间?
注意:我正在使用Visual Studio 2010的C / C ++接口,而我正在使用SQLite的3.7.13版本。
答案 0 :(得分:1)
sqlite3_bind_value
仅适用于您从SQLite获得的值,仅使用用户定义函数的参数。
要绑定除文字以外的其他类型,请使用相应的sqlite3_bind_xxx function,例如sqlite3_bind_int
。