obsidian/笔记文件/2.笔记/ExecuteScalar和Execute区别.md
2025-05-10 18:40:04 +08:00

1.9 KiB
Raw Permalink Blame History

#sql #unity/日常积累

!Pasted image 20250510173018.png

场景 1获取表记录数正确用法

// ✅ 正确使用 ExecuteScalar
public int GetUserCount()
{
    string sql = "SELECT COUNT(*) FROM Users";
    return _db.ExecuteScalar<int>(sql); // 直接返回整数
}

// ❌ 错误用法(用 Execute 会返回受影响行数,此处永远返回 0
public int GetUserCount_Wrong()
{
    string sql = "SELECT COUNT(*) FROM Users";
    return _db.Execute(sql); // 错误!返回的是 0
}

场景 2删除过期数据

// ✅ 正确使用 Execute
public int DeleteExpiredUsers()
{
    string sql = "DELETE FROM Users WHERE LastLogin < datetime('now','-1 year')";
    return _db.Execute(sql); // 返回被删除的行数
}

// ❌ 错误用法(用 ExecuteScalar 会返回 null
public void DeleteExpiredUsers_Wrong()
{
    string sql = "DELETE FROM Users WHERE ...";
    var result = _db.ExecuteScalar<object>(sql); // 无意义操作
}

4. 特殊场景注意事项

参数化查询防 SQL 注入

// ✅ 安全方式
public int GetAdultsCount(int minAge)
{
    string sql = "SELECT COUNT(*) FROM Users WHERE Age > ?";
    return _db.ExecuteScalar<int>(sql, minAge);
}

// ❌ 危险方式(直接拼接字符串)
public int GetAdultsCount_Unsafe(int minAge)
{
    string sql = $"SELECT COUNT(*) FROM Users WHERE Age > {minAge}"; // SQL 注入风险
    return _db.ExecuteScalar<int>(sql);
}

5.事务中的使用

public void BatchUpdate()
{
    _db.RunInTransaction(() =>
    {
        // 混合使用两种方法
        int count = _db.ExecuteScalar<int>("SELECT COUNT(*) FROM Logs");
        if (count > 1000)
        {
            int deleted = _db.Execute("DELETE FROM Logs WHERE Id IN (SELECT Id FROM Logs LIMIT 100)");
            Debug.Log($"已清理 {deleted} 条日志");
        }
    });
}

!Pasted image 20250510173323.png