勇芳软件工作室.汉化:  SQLite3 API Functions > General >

sqlite3_mprintf

Previous pageReturn to chapter overviewNext page

描述

 

格式化并将一系列字符和 值写入从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;

}