解锁C#数据校验:从基础到实战的进阶之路

一、引言:数据校验为何如此重要?

在软件开发的广袤领域中,数据校验宛如一座坚固的堡垒,守护着系统的稳定与安全。它是确保数据质量的关键防线,能有效避免错误数据的流入,进而提升系统的整体性能和可靠性。无论是在金融交易、医疗记录管理,还是电商平台的订单处理等场景中,数据校验都扮演着不可或缺的角色。

想象一下,在一个在线银行系统中,如果没有严格的数据校验机制,用户可能会输入错误的账号信息,导致资金转账错误;或者恶意用户可能会尝试篡改交易数据,引发严重的安全漏洞。这些错误数据不仅会给用户带来直接的经济损失,还会严重损害银行的信誉和声誉。

再比如,在电商平台上,订单数据的准确性至关重要。如果商品数量、价格等信息在传输或存储过程中出现错误,可能会导致商家发货错误,引发客户投诉,甚至影响整个供应链的正常运转。

由此可见,数据校验是保障系统稳定运行、保护用户权益、维护企业信誉的重要手段。在 C# 开发中,我们有多种强大的工具和技术来实现数据校验,接下来就让我们一同深入探索其中的奥秘。

二、C# 特性的基础知识:特性是什么?

在 C# 的编程世界里,特性(Attribute)是一种特殊的类,它派生自System.Attribute基类 。特性就像是代码的 “注释精灵”,不过它可不只是给人看的简单说明,而是实实在在参与到程序运行中的重要角色。通过特性,我们可以为代码元素(如类、方法、属性、字段等)添加额外的元数据信息,这些信息能够在运行时通过反射机制被访问和利用,从而实现各种强大的功能。

比如,[Obsolete]特性就是一个非常实用的例子。假设我们有一个旧的方法OldMethod,随着程序的更新迭代,这个方法已经不再推荐使用,我们希望开发者在使用它的时候能够得到提醒,转而使用新的方法。这时候,[Obsolete]特性就派上用场了。我们可以这样标记它:

[Obsolete("This method is deprecated. Use NewMethod instead.")]
public void OldMethod()
{// 方法实现
}

当其他开发者在代码中调用OldMethod时,编译器会发出警告,提示该方法已过时,并建议使用NewMethod。这样一来,就有效地避免了开发者继续使用旧方法,保证了代码的一致性和可维护性。

除了[Obsolete]特性,C# 还提供了许多其他内置特性,如[Serializable]特性用于指示一个类可以被序列化,以便在不同的应用程序域或进程之间传输对象;[DllImport]特性用于调用非托管代码,允许我们在 C# 程序中使用 C、C++ 等编写的动态链接库(DLL)中的函数。这些内置特性为我们的开发工作提供了极大的便利,让我们能够更加高效地实现各种功能。

三、数据校验的常规武器:System.ComponentModel.DataAnnotations

(一)常用校验特性介绍

在 C# 的世界里,System.ComponentModel.DataAnnotations命名空间为我们提供了一系列强大的校验特性,它们就像是一群训练有素的 “数据卫士”,时刻守护着数据的准确性和完整性。接下来,让我们逐一认识这些 “卫士”。

  1. **[Required]**特性:这个特性就像是一位严厉的教官,它要求被标记的属性值必须存在,绝不允许为空。在用户注册场景中,用户名和密码是必填项,我们可以这样使用[Required]特性:
public class UserRegistrationModel
{[Required(ErrorMessage = "用户名不能为空")]public string Username { get; set; }[Required(ErrorMessage = "密码不能为空")]public string Password { get; set; }
}

当用户提交注册信息时,如果用户名或密码为空,系统会立即捕获这个错误,并显示相应的错误提示信息,有效避免了因空值导致的后续问题。

  1. **[StringLength]**特性:它如同一位严格的尺寸管理员,主要用于限制字符串类型属性的长度。假设我们在设计一个商品名称字段,要求名称长度不能超过 50 个字符,就可以使用[StringLength]特性:
