Delphi中使用SqliteTable3的问题,折腾一下午

使用第三方的Sqlite操作类库,插入时采用了参数方式,因为直接写SQL各种单引号要命

问题:字符串总是写进去一半

思考:每次一半考虑编码问题

 

解决思路:先不用参数方式,直接拼SQL语句,写入成功,所以考虑参数写入方式,跟踪相关参数绑定的函数

 

sqlite3_bind_text16  (sqlite3.dll)

sqlite3_bind_text     (sqlite3.dll)

 

从字面意思理解,一个是双字节格式的字符串,一个是单字节格式的字符串

 

下面的是SqliteTable3.pas相关函数,绑定参数用的,红色是原语句,绿色是修复后的,插入正常了(Delphi XE10.3)

procedure TSQLiteDatabase.SetParams(Stmt: TSQLiteStmt);
var
n: integer;
i: integer;
par: TSQliteParam;
begin
try
for n := 0 to fParams.Count - 1 do
begin
par := TSQliteParam(fParams[n]);
i := sqlite3_bind_parameter_index(Stmt, PAnsiChar(AnsiString(par.name)));
if i > 0 then
begin
case par.valuetype of
SQLITE_INTEGER:
sqlite3_bind_int64(Stmt, i, par.valueinteger);
SQLITE_FLOAT:
sqlite3_bind_double(Stmt, i, par.valuefloat);
SQLITE_TEXT:
//sqlite3_bind_text16(Stmt, i, PChar(par.valuedata),
// length(par.valuedata), SQLITE_TRANSIENT);
sqlite3_bind_text(Stmt, i, PAnsiChar(Utf8String(par.valuedata)),
length(Utf8String(par.valuedata)), SQLITE_TRANSIENT);
SQLITE_NULL:
sqlite3_bind_null(Stmt, i);
end;
end;
end;
finally
ParamsClear;
end;
end;

posted @ 2020-03-28 15:41  古城浪子  阅读(743)  评论(0编辑  收藏  举报