描述
格式化并将一系列字符和 值写入从sqlite3_malloc获取的内存中。这两个函数返回的字符串应由sqlite3_free释放。如果sqlite3_malloc无法分配足够的内存来保存结果字符串,则两个函数都将返回NULL指针。
C / C ++语法
char *sqlite3_mprintf(const char*,...); |
PB语法
FUNCTION sqlite3_mprintf ( _ BYREF szFormat AS ASCIIZ, _ OPTIONAL BYREF ANY, BYREF ANY, BYREF ANY, BYREF ANY, _ BYREF ANY, BYREF ANY, BYREF ANY, BYREF ANY, BYREF ANY, _ BYREF ANY, BYREF ANY, BYREF ANY, BYREF ANY, BYREF ANY, _ BYREF ANY, BYREF ANY _ ) AS DWORD |
参数
szFormat
[in]szFormat字符串和后续参数与sqlite3_snprintf一起使用以生成最终的输出字符串。szFormat字符串不能为NULL。
返回值
指向生成的字符串。
备注
sqlite3_mprintf实现了一些对构建SQL语句有用的其他格式化选项。所有通常的的printf格式选项都适用。另外还有“%q”,“%Q”和“%z”选项。
%q选项的工作方式与%s一样,它代替参数列表中的一个以nul为终止的字符串。但是,%q也会将每个“\\”字符加倍。%q设计用于字符串文字内。通过将每个“\\”字符加倍,它转义该字符并允许将其插入到字符串中。
例如,假设字符串变量szText包含如下文本:
szText = "It's a happy day!"
可以在SQL语句中使用此文本,如下所示:
DIM pszSQL AS ASCIIZ PTR
pszSQL = sqlite3_mprintf("INSERT INTO table VALUES('%q')", szText)
sqlite3_exec(pDb, @pszSQL, BYVAL 0, BYVAL 0, BYVAL 0)
sqlite3_free(pszSQL)
因为使用了%q格式的字符串,所以szText中的'\\'字符被转义,生成的SQL如下所示:
INSERT INTO table1 VALUES('It''s a happy day!')
这是对的。如果我们使用%s而不是%q,则生成的SQL将如下所示:
INSERT INTO table1 VALUES('It's a happy day!');
第二个例子是SQL语法错误。作为一般规则,当将文本插入字符串文字时,您应始终使用%q而不是%s。
%Q选项的工作方式与%q类似,除了在整个字符串的外部添加单引号。另外,如果参数列表中的参数是NULL指针,则%Q替换文本“NULL”(不带单引号)。所以,例如,可以说:
DIM pszSQL AS ASCIIZ PTR
pszzSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText)
sqlite3_exec(pDb, @pszSQL, BYVAL 0, BYVAL 0, BYVAL 0)
sqlite3_free(pszSQL)
上面的代码将在zSQL变量中呈现正确的SQL语句,即使zText变量是NULL指针。
“%z”格式化选项的工作方式类似于“%s”,但是除了在字符串被读取并复制到结果之外,在输入字符串上调用sqlite3_free.
C ++实现代码
/*
** Print into memory obtained from sqlite3_malloc()(). Omit the internal
** %-conversion extensions.
*/
SQLITE_API char *sqlite3_mprintf(const char *zFormat, ...){
va_list ap;
char *z;
#ifndef SQLITE_OMIT_AUTOINIT
if( sqlite3_initialize() ) return 0;
#endif
va_start(ap, zFormat);
z = sqlite3_vmprintf(zFormat, ap);
va_end(ap);
return z;
}
/*
** Print into memory obtained from sqlite3_malloc(). Omit the internal
** %-conversion extensions.
*/
SQLITE_API char *sqlite3_vmprintf(const char *zFormat, va_list ap){
char *z;
char zBase[SQLITE_PRINT_BUF_SIZE];
StrAccum acc;
#ifndef SQLITE_OMIT_AUTOINIT
if( sqlite3_initialize() ) return 0;
#endif
sqlite3StrAccumInit(&acc, zBase, sizeof(zBase), SQLITE_MAX_LENGTH);
acc.useMalloc = 2;
sqlite3VXPrintf(&acc, 0, zFormat, ap);
z = sqlite3StrAccumFinish(&acc);
return z;
}