public class Product
{[StringLength(50, ErrorMessage = "商品名称长度不能超过50个字符")]public string ProductName { get; set; }
}

这样一来,当用户输入的商品名称超过 50 个字符时,系统会进行拦截并提示错误,确保了数据的规范性。

  1. **[EmailAddress]**特性:它是专门用于验证电子邮件地址格式的 “邮件专家”。在处理用户的邮箱信息时,我们可以借助它来确保用户输入的邮箱格式正确无误:
public class ContactInfo
{[EmailAddress(ErrorMessage = "请输入有效的电子邮件地址")]public string Email { get; set; }
}

如果用户输入的邮箱格式不符合标准,如 “abc.com”,系统会及时给出错误提示,避免因邮箱格式错误导致的邮件发送失败等问题。

  1. **[Range]**特性:这是一个负责数值范围管理的 “范围卫士”,它可以限制数值类型属性的取值范围。在一个年龄字段中,我们通常希望用户输入的年龄在合理范围内,比如 18 到 120 岁之间,这时就可以使用[Range]特性:
public class UserProfile
{[Range(18, 120, ErrorMessage = "年龄需在18到120之间")]public int Age { get; set; }
}

通过这种方式,有效防止了用户输入不合理的年龄值,保证了数据的真实性和有效性。

(二)在实际项目中的应用场景

这些校验特性在实际项目中有着广泛的应用场景,它们就像坚固的防线,为项目的稳定运行提供了有力保障。

  1. 表单验证:在 Web 应用程序中,用户注册、登录、提交订单等表单操作是非常常见的。我们可以在表单对应的模型类中使用上述校验特性,实现对用户输入数据的实时验证。在ASP.NET Core MVC 项目中,我们创建一个用户注册表单的模型类:
public class RegisterViewModel
{[Required(ErrorMessage = "用户名不能为空")]public string Username { get; set; }[Required(ErrorMessage = "密码不能为空")][StringLength(100, ErrorMessage = "密码长度至少为6位", MinimumLength = 6)]public string Password { get; set; }[Required(ErrorMessage = "确认密码不能为空")][Compare("Password", ErrorMessage = "两次输入的密码不一致")]public string ConfirmPassword { get; set; }[Required(ErrorMessage = "邮箱不能为空")][EmailAddress(ErrorMessage = "请输入有效的邮箱地址")]public string Email { get; set; }
}

然后在控制器中,当用户提交注册表单时,框架会自动根据这些特性对用户输入的数据进行验证。如果数据不符合要求,会返回相应的错误信息给用户,提示用户修改,大大提高了用户体验和数据的准确性。

  1. 数据模型验证:在企业级应用开发中,数据模型是整个系统的核心。确保数据模型中的数据质量至关重要。在一个基于 Entity Framework Core 的数据访问层项目中,我们定义一个用户数据模型类:
public class User
{public int Id { get; set; }[Required(ErrorMessage = "用户名不能为空")]public string Username { get; set; }[Required(ErrorMessage = "邮箱不能为空")][EmailAddress(ErrorMessage = "请输入有效的邮箱地址")]public string Email { get; set; }[Range(0, 10000, ErrorMessage = "积分范围在0到10000之间")]public int Points { get; set; }
}

当我们从数据库中读取数据或向数据库中插入、更新数据时,这些校验特性可以帮助我们在数据进入数据库之前进行严格的验证,防止错误数据进入数据库,保证了数据库中数据的一致性和可靠性。

  1. API 输入验证:随着微服务架构的普及,API 的重要性日益凸显。为了确保 API 接收到的数据符合要求,我们可以在 API 的参数模型中使用校验特性。在一个基于ASP.NET Core Web API 的项目中,定义一个接收订单信息的 API 参数模型:
