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;