【教程】SourceMod | MySql操作 | 基础入门&进阶应用 图章 图章 代码鉴赏 教学 科普

ELDment 二级用户组 2022-12-5 1731

<前言>

   
前几天我在写插件的时候遇到了数据库请求的问题,整体做下来,
自己也踩了不少坑,希望这篇文章能帮助和我一样不会使用SM数据库操作的人。
感谢@Laper32提供的技术帮助。

<1. 读取并连接指定数据库>

     实例代码:

    Database db;
    char error[256];
    if (SQL_CheckConfig("test"))
    {
        db = SQL_Connect("test", true, error, sizeof(error));
    }else{
        LogError("Could not find setting in database.cfg.");
    }
    if (db == null)
    {
        LogError("[test] Could not connect to database: %s", error);
    }
    SQL_SetCharset(db, "utf8");

     核心应用:

native bool SQL_CheckConfig(const char[] name)
native Database SQL_Connect(const char[] confname, bool persistent, char[] error, int maxlength)
native bool SQL_SetCharset(Handle database, const char[] charset)

     解析:

首先我们声明了一个数据库db

然后声明了一个char用来储存下文报错

然后通过SQL_CheckConfig来判断"test"的配置是否出现在database.cfg中

如果出现,则使用SQL_Connect连接数据库。

参数 const char[] confname bool persistent char[] error int maxlength
解释 不变更的char,也就是database.cfg中的配置头 bool,是否持续连接 char,错误输出 int,最大长度

如果数据库连接为null,则输出char error[256]中储存的报错

使用SQL_SetCharset设置数据库编码

参数 Handle database const char[] charset
解释  Handle,声明的数据库连接 不变更的char,也就是database.cfg中的配置头

<2. SQL查询>

     实例代码:

    DBResultSet rs;
    char query[256];
    Format(query, sizeof(query), "SELECT credits FROM `store_players` WHERE `authid` = '%s'", Steam32);
    if ((rs = SQL_Query(db, query)) == null)
    {
        delete rs;
        delete db;
        LogError("[Test] shop query failed");
        return Plugin_Continue;
    }
    if (rs.RowCount == 0)
    {
        delete rs;
        delete db;
        return Plugin_Continue;
    }

     核心应用:

native DBResultSet SQL_Query(Handle database, const char[] query, int len=-1)
property int RowCount

     解析:

首先我们声明了一个数据库结果rs

然后声明了一个char用来储存下文SQL查询语句

然后通过SQL_Query来进行查询

参数 Handle database const char[] query int len=-1
解释 Handle,声明的数据库连接 不变更的char,sql查询语句 int,查询长度(可选项)

(这里我当时误解了,以为SQL_Query之后就是查询返回的结果,其实返回的是一个新的句柄)

如果rs为null(或INVALID_HANDLE),删除rs,删除db,返回。

通过RowCount获取行数,如果行数==0表示没有查询到结果。删除rs,删除db,返回。

 

<3. 获取返回结果>

     实例代码 :

     实例 (Int):

    SQL_FetchRow(rs);
    int score = SQL_FetchInt(rs, 0);

     实例 (Float):

    SQL_FetchRow(rs);
    float score = SQL_FetchFloat(rs, 0);

     实例 (Char):

    char SQL[256]; 
    SQL_FetchRow(rs);
    SQL_FetchString(rs, 0, SQL, sizeof(SQL));

     核心应用:

native bool SQL_FetchRow(Handle query)
native int SQL_FetchInt(Handle query, int field, DBResult &result=DBVal_Error)
native float SQL_FetchFloat(Handle query, int field, DBResult &result=DBVal_Error)
native int SQL_FetchString(Handle query, int field, char[] buffer, int maxlength, DBResult &result=DBVal_Error)

     解析:

在获取*任何类型*结果前,都必须成功调用SQL_FetchRow()

     (Int):

通过SQL_FetchInt获取返回Int数据

参数 Handle query int field DBResult &result=DBVal_Error
解释 Handle,声明的数据库结果 int,查询结果集中的第n字段(从0开始) Handle,储存返回状态(可选项)

     (Float):

通过SQL_FetchFloat获取返回Float数据

参数 Handle query int field DBResult &result=DBVal_Error
解释 Handle,声明的数据库结果 int,查询结果集中的第n字段(从0开始) Handle,储存返回状态(可选项)

     (Char):

通过SQL_FetchString获取返回Char数据

参数 Handle query int field char[] buffer int maxlength DBResult &result=DBVal_Error
解释 Handle,声明的数据库结果 int,查询结果集中的第n字段(从0开始) char,储存返回结果 int,最大长度 Handle,储存返回状态(可选项)

 