public class OrderRequest
{[Required(ErrorMessage = "订单编号不能为空")]public string OrderId { get; set; }[Required(ErrorMessage = "商品数量不能为空")][Range(1, 100, ErrorMessage = "商品数量需在1到100之间")]public int Quantity { get; set; }[Required(ErrorMessage = "商品价格不能为空")][Range(0.01, 100000.00, ErrorMessage = "商品价格需在0.01到100000.00之间")]public decimal Price { get; set; }
}

当客户端调用这个 API 并传递参数时,API 框架会自动根据这些特性对参数进行验证。如果参数不符合要求,API 会返回错误响应给客户端,避免了因错误参数导致的业务逻辑错误和系统异常,提高了 API 的稳定性和安全性。

综上所述,System.ComponentModel.DataAnnotations命名空间中的校验特性在实际项目中的应用场景非常广泛,它们能够帮助我们在不同的层面有效地验证数据,提高项目的质量和可靠性。

四、进阶玩法:自定义特性

(一)为什么需要自定义特性

尽管System.ComponentModel.DataAnnotations命名空间提供的内置校验特性已经非常强大且实用,但在实际的项目开发中,我们常常会遇到一些特殊的校验需求,这些需求是内置特性无法直接满足的。这就好比我们拥有一套功能齐全的通用工具,但在面对一些特殊的工作任务时,还是需要定制专门的工具来高效地完成工作。

例如,在一个电商系统中,我们可能需要对商品的 SKU(库存保有单位)进行特殊的校验。SKU 不仅仅是一个简单的字符串或数字,它可能有特定的格式要求,如必须以特定的字母开头,后面跟随一定规则的数字和字母组合,并且长度也有严格的限制。这种复杂的校验规则,[Required]、[StringLength]等内置特性显然无法直接实现。

再比如,在一个金融系统中,对于用户输入的银行卡号,除了基本的非空和格式校验外,可能还需要根据银行的特定规则进行校验,如校验银行卡号的校验位是否正确,不同银行的卡号长度和规则也有所不同。这种与业务紧密相关的特殊校验逻辑,内置特性往往难以胜任。

此外,在一些企业级应用中,可能会有独特的业务规则和数据标准。在一个医疗信息管理系统中,对于患者的病历编号,可能需要满足医院内部的编码规则,这个规则可能涉及到科室编号、年份、流水号等多个部分的组合,并且不同科室的病历编号规则也可能不同。对于这样复杂的业务规则,内置校验特性就显得力不从心了。

因此,为了满足这些特殊的校验需求,我们需要创建自定义特性,它就像是为我们量身定制的工具,能够根据具体的业务逻辑进行灵活的校验,确保系统的数据质量和业务规则的正确执行。

(二)如何创建和使用自定义特性

接下来,我们将以CustomValidationAttribute为例,详细展示如何创建和使用自定义特性。创建自定义特性主要包含以下几个关键步骤:

  1. 继承ValidationAttribute:自定义特性类需要继承自System.ComponentModel.DataAnnotations.ValidationAttribute类,这是创建自定义校验特性的基础。通过继承这个类,我们可以获得校验特性所需的基本功能和行为。
using System.ComponentModel.DataAnnotations;[AttributeUsage(AttributeTargets.Property)]
public class CustomValidationAttribute : ValidationAttribute
{// 后续步骤中的代码将在此类中逐步添加
}

在这段代码中,我们定义了一个名为CustomValidationAttribute的自定义特性类,并使用AttributeUsage特性来指定它可以应用于属性上。AttributeUsage特性就像是一个使用说明,它告诉编译器这个自定义特性可以被放置在哪些程序元素上。在这里,我们将其限制在属性上,以确保它的正确使用范围。

  1. 重写IsValid方法:IsValid方法是自定义特性的核心部分,我们需要在这个方法中实现具体的校验逻辑。在这个方法中,我们可以根据业务需求对属性值进行各种检查和验证。
