C#使用sqlSugar操作mysql數(shù)據(jù)庫(kù)的完整教程
一、基本配置
1、安裝依賴包
需要安裝3個(gè)依賴包,分別為mysqlConnector、sqlSugar、autofac
2、在appsettings.json中配置mysql的連接信息
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"MySqlConnection": "Server=localhost;Database=net_demo;Uid=root;Pwd=123456;Port=3306;SslMode=None;"
}
}3、在入口文件中創(chuàng)建連接
using System.Text.Json;
using Autofac;
using Autofac.Extensions.DependencyInjection;
using SqlSugar;
using study_demo10_orm.Utils;
namespace study_demo10_orm;
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// 配置 JSON 序列化:long 類型序列化為字符串,避免 JavaScript 精度丟失
builder.Services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.NumberHandling = System.Text.Json.Serialization.JsonNumberHandling.WriteAsString;
});
// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
builder.Services.AddOpenApi();
// 配置swagger
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
// 配置數(shù)據(jù)庫(kù)連接
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer<ContainerBuilder>(container =>
{
// 使用Autofac 容器注冊(cè)一個(gè)對(duì)象
container.Register(_ =>
{
var connectionString = builder.Configuration.GetConnectionString("MySqlConnection")
?? "Server=localhost;Database=test;Uid=root;Pwd=123456;Port=3306;";
var db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = connectionString, // 數(shù)據(jù)庫(kù)地址字符串
DbType = DbType.MySql, // 指定數(shù)據(jù)庫(kù)是mysql
IsAutoCloseConnection = true, // 自動(dòng)關(guān)閉連接
InitKeyType = InitKeyType.Attribute,
MoreSettings = new ConnMoreSettings()
{
IsAutoRemoveDataCache = true // 數(shù)據(jù)變更時(shí)自動(dòng)清理緩存
}
});
return db;
}).As<ISqlSugarClient>().InstancePerLifetimeScope();
});
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.MapOpenApi();
// 配置swagger
app.UseSwagger().UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
// 配置打印日志
app.Logger.LogInformation("程序已經(jīng)啟動(dòng),swagger地址:localhost:5179/swagger/index.html");
app.Run();
}
}4、手動(dòng)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)表文件及手動(dòng)創(chuàng)建一個(gè)數(shù)據(jù)模型
CREATE TABLE `account` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主鍵', `username` varchar(50) NOT NULL COMMENT '用戶名', `password` varchar(255) NOT NULL COMMENT '密碼', `nickname` varchar(50) DEFAULT NULL COMMENT '昵稱', `avatar` varchar(255) DEFAULT NULL COMMENT '頭像', `email` varchar(100) DEFAULT NULL COMMENT '郵箱', `phone` varchar(20) DEFAULT NULL COMMENT '手機(jī)號(hào)', `status` bigint DEFAULT '1' COMMENT '狀態(tài) 1正常 2禁用', `created_at` bigint DEFAULT NULL COMMENT '創(chuàng)建時(shí)間', `updated_at` bigint DEFAULT NULL COMMENT '更新時(shí)間', `deleted_at` datetime(3) DEFAULT NULL COMMENT '軟刪除', PRIMARY KEY (`id`), KEY `idx_account_deleted_at` (`deleted_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
using System;
using SqlSugar;
namespace Model.Entity
{
[SugarTable("account")]
public class AccountEntity
{
/// <summary>
/// 主鍵
/// </summary>
[SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true)]
public long Id { get; set; }
/// <summary>
/// 用戶名
/// </summary>
[SugarColumn(ColumnName = "username")]
public string Username { get; set; }
/// <summary>
/// 密碼
/// </summary>
[SugarColumn(ColumnName = "password")]
public string Password { get; set; }
/// <summary>
/// 昵稱
/// </summary>
[SugarColumn(ColumnName = "nickname")]
public string Nickname { get; set; }
/// <summary>
/// 頭像
/// </summary>
[SugarColumn(ColumnName = "avatar")]
public string Avatar { get; set; }
/// <summary>
/// 郵箱
/// </summary>
[SugarColumn(ColumnName = "email")]
public string Email { get; set; }
/// <summary>
/// 手機(jī)號(hào)
/// </summary>
[SugarColumn(ColumnName = "phone")]
public string Phone { get; set; }
/// <summary>
/// 狀態(tài) 1正常 2禁用
/// </summary>
[SugarColumn(ColumnName = "status")]
public int? Status { get; set; }
/// <summary>
/// 創(chuàng)建時(shí)間
/// </summary>
[SugarColumn(ColumnName = "created_at")]
public long? CreatedAt { get; set; }
/// <summary>
/// 更新時(shí)間
/// </summary>
[SugarColumn(ColumnName = "updated_at")]
public long? UpdatedAt { get; set; }
/// <summary>
/// 軟刪除
/// </summary>
[SugarColumn(ColumnName = "deleted_at")]
public DateTime? DeletedAt { get; set; }
}
}5、在控制器中使用SqlSugar來(lái)對(duì)數(shù)據(jù)庫(kù)的操作
/// <summary>
/// 賬戶管理接口
/// </summary>
[ApiController]
[Route("api/[controller]")]
[Produces("application/json")]
public class AccountController : ControllerBase
{
private readonly ISqlSugarClient _db;
/// <summary>
/// 依賴注入
/// </summary>
public AccountController(ISqlSugarClient db)
{
_db = db;
}
/// <summary>
/// 創(chuàng)建賬戶
/// </summary>
/// <param name="dto">創(chuàng)建賬戶的信息</param>
/// <returns>新創(chuàng)建的賬戶ID</returns>
/// <remarks>
/// 示例請(qǐng)求:
/// POST /api/account
/// {
/// "username": "testuser",
/// "password": "123456",
/// "nickname": "測(cè)試用戶",
/// "email": "test@example.com",
/// "phone": "13800138000",
/// "status": 1
/// }
/// </remarks>
[HttpPost]
[ProducesResponseType(typeof(ApiResult), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ApiResult), StatusCodes.Status400BadRequest)]
public async Task<ApiResult> Create([FromBody] CreateAccountDTO dto)
{
// 參數(shù)校驗(yàn)
if (string.IsNullOrWhiteSpace(dto.Username))
{
return ResultHelper.Error("用戶名不能為空");
}
if (string.IsNullOrWhiteSpace(dto.Password))
{
return ResultHelper.Error("密碼不能為空");
}
// 檢查用戶名是否已存在
var exists = await _db.Queryable<AccountEntity>()
.Where(x => x.Username == dto.Username && x.DeletedAt == null)
.AnyAsync();
if (exists)
{
return ResultHelper.Error("用戶名已存在");
}
// 創(chuàng)建實(shí)體
var entity = new AccountEntity
{
Username = dto.Username,
Password = dto.Password,
Nickname = dto.Nickname,
Avatar = dto.Avatar,
Email = dto.Email,
Phone = dto.Phone,
Status = dto.Status ?? 1,
CreatedAt = DateTimeOffset.UtcNow.ToUnixTimeSeconds(),
UpdatedAt = DateTimeOffset.UtcNow.ToUnixTimeSeconds()
};
// 插入并獲取返回的ID(雪花ID)
var insertResult = await _db.Insertable(entity).ExecuteReturnEntityAsync();
var id = insertResult.Id;
return ResultHelper.Success(new { Id = id });
}
}二、配置由數(shù)據(jù)庫(kù)文件來(lái)生成對(duì)應(yīng)的數(shù)據(jù)模型
1、創(chuàng)建一個(gè)工具類
using System.Text;
using SqlSugar;
namespace study_demo10_orm.Utils;
/// <summary>
/// 代碼生成器工具類
/// 用于根據(jù)數(shù)據(jù)庫(kù)表結(jié)構(gòu)自動(dòng)生成對(duì)應(yīng)的實(shí)體類
/// </summary>
public class Generator
{
/// <summary>
/// 生成實(shí)體類文件
/// </summary>
/// <param name="db">SqlSugar數(shù)據(jù)庫(kù)實(shí)例</param>
/// <param name="outputPath">輸出目錄路徑</param>
/// <param name="namespaceName">命名空間名稱</param>
/// <param name="tables">指定要生成的表名數(shù)組,為空則生成所有表</param>
public static void GenerateEntities(ISqlSugarClient db, string outputPath, string namespaceName, params string[] tables)
{
// 確保輸出目錄存在,不存在則創(chuàng)建
Directory.CreateDirectory(outputPath);
// 獲取要生成的表列表:如果指定了表名則使用指定表,否則獲取所有表
var tableList = tables?.Length > 0
? tables.ToList()
: db.DbMaintenance.GetTableInfoList().Select(t => t.Name).ToList();
// 遍歷每個(gè)表生成對(duì)應(yīng)的實(shí)體類
foreach (var table in tableList)
{
// 獲取表的所有列信息
var columns = db.DbMaintenance.GetColumnInfosByTableName(table, false);
// 將表名轉(zhuǎn)換為PascalCase作為類名(如下劃線轉(zhuǎn)駝峰)
var className = ToPascalCase(table) + "Entity";
var sb = new StringBuilder();
// 生成文件頭部的警告注釋(表示是自動(dòng)生成的)
sb.AppendLine("http:// <auto-generated />");
sb.AppendLine("http:// 此文件由代碼生成器自動(dòng)創(chuàng)建,請(qǐng)勿手動(dòng)修改!");
sb.AppendLine();
sb.AppendLine("using System;");
sb.AppendLine("using SqlSugar;");
sb.AppendLine();
sb.AppendLine($"namespace {namespaceName}");
sb.AppendLine("{");
// 生成類聲明和SugarTable特性
sb.AppendLine($" [SugarTable(\"{table}\")]");
sb.AppendLine($" public class {className}");
sb.AppendLine(" {");
// 遍歷每列生成屬性
foreach (var col in columns)
{
// 獲取CLR類型和屬性名
var clrType = GetClrType(col.DataType, col.IsNullable, col.DbColumnName);
var propertyName = ToPascalCase(col.DbColumnName);
// 添加X(jué)ML文檔注釋(字段描述)
sb.AppendLine(" /// <summary>");
sb.AppendLine($" /// {col.ColumnDescription}");
sb.AppendLine(" /// </summary>");
// 構(gòu)建SugarColumn特性參數(shù)
var attrParts = new List<string>
{
$"ColumnName = \"{col.DbColumnName}\""
};
// 主鍵標(biāo)記
if (col.IsPrimarykey) attrParts.Add("IsPrimaryKey = true");
// 注意:MySQL AUTO_INCREMENT 不需要 IsIdentity(那是雪花ID用的)
// 如果需要雪花ID,請(qǐng)?jiān)跇I(yè)務(wù)代碼中手動(dòng)設(shè)置
if (col.IsIdentity) attrParts.Add("IsIdentity = true");
// 輸出SugarColumn特性
var attrStr = $"[SugarColumn({string.Join(", ", attrParts)})]";
sb.AppendLine($" {attrStr}");
sb.AppendLine($" public {clrType} {propertyName} {{ get; set; }}");
sb.AppendLine();
}
sb.AppendLine(" }");
sb.AppendLine("}");
// 寫入文件
var filePath = Path.Combine(outputPath, $"{className}.cs");
File.WriteAllText(filePath, sb.ToString(), Encoding.UTF8);
Console.WriteLine($"Generated: {className}.cs");
}
Console.WriteLine($"Total generated: {tableList.Count} files");
}
/// <summary>
/// 將下劃線/連字符命名轉(zhuǎn)換為PascalCase命名
/// 例如: user_info -> UserInfo, hello-world -> HelloWorld
/// </summary>
/// <param name="name">原始名稱</param>
/// <returns>轉(zhuǎn)換后的PascalCase名稱</returns>
private static string ToPascalCase(string name)
{
if (string.IsNullOrWhiteSpace(name)) return name;
// 按下劃線和連字符分割
var parts = name.Split(new[] { '_', '-' }, StringSplitOptions.RemoveEmptyEntries);
// 將每部分首字母大寫后拼接
return string.Join("", parts.Select(p => char.ToUpper(p[0]) + p.Substring(1)));
}
/// <summary>
/// 將數(shù)據(jù)庫(kù)類型轉(zhuǎn)換為C# CLR類型
/// </summary>
/// <param name="dbType">數(shù)據(jù)庫(kù)中的數(shù)據(jù)類型</param>
/// <param name="isNullable">是否可為空</param>
/// <returns>C#類型名稱</returns>
private static string GetClrType(string dbType, bool isNullable, string columnName = "")
{
dbType = dbType.ToLower();
// 根據(jù)數(shù)據(jù)庫(kù)類型映射到CLR類型
string result = dbType switch
{
"int" or "int unsigned" or "integer" => "int",
"bigint" or "bigint unsigned" => "long",
"tinyint" or "tinyint unsigned" => "int",
"smallint" or "smallint unsigned" => "short",
"bit" => "bool",
"float" or "float unsigned" => "float",
"double" or "double unsigned" => "double",
"decimal" or "numeric" or "dec" or "fixed" => "decimal",
"date" or "datetime" or "timestamp" or "time" => "DateTime",
"char" or "varchar" or "text" or "longtext" or "mediumtext" or "tinytext" or "nchar" or "nvarchar" => "string",
"blob" or "longblob" or "mediumblob" or "tinyblob" or "varbinary" or "binary" => "byte[]",
_ => "string"
};
// 根據(jù)字段名推斷類型(當(dāng)數(shù)據(jù)庫(kù)類型不準(zhǔn)確時(shí))
var lowerName = columnName.ToLower();
if (result == "long" && lowerName.Contains("status"))
{
result = "int";
}
// 注意:不再?gòu)?qiáng)制 id 為 long,使用數(shù)據(jù)庫(kù)實(shí)際類型
// 判斷是否為值類型(值類型才能加可空標(biāo)記?)
var isValueType = result != "string" && result != "byte[]";
// 值類型可空時(shí)加?后綴(如 int?)
if (isNullable && isValueType) result += "?";
return result;
}
}
2、在入口文件里面配置這個(gè)
...
// 配置數(shù)據(jù)庫(kù)生成模型的
if (args.Contains("gen-model"))
{
using var scope = app.Services.CreateScope();
var db = scope.ServiceProvider.GetRequiredService<ISqlSugarClient>();
// 獲取項(xiàng)目根目錄的相對(duì)路徑 (從 bin/Debug/net10.0 回退3級(jí))
var projectRoot = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "..", "..", ".."));
var modelPath = Path.Combine(projectRoot, "Model", "Entity");
Generator.GenerateEntities(
db,
outputPath: modelPath,
namespaceName: "Model.Entity",
tables: Array.Empty<string>()
);
return;
}
...
3、配置Makefile文件方便一件來(lái)操作
.PHONY: gen-model run # 生成數(shù)據(jù)庫(kù)模型 gen-model: dotnet run --project . -- gen-model # 運(yùn)行項(xiàng)目 run: dotnet run --project .
三、配置直接的時(shí)候輸出打印的sql方便排查錯(cuò)誤
1、直接在入庫(kù)配置地方配置
...
// 配置數(shù)據(jù)庫(kù)連接
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer<ContainerBuilder>(container =>
{
// 使用Autofac 容器注冊(cè)一個(gè)對(duì)象
container.Register(_ =>
{
var connectionString = builder.Configuration.GetConnectionString("MySqlConnection")
?? "Server=localhost;Database=test;Uid=root;Pwd=123456;Port=3306;";
var db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = connectionString, // 數(shù)據(jù)庫(kù)地址字符串
DbType = DbType.MySql, // 指定數(shù)據(jù)庫(kù)是mysql
IsAutoCloseConnection = true, // 自動(dòng)關(guān)閉連接
InitKeyType = InitKeyType.Attribute,
MoreSettings = new ConnMoreSettings()
{
IsAutoRemoveDataCache = true // 數(shù)據(jù)變更時(shí)自動(dòng)清理緩存
}
});
// 配置SQL日志打印(點(diǎn)擊可跳轉(zhuǎn)到執(zhí)行文件)
db.Aop.OnLogExecuting = (sql, pars) =>
{
// 獲取調(diào)用棧信息
var stackTrace = new System.Diagnostics.StackTrace(true);
var frames = stackTrace.GetFrames();
string? filePath = null;
int lineNumber = 0;
string? methodName = null;
if (frames.Length > 0)
{
// 打印所有幀用于調(diào)試(注釋掉正常后)
// for (int i = 0; i < Math.Min(frames.Length, 15); i++)
// {
// var frame = frames[i];
// Console.WriteLine($" Frame[{i}]: {frame.GetMethod()?.DeclaringType}.{frame.GetMethod()?.Name} at {frame.GetFileName()}:{frame.GetFileLineNumber()}");
// }
// 遍歷找到第一個(gè)有文件信息的非 SqlSugar/Microsoft 幀
// 通常在 5-15 幀范圍內(nèi)能找到業(yè)務(wù)代碼
for (int i = 0; i < frames.Length; i++)
{
var frame = frames[i];
var method = frame.GetMethod();
if (method == null) continue;
var declaringType = method.DeclaringType?.FullName ?? "";
var name = method.Name;
// 跳過(guò)內(nèi)部框架類
if (declaringType.StartsWith("SqlSugar") ||
declaringType.StartsWith("Microsoft") ||
declaringType.StartsWith("System") ||
declaringType.StartsWith("Autofac"))
{
continue;
}
// 跳過(guò)編譯器生成的匿名類和方法(如 lambda)
// 匿名方法通常名稱包含 <> 或開頭是 <
if (name.Contains('<') || name.Contains("<>"))
{
continue;
}
var fileName = frame.GetFileName();
var line = frame.GetFileLineNumber();
// 找到第一個(gè)有有效文件信息的幀
if (!string.IsNullOrEmpty(fileName))
{
filePath = fileName;
lineNumber = line > 0 ? line : 0;
methodName = $"{declaringType}.{name}";
break;
}
}
}
// Rider 格式輸出: --> file.cs(line)
if (filePath != null && lineNumber > 0)
{
Console.WriteLine($" --> {filePath}({lineNumber}) [{methodName}]");
}
else if (filePath != null)
{
Console.WriteLine($" --> {filePath} [no line info] [{methodName}]");
}
// 打印可直接執(zhí)行的SQL(將參數(shù)值替換到SQL中)
var executableSql = sql;
if (pars != null && pars.Length > 0)
{
foreach (var p in pars)
{
var value = p.Value;
if (value == null)
{
executableSql = executableSql.Replace(p.ParameterName, "NULL");
}
else if (value is string || value is DateTime)
{
executableSql = executableSql.Replace(p.ParameterName, $"'{value}'");
}
else
{
executableSql = executableSql.Replace(p.ParameterName, value.ToString() ?? "NULL");
}
}
}
Console.WriteLine($"SQL: {executableSql}");
Console.WriteLine();
};
// 錯(cuò)誤日志
db.Aop.OnError = (exp) =>
{
Console.WriteLine($"SQL Error: {exp.Message}");
Console.WriteLine($"SQL: {exp.Sql}");
};
return db;
}).As<ISqlSugarClient>().InstancePerLifetimeScope();
});
...
四、設(shè)置創(chuàng)建時(shí)間和更新時(shí)間
1、配置代碼生成器中創(chuàng)建和更新時(shí)間字段
if (col.IsIdentity) attrParts.Add("IsIdentity = true");
// 自動(dòng)時(shí)間戳字段處理
var lowerColName = col.DbColumnName.ToLower();
if (lowerColName == "created_at")
{
// 創(chuàng)建時(shí)間:插入時(shí)自動(dòng)填充
attrParts.Add("InsertServerTime = true");
}
else if (lowerColName == "updated_at")
{
// 更新時(shí)間:插入和更新時(shí)自動(dòng)填充
attrParts.Add("InsertServerTime = true");
attrParts.Add("UpdateServerTime = true");
}
2、重新生成的數(shù)據(jù)模型
/// <summary>
/// 創(chuàng)建時(shí)間
/// </summary>
[SugarColumn(ColumnName = "created_at", InsertServerTime = true)]
public DateTime CreatedAt { get; set; }
/// <summary>
/// 更新時(shí)間
/// </summary>
[SugarColumn(ColumnName = "updated_at", InsertServerTime = true, UpdateServerTime = true)]
public DateTime UpdatedAt { get; set; }
五、配置邏輯刪除字段
1、定義一個(gè)接口
public interface ISoftDelete
{
DateTime? DeletedAt { get; set; }
}
2、自己定義的實(shí)體類都實(shí)現(xiàn)這個(gè)接口
namespace Model.Entity
{
[SugarTable("user")]
public class UserEntity:ISoftDelete
{
/// <summary>
/// 主鍵id
/// </summary>
[SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
}
}
3、在入口文件中使用過(guò)濾器
// 配置邏輯刪除 db.QueryFilter.AddTableFilter<ISoftDelete>(it => it.DeletedAt == null);
4、驗(yàn)證查詢數(shù)據(jù)的時(shí)候,查看執(zhí)行的sql,自動(dòng)加上了邏輯刪除的字段
[HttpGet("{id}")]
public async Task<ApiResult> GetById(int id)
{
var task = await _db.Queryable<UserEntity>().Where(x=>x.Id==id).FirstAsync();
return ResultHelper.Success(task);
}
5、如果想要查詢邏輯刪除的數(shù)據(jù)
[HttpGet("{id}")]
public async Task<ApiResult> GetById(int id)
{
// var task = await _db.Queryable<UserEntity>().Where(x=>x.Id==id).FirstAsync();
var task = await _db.Queryable<UserEntity>()
.Filter(null,true)
.Where(x=>x.Id==id)
.FirstAsync();
return ResultHelper.Success(task);
}
6、使用邏輯刪除數(shù)據(jù)(這里要使用更新操作)
[HttpDelete("{id}")]
public async Task<ApiResult> Delete(int id)
{
await _db.Updateable<UserEntity>()
.SetColumns(it => it.DeletedAt == DateTime.Now)
.Where(x => x.Id == id)
.ExecuteCommandAsync();
return ResultHelper.Success(new { Id = id });
}
到此這篇關(guān)于C#使用sqlSugar操作mysql數(shù)據(jù)庫(kù)的完整教程的文章就介紹到這了,更多相關(guān)C# sqlSugar操作mysql數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C# SqlSugar批量執(zhí)行SQL語(yǔ)句及批量更新實(shí)體對(duì)象的操作方法
- C#使用SqlSugarClient進(jìn)行數(shù)據(jù)訪問(wèn)并實(shí)現(xiàn)了統(tǒng)一的批量依賴注入(示例代碼)
- C#連接Mysql實(shí)現(xiàn)增刪改查的操作
- C#連接MySQL操作詳細(xì)教程
- C#實(shí)現(xiàn)操作MySql數(shù)據(jù)層類MysqlHelper實(shí)例
- C#使用開源驅(qū)動(dòng)連接操作MySQL數(shù)據(jù)庫(kù)
- C#操作mysql數(shù)據(jù)庫(kù)的代碼實(shí)例
相關(guān)文章
IIS下調(diào)用證書出現(xiàn)異常的解決方法 (C#)
這篇文章主要為大家詳細(xì)介紹了IIS下調(diào)用證書出現(xiàn)異常的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
C#使用OpenCvSharp4實(shí)現(xiàn)讀取本地視頻
OpenCvSharp4庫(kù)是一個(gè)基于.Net封裝的OpenCV庫(kù),這篇文章主要介紹了C#使用OpenCvSharp4實(shí)現(xiàn)讀取本地視頻的詳細(xì)教程,有需要的小伙伴可以參考下2024-01-01
Unity實(shí)現(xiàn)物體左右移動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)物體左右移動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08
C#?winform跨線程操作控件的實(shí)現(xiàn)
本文主要介紹了C#?winform跨線程操作控件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
C#中32位浮點(diǎn)數(shù)Float(Real)一步步按位Bit進(jìn)行分析
這篇文章主要介紹了C#中32位浮點(diǎn)數(shù)Float(Real)一步步按位Bit進(jìn)行分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08

