错误信息:
中文提示 : 连接数据库过程中发生错误,检查服务器是否正常连接字符串是否正确,错误信息:Cannot Open when State is Connecting.DbType="MySql";ConfigId="0".
English Message : Connection open error . Cannot Open when State is Connecting.DbType="MySql";ConfigId="0"
at SqlSugar.Check.Exception(Boolean isException, String message, String[] args)
at SqlSugar.AdoProvider.CheckConnection()
at SqlSugar.AdoProvider.BeginTran()
at WaterCloud.Service.AutoJob.JobExecute.<>c__DisplayClass5_0.<<Execute>b__0>d.MoveNext() in E:\WaterCloud\WaterCloud.Service\AutoJob\JobExecute.cs:line 183
导致该问题的原因是连续两次请求或插入更新时,第一操作后,在第二次操作时,第一次的句柄未完全释放,使第二次操作使用该句柄时,句柄还处于链接状态。
解决方案:使用sqlsugar中的.CopyNew()方法,在每次操作时都使用新的数据库链接
在项目文件中修改内容
文件路径:E:\项目路径\WaterCloud.Data\Repository\RepositoryBase.cs
cs
/*******************************************************************************
* Copyright © 2020 WaterCloud.Framework 版权所有
* Author: WaterCloud
* Description: WaterCloud快速开发平台
* Website:
*********************************************************************************/
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using WaterCloud.Code;
namespace WaterCloud.DataBase
{
/// <summary>
/// 泛型仓储实现
/// </summary>
/// <typeparam name="TEntity"></typeparam>
public class RepositoryBase<TEntity> where TEntity : class, new()
{
// 用于其他表操作
public ITenant Tenant
{
get { return _tenant; }
}
private ITenant _tenant;
private SqlSugarScopeProvider _db;
public SqlSugarScopeProvider Db
{
get { return _db; }
}
/// <summary>
/// 切换上下文,不传参切换到实体租户
/// </summary>
/// <param name="configId"></param>
/// <returns></returns>
public ISqlSugarClient ChangeEntityDb(object configId = null)
{
if (!configId.IsEmpty())
{
_db = _tenant.GetConnectionScope(configId);
}
else
{
_db = _tenant.GetConnectionScopeWithAttr<TEntity>();
}
return _db;
}
public RepositoryBase(ISqlSugarClient scope)
{
_tenant = scope.AsTenant();
_db = Tenant.GetConnectionScopeWithAttr<TEntity>();
}
public async Task<TEntity> Insert(TEntity entity)
{
return await _db.Insertable(entity).ExecuteReturnEntityAsync();
}
public async Task<int> Insert(List<TEntity> entitys)
{
return await _db.CopyNew().Insertable(entitys).ExecuteCommandAsync();
}
public async Task<int> Update(TEntity entity)
{
return await _db.CopyNew().Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
}
public async Task<int> Update(Expression<Func<TEntity, bool>> predicate, Expression<Func<TEntity, TEntity>> content)
{
return await _db.CopyNew().Updateable(content).Where(predicate).ExecuteCommandAsync();
}
public async Task<int> Delete(TEntity entity)
{
return await _db.CopyNew().Deleteable(entity).ExecuteCommandAsync();
}
public async Task<int> Delete(Expression<Func<TEntity, bool>> predicate)
{
return await _db.CopyNew().Deleteable(predicate).ExecuteCommandAsync();
}
public async Task<TEntity> FindEntity(object keyValue)
{
return await IQueryable().InSingleAsync(keyValue);
}
public async Task<TEntity> FindEntity(Expression<Func<TEntity, bool>> predicate)
{
return await IQueryable().FirstAsync(predicate);
}
public ISugarQueryable<TEntity> IQueryable()
{
return _db.CopyNew().Queryable<TEntity>();
}
public ISugarQueryable<TEntity> IQueryable(Expression<Func<TEntity, bool>> predicate)
{
return IQueryable().Where(predicate);
}
public ISugarQueryable<TEntity> IQueryable(string strSql)
{
return _db.CopyNew().SqlQueryable<TEntity>(strSql);
}
}
}
在对应的增删改查操作中加入.CopyNew()方法