using System.ComponentModel.DataAnnotations;[AttributeUsage(AttributeTargets.Property)]
public class CustomValidationAttribute : ValidationAttribute
{private readonly string _validationMessage;public CustomValidationAttribute(string validationMessage){_validationMessage = validationMessage;}protected override ValidationResult IsValid(object value, ValidationContext validationContext){if (value is string str && str.StartsWith("Z")){return new ValidationResult(_validationMessage);}return ValidationResult.Success;}
}

在这个例子中,我们在CustomValidationAttribute类中添加了一个构造函数,用于接收一个错误提示信息_validationMessage。然后,重写了IsValid方法。在IsValid方法中,首先判断属性值是否为字符串类型,并且是否以字母 “Z” 开头。如果满足这个条件,说明校验失败,返回一个包含错误提示信息的ValidationResult对象;如果不满足条件,说明校验成功,返回ValidationResult.Success。

  1. 在模型类中应用自定义特性:创建好自定义特性后,就可以在模型类的属性上应用它了,就像使用内置校验特性一样简单。
public class CustomUser
{[CustomValidationAttribute("用户名必须以Z开头")]public string Username { get; set; }
}

在CustomUser类中,我们在Username属性上应用了CustomValidationAttribute自定义特性,并传入了错误提示信息 “用户名必须以 Z 开头”。这样,当对CustomUser类的实例进行数据校验时,就会自动触发CustomValidationAttribute的校验逻辑。

通过以上步骤,我们就完成了自定义特性的创建和使用。这种自定义特性为我们提供了极大的灵活性,能够满足各种复杂的业务校验需求,使我们在数据校验方面拥有更强的掌控力。

五、实战演练:验证数据

(一)利用 Validator 类进行数据验证

在 C# 中,System.ComponentModel.DataAnnotations命名空间不仅为我们提供了丰富的校验特性,还贴心地配备了Validator类,它就像是一位智能的 “数据审查官”,能够帮助我们在任意时刻对对象的属性进行高效验证。接下来,我们通过一个具体的代码示例,来深入了解Validator类的强大功能和使用方法。

假设我们已经定义了一个User类,其中包含了Username、Email和Age等属性,并使用了System.ComponentModel.DataAnnotations命名空间中的校验特性对这些属性进行了约束,如下所示:

using System.ComponentModel.DataAnnotations;public class User
{[Required(ErrorMessage = "用户名不能为空")][StringLength(50, ErrorMessage = "用户名长度需在0到50之间")]public string Username { get; set; }[EmailAddress(ErrorMessage = "请输入有效的电子邮件地址")]public string Email { get; set; }[Range(18, 120, ErrorMessage = "年龄需在18到120之间")]public int Age { get; set; }
}