<4. 执行SQL操作>

     实例代码:

    Format(query, sizeof(query), "UPDATE `store_players` SET `credits`= 300 WHERE authid = '%s'", szSteam32);
    if (!SQL_FastQuery(db, query))
    {
        delete db;
        LogError("Report update query failed");
        return Plugin_Continue;
    }

     核心应用:

native bool SQL_FastQuery(Handle database, const char[] query, int len=-1)

     解析:

首先我们先拼接下要执行的SQL语句

然后通过SQL_FastQuery来执行并返回执行结果

参数 Handle database const char[] query int len=-1
解释 Handle,声明的数据库连接 不变更的char,sql查询语句 int,查询长度(可选项)

@return True if query succeeded, false otherwise. 

 

<5. 基础SQL语句>

SELECT
INSERT
UPDATE
DELETE

具体应用请参考:菜鸟教程

 

<6. 进阶玩法>

由于以下sAo操作不常被用于插件中,本人就不编写实例辣!

1.为了避免SM读取到数据库更新过程中的数据,造成错误,可使用(我猜的,参考

nativeintSQL_AddQuery(Transaction txn, constchar[] query, any data=0)

2.多搜索集查询(我猜的,参考

native bool SQL_FetchMoreResults(Handle query)
In some SQL implementations, multiple result sets can exist on one query. This is possible in MySQL with simple queries when executing a CALL query. If this is the case, all result sets must be processed before another query is made.

3.SQL查询预处理(我猜的,参考

native void SQL_BindParamInt(Handle statement, int param, int number, bool signed=true)
native void SQL_BindParamFloat(Handle statement, int param, float value)
native void SQL_BindParamString(Handle statement, int param, const char[] value, bool copy)

4.不读取任何文件进行MySql连接(写死在插件中)

native Handle SQL_ConnectEx(Handle driver,
const char[] host,
const char[] user,
const char[] pass,
const char[] database,
char[] error,
int maxlength,
bool persistent=true,
int port=0,
int maxTimeout=0)

5.读取database.cfg以外的配置文件进行MySql连接

native Database SQL_ConnectCustom(Handle keyvalues,
char[] error,
int maxlength,
bool persistent)

6.不安全字符转义(不怕崩查询其实用不到 >3)

native bool SQL_EscapeString(Handle database,
const char[] string,
char[] buffer,
int maxlength,
int &written=0)

7.执行转备好的语句(不是SQL语句而是一个句柄)

native bool SQL_Execute(Handle statement)

8.查询绑定(不是SQL语句而是一个句柄)

native DBStatement SQL_PrepareQuery(Handle database, const char[] query, char[] error, int maxlength)

9.判断查询是否有结果(仅适用SELECT语句)

native bool SQL_HasResultSet(Handle query)

10.结果集字段是否为空值

native bool SQL_IsFieldNull(Handle query, int field)
Ps. int field从0开始

11.获取返回集字段长度

native int SQL_FetchSize(Handle query, int field)
Ps. int field从0开始

12.用名称检索字段索引

native bool SQL_FieldNameToNum(Handle query, const char[] name, int &field)

13.用索引检索字段名称

native void SQL_FieldNumToName(Handle query, int field, char[] name, int maxlength)

14.获取上次查询所影响的行数

native int SQL_GetAffectedRows(Handle hndl)

15.拼接查询

native int SQL_FormatQuery(Handle database, char[] buffer, int maxlength, const char[] format, any ...)
Ps. 整挺好,字符串拼接都省了 XDD

16.获取字段个数

native int SQL_GetFieldCount(Handle query)

17.获取驱动句柄

native DBDriver SQL_GetDriver(const char[] name="")
Ps. 留空获取默认驱动

18.获取驱动标识

native void SQL_GetDriverIdent(Handle driver, char[] ident, int maxlength)

19.获取驱动产品

native void SQL_GetDriverProduct(Handle driver, char[] product, int maxlength)

20.获取最后查询错误

native bool SQL_GetError(Handle hndl, char[] error, int maxlength)

更多详细说明请见:https://sourcemod.dev/#/dbi

欢迎大家关注我的Github,我会不时分享一些我自己觉得有趣的开源程序。

如文章有错,请大家敬请留言指正;如遇编写问题,欢迎留言讨论!

 


CSGO插件分享-申明 1、本网站名称:CSGO插件分享-中文站  网址:https://bbs.csgocn.net
2、本站的宗旨在于为CSGO玩家提供一个插件分享的中文资源平台,多数插件来源于SourceMod论坛,并配以中文介绍和安装教程。
3、欢迎有能力的朋友共享有趣的CSGO插件资源。
4、本站资源大多为百度网盘,如发现链接失效,可以点: 这里进行反馈,我们会第一时间更新。
最新回复 (4)
返回