使用 C# 进行面向对象编程:第 9 部分

news2024/9/19 10:51:36

使用 OOP 的用户活动日志

应用程序背后的关键概念

在这一部分中,我们将使用之前学到的一些 OOP 概念。我们将创建一个小型应用程序。在继续之前,请阅读我的文章user-activity-log-using-C-Sharp-with-sql-server/。在本课程中,我们将再次使用以下概念重新设计同一个应用程序。它将帮助我们更清楚地理解这些概念以及如何在我们自己的应用程序中实现它们。

  1. 成员变量
  2. 只读属性
  3. 方法
  4. 目的
  5. 默认构造函数
  6. 构造函数重载

应用详情

在数据库管理系统中跟踪用户活动。特别是在客户端-服务器环境中工作时,我们需要跟踪系统 IP/系统名称、登录 ID、时间戳以及在任何数据库应用程序上执行的操作。用户编辑任何客户端记录或进行转换等。

步骤 1. 创建名为 User_Activity_Log 的表。

CREATE TABLE [dbo].[User_Activity_Log](
      NOT NULL,
    [UAL_Timestamp] [datetime] NOT NULL,
    [UAL_Function_Performed] [nvarchar](100) NOT NULL,
    [UAL_Other_Information] [nvarchar](100) NULL,
    [UAL_IP_Address] [nvarchar](15) NOT NULL,
    PRIMARY KEY CLUSTERED
    (
        [UAL_User_Id] ASC,
        [UAL_Timestamp] ASC
    ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF

步骤 2. 创建登录表。

CREATE TABLE [dbo].Login_Client(
        NULL,
        NULL,
      [LON_Employee_No] [varchar](10) NULL,
      [LON_Login_Password] [varchar](20) NULL,
        NULL,
        NULL
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF

步骤 3. 现在在登录表中插入一条记录。

INSERT INTO PSH.[dbo].[Login_Client]
VALUES ('Naveed Zaman', 'naveed.zaman', '22339', 'khan@123', 'A', 'Active')

步骤 4. 启动Visual Studio并创建一个名为“UserActivityLog_OOP_Concept”的新桌面项目。


步骤 5. 首先,我们创建登录表单,这将有助于我们理解主题的基本概念。创建如图所示的表单。


步骤 6. 创建另一个名为frmActivity的表单。


步骤 7. 现在添加一些按钮。例如,在表单上添加“添加新”、“保存”、“放弃”和“注销”按钮,如下图所示。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤 8. 添加一个名为“Main”的新类。


步骤 9. 现在我们将创建函数 GetDBConnection。它是一个公共函数,因此可以从项目中的任何位置访问它。但您必须修改与您自己的设置相关的数据源设置。

例如

SQL Server 实例名称。(.\CRMIS)
SQL Server 用户名和密码。(用户 ID sa 密码。###Reno123)
初始目录 = PSH (数据库名称)
将公共静态类添加到“Main.cs”。

public static SqlConnection GetDBConnection()
{
    SqlConnection conn = new SqlConnection(
        "Data Source=.\\CRMIS;Initial Catalog=PSH;User ID=sa;Password=###Reno321");
    return conn;
}

步骤 10. 现在我们将创建另一个类登录,它将帮助我们验证用户的授权。提供用户名和密码后。


步骤 11. 在类登录中插入以下代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;

namespace UserActivityLog_OOP_Concept // 命名空间,用于组织代码
{
    class Login // 定义一个Login类
    {
        // 静态字段,用于存储用户ID
        static string userid;
        // 静态字段,用于存储密码
        static string password;
        // 静态字段,用于存储IP地址
        static string ip;
        // 公有字段,用于存储员工编号
        public string EmpNo = string.Empty;
        // SqlConnection对象,用于数据库连接
        SqlConnection con = Main.GetDBConnection();

        // 默认构造函数
        public Login() {}

        // 带参数的构造函数
        public Login(string _userid, string _password, string _ip) {
            // 初始化userid字段
            userid = _userid;
            // 初始化password字段
            password = _password;
            // 初始化ip字段
            ip = _ip;
        }

        // 属性,用于获取用户ID
        public string getidinfo {
            get {
                return userid;
            }
        }

        // 属性,用于获取密码
        public string getpassinfo {
            get {
                return password;
            }
        }

        // 属性,用于获取IP地址
        public string getipinfo {
            get {
                return ip;
            }
        }

        // 验证方法,用于验证用户凭证
        public string Validation() {
            try {
                // 创建DataTable对象,用于存储查询结果
                DataTable consultanttable = new DataTable();
                // 定义SQL查询语句
                string SQL = @"SELECT LON_Employee_No FROM Login_Client where LON_Login_Name = '" + userid + "' AND LON_Login_Password = '" + password + "'";
                // 创建SqlDataAdapter对象,用于执行查询并填充DataTable
                SqlDataAdapter Consultantdataadapter = new SqlDataAdapter(SQL, con);
                // 填充DataTable
                Consultantdataadapter.Fill(consultanttable);
                // 遍历查询结果
                foreach(DataRow myrow in consultanttable.Rows) {
                    // 获取员工编号
                    EmpNo = (myrow[0].ToString());
                }
            } catch (InvalidCastException e) {
                // 捕获并重新抛出异常
                throw (e);
            }
            // 返回员工编号
            return EmpNo;
        }
    }
}

请仔细检查代码。


我们创建了类 login,并在该类中定义了四个成员变量,其中三个是静态的,一个是公共的。我们已经在之前的文章中讨论过访问修饰符。之后,我们创建了在步骤 6 中定义的类 Main 的对象图标。它将帮助我们在 C# 和 SQL Server 之间建立连接。

之后我们定义了一个Login类的默认构造函数,并用两个参数重载了该构造函数。

理解重载构造函数的重要性非常重要。每当我们用两个参数(用户 ID 和密码)创建类的对象时,它都会被初始化。我们还定义了一个默认构造函数,当我们需要一个没有参数的类对象时,它将为我们提供帮助。


此外,我们定义了类登录的只读属性,这将有助于我们读取成员变量。


在本次课程中,我们定义了一个类登录的方法验证,它将帮助我们验证登录信息并返回 EmpNo。

步骤 12. 请在UserActivityLog类中插入以下代码。

区块A

  • 我们定义了两个成员变量。
  • 我们定义了 User_Activity_Log 类的构造函数,它有两个参数,用于初始化该类的成员变量。

B座

  • 方法任务将用于将数据插入数据库,因此我们需要在主类上使用图标名称创建对象。
  • 使用插入语句,我们可以将新行插入数据库,该数据库将获取参数操作,可以是“登录”,“添加新”,“保存”等等。

步骤 13. 请在表格中插入以下代码。

区块A

  • 我们已经初始化了表单的位置。
  • 字符串变量主机通过名称查找主机系统。
  • 获取与主机关联的 IP 地址列表。
  • 将 IP 地址分配给 CIP。
  • lblCP.文本将 IP 地址分配给将显示 IP 信息的标签。

B座

关闭登录窗口。

C 座

检查文本框是否不为空。

D 座

  • 创建对象 LG,它将使用三个参数激活类登录的构造函数。
  • 使用对象 LG 调用方法验证。
  • 使用“LG.EmpNo”公共变量我们可以正确检查用户和密码。
  • 如果信息不正确,则显示消息框。
  • 如果信息正确,那么我们将创建 UserActivityLog 类的对象“alog”;它调用具有四个参数的构造函数。
  • 使用“log”对象,我们调用将数据插入数据库的方法任务。
  • FrmActivity创建表单的对象。
  • 使用对象名称加载表单依然存在。

步骤 14. 将以下代码插入FrmActivity表单。


区块A

  • 我们已经初始化了表单的位置。
  • 我们为 UserActivityLog 类创建对象“alog”,它将使用三个参数初始化 UserActivityLog 类的成员变量,参数的值是登录类的属性。
  • 下一步是使用 UserActivityLog 类的方法“task”及其参数“添加新记录”。
    B座
  • 我们已经初始化了表单的位置。
  • 我们为 UserActivityLog 类创建一个对象“alog”,它将使用三个参数初始化 UserActivityLog 类的成员变量,参数的值是登录类的属性。
  • 下一步是使用 UserActivityLog 类的方法“task”和参数“保存记录”。
    区块 C、D 和 E 也同样如此。

步骤 15 现在按 F5。您将看到登录屏幕;只需输入即可。

  • 用户名: Naveed.zaman
  • 用户名: khan@123


单击登录按钮。


现在按“添加新”按钮、“保存”按钮、“放弃”按钮,然后按“登录”按钮。

步骤 16 现在打开SQL Server表;您将得到如下结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1814996.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python实现base64加密/解密

实现原理:导入base64库 一、加密 import base64# 加密 username "admin" base64_username base64.b64encode(username.encode(utf-8)).decode() print(base64_username) password "123" base64_password base64.b64encode(password.encod…

Vue23-过滤器

一、效果图 二、好用的时间戳三方工具 该三方工具比较大 推荐使用 dayjs的用法: 三、过滤器的使用 3-1、计算属性实现 3-2、methods函数实现 3-3、过滤器filters属性实现 过滤器的本质就是函数!!! 1、过滤器-未传参 默认将管道…

MySQL常用命令(Linux环境)

一、数据定义语句(DDL) 数据库操作 ●登录数据库: mysql -uroot -proot ●创建数据库: create database test ●查看所有数据库: show databases ●选择数据库并使用: use test ●查看所有数据表: show tabl…

【MySQL】性能分析

https://www.bilibili.com/video/BV1Kr4y1i7ru/?p78 查看执行频次 查看当前数据库的 INSERT, UPDATE, DELETE, SELECT 访问频次: SHOW GLOBAL STATUS LIKE Com_______; 或者 SHOW SESSION STATUS LIKE Com_______; 慢查询日志 慢查询日志记录了所有执行时间超过指…

Vue2后台管理:项目开发全流程(二)

​🌈个人主页:前端青山 🔥系列专栏:vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:Vue2后台管理:项目开发全流程(二) 目录 功能实现 8、会员用户管理 ①使用数据模拟文…

国标GB/T 28181详解:事件通知流程详细解释

目录 一、定义 二、特点和作用 1、系统事件的实时性 2、整个系统数据变化的协同性 3、智能化应用 4、可管理性 5、安全性 6、灵活和实用性 三、基本要求 1、事件订阅通知基本要求 2、关键要素 四、命令流程 1、流程图 2、流程描述 五、协议接口 六、实际应用效…

大众点评全国亲子POI采集46万家-2024年5月底

大众点评全国亲子POI采集46万家-2024年5月底 店铺POI点位示例: 店铺id H1IZ2B7vPGVGfbFJ 店铺名称 儿童天堂旗舰店(全国总店) 十分制服务评分 9.2 十分制环境评分 9.1 十分制划算评分 9.1 人均价格 4624 评价数量 17003 店铺地址 八一路金渝大厦1楼&#x…

流媒体传输协议HTTP-FLV、WebSocket-FLV、HTTP-TS 和 WebSocket-WS的详细介绍、应用场景及对比

一、前言 HTTP-FLV、WS-FLV、HTTP-TS 和 WS-TS 是针对 FLV 和 TS 格式视频流的不同传输方式。它们通过不同的协议实现视频流的传输,以满足不同的应用场景和需求。接下来我们对这些流媒体传输协议进行剖析。 二、传输协议 1、HTTP-FLV 介绍:基于 HTTP…

ESP RainMaker®为企业提供AIoT云解决方案,启明云端乐鑫代理商

在AIoT的浪潮中,企业面临着前所未有的机遇与挑战。如何快速响应市场变化,开发出具有竞争力的智能产品?如何确保数据安全,同时实现高效的设备管理?这些问题,ESP RainMaker给出了答案。 ESP RainMaker是一个…

鸿蒙开发:通过startAbilityByType拉起垂类应用

通过startAbilityByType拉起垂类应用 使用场景 开发者可通过特定的业务类型如导航、金融等,调用startAbilityByType接口拉起对应的垂域面板,该面板将展示目标方接入的垂域应用,由用户选择打开指定应用以实现相应的垂类意图。垂域面板为调用…

404 页面代码

<template> <div class"container"><h1>404</h1> <div ><p class"text-center">当前页面无法访问,可能没有权限或已删除</p><p class"text-center"> 去别处看看吧</p> </div> <…

语义分割——mmsegmentation框架使用

目录 1.mmsegmentation简介 2.mmsegmentation安装 3.mmsegmentation使用&#xff08;代码结构介绍&#xff09; 4.mmsegmentation使用实战&#xff08;deeplab v3为例&#xff09; 4.1配置 4.2训练&#xff1a; 4.3预测&#xff1a; 1.mmsegmentation简介 mmsegmentatio…

结合兴趣行业和手头资源来看计算机专业是否还是好的选择,再前行路上FlowUs息流一直陪你成长

在这个数字化时代&#xff0c;计算机专业以其广阔的就业前景和持续的行业需求&#xff0c;依旧是许多有志青年的优选。无论你是被编程的逻辑之美所吸引&#xff0c;还是对人工智能的无限可能充满好奇&#xff0c;选择计算机专业意味着你将踏上一条充满挑战与机遇的道路。而Flow…

橘子叶子病害分类数据集38432张5类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;38432 分类类别数&#xff1a;5 类别名称:["Citrus_Canker_Diseases_L…

有人说C语言99%的代码是可以包含在c++中,那剩下的1%是什么?

关于C语言99%的代码可以包含在C中&#xff0c;这个说法基本上是正确的&#xff0c;但并非完全绝对。至于剩下的1%不兼容的部分&#xff0c;这主要涉及一些C99标准中引入的新特性&#xff0c;这些特性在C中默认是不支持的。以下是一些主要的不兼容点&#xff1a; 刚好我有一些资…

大众点评全国丽人POI采集225万家-2024年5月底

大众点评全国丽人POI采集225万家-2024年5月底 店铺POI点位示例&#xff1a; 店铺id Hav6zIYtzhyyopIZ 店铺名称 防屏蔽 十分制服务评分 8.9 十分制环境评分 8.9 十分制划算评分 8.9 人均价格 210 评价数量 19935 店铺地址 建北一支路观音桥步行街红鼎国际A座9-9 店铺…

【perfetto分析性能学习笔记】

1.perfetto网站 https://ui.perfetto.dev/ 2.快捷键 3.线程状态分析 Runnable 表示线程正在运行或者等待CPU执行 Runnable (Preempted) 表示线程正在运行&#xff0c;但在运行过程中被其他高优先级线程抢占 Running 表示线程正在运行 Uninterruptible Sleep Uninterru…

光电液位传感器可以实现哪些功能

光电液位传感器安装于机器水箱的底部时&#xff0c;它的主要功能是监控水箱内的最低水位。当水位下降至低于传感器的预设水平时&#xff0c;传感器会立即发出信号&#xff0c;提示缺水状态。这一信号可以触发相关设备停止工作&#xff0c;以避免因缺水而导致的设备损坏或故障。…

企业IT运维管理体系-总体规划

企业IT运维管理体系-总体规划 企业IT运维管理体系的总体规划通过科学的调研、分析、设计和建设&#xff0c;提升管理成熟度、增强服务能力、实现技术创新和优化资源配置。重点在于建立组织保障体系、制定运维制度、构建运维平台和完善度量指标。通过明确运维治理模式和外包管理…

开放式耳机哪个品牌比较好?五大公认品牌推荐!

想要购买开放式耳机&#xff0c;但面对众多品牌和型号&#xff0c;你是否感到无从下手&#xff1f;别担心&#xff0c;作为耳机发烧友和测评专家&#xff0c;我为大家带来了几款热门开放式耳机的横向对比。从音质、设计、功能等方面进行详细对比&#xff0c;让你一目了然地了解…