现在,我们需要创建一个User类的实例,并使用Validator类对其属性进行验证。示例代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;class Program
{static void Main(){// 创建一个User类的实例,并设置一些不符合校验规则的值var user = new User{Username = "",Email = "notAnEmail",Age = 17};// 创建一个用于存储验证结果的列表var results = new List<ValidationResult>();// 使用Validator类的TryValidateObject方法尝试验证User实例// 第一个参数是要验证的对象// 第二个参数是验证上下文,用于提供验证所需的上下文信息// 第三个参数是用于存储验证结果的列表// 第四个参数表示是否验证所有属性,这里设置为truevar isValid = Validator.TryValidateObject(user, new ValidationContext(user), results, true);// 判断验证是否成功if (!isValid){// 如果验证失败,遍历验证结果列表,并打印每个验证失败的错误信息foreach (var validationResult in results){Console.WriteLine(validationResult.ErrorMessage);}}else{Console.WriteLine("数据验证成功!");}}
}

在上述代码中,我们首先创建了一个User类的实例user,并故意设置了一些不符合校验规则的值。然后,我们创建了一个List类型的results列表,用于存储验证结果。接着,使用Validator.TryValidateObject方法对user实例进行验证。该方法会根据User类中定义的校验特性,对user的属性进行逐一检查,并将验证结果存储在results列表中。如果验证失败,isValid变量将为false,我们通过遍历results列表,打印出每个验证失败的错误信息,这些错误信息正是我们在定义校验特性时设置的,能够清晰地提示用户哪些数据不符合要求。如果验证成功,isValid变量将为true,并打印出 “数据验证成功!” 的提示信息。

通过这个示例,我们可以看到Validator类的使用非常简单直观,它能够帮助我们快速准确地验证对象的属性,确保数据的质量和合法性,为我们的程序提供了可靠的数据保障。

(二)实际项目中的完整验证流程

在实际项目中,数据验证是一个贯穿始终的重要环节,它涉及到从接收数据到验证数据,再到处理验证结果的一系列复杂流程。接下来,我们将以一个基于ASP.NET Core 的 Web 应用程序为例,深入探讨在实际项目中数据验证的完整流程以及其在框架中的应用。

  1. 接收数据:在ASP.NET Core 应用程序中,通常通过控制器来接收客户端发送的数据。这些数据可能来自用户在前端页面填写的表单,也可能是通过 API 调用传递过来的参数。在一个用户注册的场景中,前端页面会将用户输入的用户名、密码、邮箱等信息封装成一个 HTTP 请求发送到服务器。在ASP.NET Core 中,我们可以创建一个AccountController来处理这个请求,示例代码如下:
using Microsoft.AspNetCore.Mvc;[ApiController]
[Route("[controller]")]
public class AccountController : ControllerBase
{[HttpPost("register")]public IActionResult Register([FromBody] UserRegisterModel model){// 这里接收到了客户端发送的UserRegisterModel模型数据// 后续将对该模型数据进行验证和处理}
}

在上述代码中,[HttpPost(“register”)]表示该方法处理 HTTP POST 请求,路径为 “/Account/register”。[FromBody]特性表示从请求体中获取数据,并将其绑定到UserRegisterModel模型上。此时,model变量中就包含了客户端发送的用户注册信息。

  1. 验证数据:一旦接收到数据,接下来的关键步骤就是对数据进行验证。在ASP.NET Core 中,我们可以充分利用System.ComponentModel.DataAnnotations命名空间中的校验特性来实现这一目的。首先,定义UserRegisterModel模型类,并使用校验特性对其属性进行约束,示例代码如下:
using System.ComponentModel.DataAnnotations;public class UserRegisterModel
{[Required(ErrorMessage = "用户名不能为空")]public string Username { get; set; }[Required(ErrorMessage = "密码不能为空")][StringLength(100, ErrorMessage = "密码长度至少为6位", MinimumLength = 6)]public string Password { get; set; }[Required(ErrorMessage = "确认密码不能为空")][Compare("Password", ErrorMessage = "两次输入的密码不一致")]public string ConfirmPassword { get; set; }[Required(ErrorMessage = "邮箱不能为空")][EmailAddress(ErrorMessage = "请输入有效的邮箱地址")]public string Email { get; set; }
}

在这个模型类中,我们使用了[Required]、[StringLength]、[Compare]和[EmailAddress]等校验特性,分别对用户名、密码、确认密码和邮箱进行了严格的校验。然后,在控制器的Register方法中,ASP.NET Core 框架会自动根据这些校验特性对接收到的UserRegisterModel模型数据进行验证。如果数据不符合校验规则,框架会将验证失败的信息存储在ModelState中。

  1. 处理验证结果:验证数据之后,我们需要根据验证结果进行相应的处理。如果验证成功,说明数据符合要求,可以继续进行后续的业务逻辑处理,如将用户信息保存到数据库中。如果验证失败,我们需要返回错误信息给客户端,提示用户修改数据。在ASP.NET Core 中,我们可以通过检查ModelState.IsValid属性来判断验证是否成功,示例代码如下:
using Microsoft.AspNetCore.Mvc;[ApiController]
[Route("[controller]")]
public class AccountController : ControllerBase
{[HttpPost("register")]public IActionResult Register([FromBody] UserRegisterModel model){if (!ModelState.IsValid){// 验证失败,返回包含错误信息的BadRequest响应return BadRequest(ModelState);}// 验证成功,继续进行后续业务逻辑处理// 例如,将用户信息保存到数据库//...return Ok("注册成功");}
}

在上述代码中,如果ModelState.IsValid为false,表示验证失败,我们使用BadRequest方法返回一个 HTTP 400 Bad Request 响应,并将ModelState中的错误信息传递给客户端。客户端接收到这个响应后,可以根据错误信息提示用户修改相应的数据。如果ModelState.IsValid为true,表示验证成功,我们可以继续进行后续的业务逻辑处理,如将用户信息保存到数据库中,并返回一个成功的响应给客户端。

通过以上步骤,我们展示了在实际项目中基于ASP.NET Core 框架的数据验证的完整流程。从接收数据到验证数据,再到处理验证结果,每个环节都紧密相连,共同确保了数据的质量和业务逻辑的正确执行。在实际开发中,我们还可以根据项目的具体需求,对数据验证流程进行进一步的优化和扩展,如添加自定义的验证逻辑、统一的错误处理机制等,以提高项目的健壮性和可维护性。

六、总结与展望:数据校验的未来发展

在 C# 开发的广阔天地中,数据校验无疑是一项至关重要的技术。它不仅是保障数据准确性和完整性的坚固防线,更是提升系统稳定性和可靠性的关键因素。通过本文的深入探讨,我们全面认识了 C# 中数据校验的多种实现方式,从基础的System.ComponentModel.DataAnnotations命名空间中的常用校验特性,到能够满足复杂业务需求的自定义特性,再到利用Validator类进行数据验证的实战应用,每一种方式都为我们在不同场景下实现数据校验提供了有力的支持。

在实际项目中,我们将这些数据校验技术广泛应用于表单验证、数据模型验证以及 API 输入验证等多个环节,有效避免了错误数据的流入,确保了业务逻辑的正确执行。这些技术的运用,不仅提高了系统的质量和性能,还为用户提供了更加稳定和可靠的服务体验。

展望未来,随着技术的不断进步和业务需求的日益复杂,数据校验技术也将迎来新的发展机遇和挑战。一方面,人工智能和机器学习技术的快速发展,将为数据校验带来更加智能化的解决方案。通过训练模型,能够自动识别和校验各种复杂的数据模式,大大提高校验的准确性和效率。在电商领域中,利用机器学习算法可以对海量的商品数据进行实时校验,快速发现异常数据和潜在的风险。

另一方面,随着分布式系统和微服务架构的普及,数据校验也将面临新的挑战。如何在分布式环境下实现高效、一致的数据校验,确保各个服务之间的数据交互准确无误,将是未来研究的重点方向之一。区块链技术的兴起,为数据校验提供了新的思路。其去中心化和不可篡改的特性,能够确保数据在传输和存储过程中的安全性和完整性,为数据校验带来了更加可靠的保障。

此外,实时校验技术也将得到进一步发展。在大数据时代,数据的产生和传输速度极快,传统的事后校验方式已经无法满足需求。实时校验技术能够在数据产生的瞬间进行验证,及时发现和纠正错误,为数据的实时处理和分析提供了有力支持。

作为开发者,我们应当紧跟技术发展的步伐,不断学习和探索新的数据校验技术和方法。通过持续的实践和创新,将这些先进的技术应用到实际项目中,为打造更加健壮、可靠的软件系统贡献自己的力量。让我们携手共进,在数据校验的艺术之路上不断前行,创造更加美好的技术未来!

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

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

相关文章

【后端开发】系统设计101——通信协议,数据库与缓存,架构模式,微服务架构,支付系统(36张图详解)

【后端开发】系统设计101——通信协议&#xff0c;数据库与缓存&#xff0c;架构模式&#xff0c;微服务架构&#xff0c;支付系统&#xff08;36张图&#xff09; 文章目录 1、通信协议通信协议REST API 对比 GraphQL&#xff08;前端-web服务&#xff09;grpc如何工作&#x…

DS图(中)(19)

文章目录 前言一、图的遍历广度优先遍历深度优先遍历 二、最小生成树Kruskal算法Prim算法两种方法对比 总结 前言 承上启下&#xff0c;我们来学习下图的中篇&#xff01;&#xff01;&#xff01; 一、图的遍历 图的遍历指的是遍历图中的顶点&#xff0c;主要有 广度优先遍历 …

DeepSeek 发布多模态 Janus-Pro

DeepSeek在接连发布大语言模型V3&#xff0c;推理模型R1之后&#xff0c;DeepSeek随后又发布两款多模态框架&#xff1a;Janus-Pro 与 JanusFlow &#xff0c;引领多模态模型新时代&#xff01; 而且依然是保持了一贯的风格&#xff0c;保持了完全开源&#xff0c;今天我们来看…

【QT笔记】使用QScrollArea实现多行文本样式显示

目录 一、QScrollArea 的基本概念 二、demo代码 三、实现效果 1、页面空间足够&#xff0c;无滚动条时显示效果 2、有滚动条时显示效果 一、QScrollArea 的基本概念 QScrollArea 是 Qt 框架中用于提供一个滚动条区域&#xff0c;允许用户滚动查看比当前可视区域更大的内容…

达梦数据库从单主模式转换为主备模式

目录标题 达梦数据库单主转主备配置笔记前期准备服务器环境数据库安装磁盘空间 流程流程图说明 详细步骤1. 检查主库归档模式2. 配置主库配置文件dm.ini 文件dmmal.ini 文件dmarch.ini 文件 3. 备份主库数据库4. 备库配置新建备库数据库配置备库配置文件dm.ini 文件复制主库的 …

使用C#开发一款通用数据库管理工具

由于经常使用各种数据库&#xff0c;笔者自己动手丰衣足食&#xff0c;使用C#开发了一款通用数据库管理工具&#xff0c;支持Mysql、Oracle、Sqlite、SQL Server等数据库的表、视图、存储过程、函数管理功能&#xff0c;并支持导入导出、数据字典生成、拖拽式跨机器跨库数据一键…

w193基于Spring Boot的秒杀系统设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

DeepSeek各版本说明与优缺点分析

DeepSeek各版本说明与优缺点分析 DeepSeek是最近人工智能领域备受瞩目的一个语言模型系列&#xff0c;其在不同版本的发布过程中&#xff0c;逐步加强了对多种任务的处理能力。本文将详细介绍DeepSeek的各版本&#xff0c;从版本的发布时间、特点、优势以及不足之处&#xff0…

OpenCV:特征检测总结

目录 一、什么是特征检测&#xff1f; 二、OpenCV 中的常见特征检测方法 1. Harris 角点检测 2. Shi-Tomasi 角点检测 3. Canny 边缘检测 4. SIFT&#xff08;尺度不变特征变换&#xff09; 5. ORB 三、特征检测的应用场景 1. 图像匹配 2. 运动检测 3. 自动驾驶 4.…

windows版的docker如何使用宿主机的GPU

windows版的docker使用宿主机的GPU的命令 命令如下 docker run -it --nethost --gpus all --name 容器名 -e NVIDIA_DRIVER_CAPABILITIEScompute,utility -e NVIDIA_VISIBLE_DEVICESall 镜像名效果 (transformer) rootdocker-desktop:/# python Python 3.9.0 (default, Nov 15 …

neo4j-在Linux中安装neo4j

目录 切换jdk 安装neo4j 配置neo4j以便其他电脑可以访问 切换jdk 因为我安装的jdk是1.8版本的&#xff0c;而我安装的neo4j版本为5.15,Neo4j Community 5.15.0 不支持 Java 1.8&#xff0c;它要求 Java 17 或更高版本。 所以我需要升级Java到17 安装 OpenJDK 17 sudo yu…

8.PPT:小李-第二次世界大战【21】

目录 NO123 ​ NO4567 ​ NO8\9\10\11​ 图片→格式→大小对话框→锁定纵横比✔动画→飞入→效果选项&#xff1a;方向/序列→开始→持续时间→延迟时间持续时间&#xff1a;1s延迟&#xff1a;0.5s音频剪切时间&#xff1a;0.5s&#xff1a;00:00.500自动换片时间设置&…

GAN(生成对抗网络,Generative Adversarial Network)

https://www.bilibili.com/video/BV1mp4y187dm/?spm_id_from333.788.recommend_more_video.2&vd_source35b06c13f470dff84c947fa3045bafc3

【C++】多态详细讲解

本篇来聊聊C面向对象的第三大特性-多态。 1.多态的概念 多态通俗来说就是多种形态。多态分为编译时多态(静态多态)和运⾏时多态(动态多态)。 编译时多态&#xff1a;主要就是我们前⾯讲的函数重载和函数模板&#xff0c;他们传不同类型的参数就可以调⽤不同的函数&#xff0c;通…

NeuralCF 模型:神经网络协同过滤模型

实验和完整代码 完整代码实现和jupyter运行&#xff1a;https://github.com/Myolive-Lin/RecSys--deep-learning-recommendation-system/tree/main 引言 NeuralCF 模型由新加坡国立大学研究人员于 2017 年提出&#xff0c;其核心思想在于将传统协同过滤方法与深度学习技术相结…

【自动化办公】批量图片PDF自定义指定多个区域识别重命名,批量识别铁路货物运单区域内容改名,基于WPF和飞桨ocr深度学习模型的解决方案

项目背景介绍 铁路货运企业需要对物流单进行长期存档&#xff0c;以便后续查询和审计。不同的物流单可能包含不同的关键信息&#xff0c;通过自定义指定多个区域进行识别重命名&#xff0c;可以使存档的图片文件名具有统一的规范和明确的含义。比如&#xff0c;将包含货物运单…

Qt跨屏窗口的一个Bug及解决方案

如果我们希望一个窗口覆盖用户的整个桌面&#xff0c;此时就要考虑用户有多个屏幕的场景&#xff08;此窗口要横跨多个屏幕&#xff09;&#xff0c;由于每个屏幕的分辨率和缩放比例可能是不同的&#xff0c;Qt底层在为此窗口设置缩放比例&#xff08;DevicePixelRatio&#xf…

LeetCode:63. 不同路径 II

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;63. 不同路径 II 给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角&#xff08;即 grid[0][0]…

自定义数据集 使用paddlepaddle框架实现逻辑回归

导入必要的库 import numpy as np import paddle import paddle.nn as nn 数据准备&#xff1a; seed1 paddle.seed(seed)# 1.散点输入 定义输入数据 data [[-0.5, 7.7], [1.8, 98.5], [0.9, 57.8], [0.4, 39.2], [-1.4, -15.7], [-1.4, -37.3], [-1.8, -49.1], [1.5, 75.6…

如何利用maven更优雅的打包

最近在客户现场部署项目&#xff0c;有两套环境&#xff0c;无法连接互联网&#xff0c;两套环境之间也是完全隔离&#xff0c;于是问题就来了&#xff0c;每次都要远程到公司电脑改完代码&#xff0c;打包&#xff0c;通过网盘&#xff08;如果没有会员&#xff0c;上传下载慢…