.NET 操作 SqlServer

连接字符串

注意1:部分版本要加上 Encrypt=True;TrustServerCertificate=True;

注意2:  .net8出现全球化错误看下面标题 【.NET8配置注意】

//SqlSugar或者SqlSugarCore 1.1.4.68以下版本
server=.;uid=sa;pwd=haosql;database=SQLSUGAR4XTEST

//SqlSugarCore 5.1.4.169上以上版本
server=.;uid=sa;pwd=haosql;database=SQLSUGAR4XTEST;Encrypt=True;TrustServerCertificate=True;

如果ORM连接不上数据库:
请使用原生写法测试:new   SqlConnection("字符串").Open(); 原生写法通过ORM就能用

new SqlConnection(db.CurrentConfig.ConnectionString).Open()//原生进行测试 是否是 SqlSUgar问题

如果是偶发情况:那么就使用SqlSugarScope 单例模式保证线程安全或者排查线程问题

注意:连不上库看一下标题10

.NET8配置注意

SqlServer 改一下启动项目的 csproj文件 ,设置为false

 <InvariantGlobalization>false</InvariantGlobalization>

SqlServer新人注意

SqlServer默认事务是禁止脏读的,安全级别比较高

中大型项目DBA规范: 事务外的查询必须加NoLock

我参与过欧美大型项目和一些微软战略合作伙伴项目都是这个规范

1、With( nolock ) 语法

 1.1 nolock

 允许脏读 nolcok  nolcok  nolcok  nolcok 

//单个设置 无锁
db.Queryable<Order>().With(SqlWith.NoLock).ToList()

//全局设置
var db= new SqlSugarClient(new ConnectionConfig()
            {
                DbType = SqlSugar.DbType.SqlServer,
                ConnectionString = Config.ConnectionString,
                IsAutoCloseConnection = true,
                MoreSettings=new ConnMoreSettings() {
                     IsWithNoLockQuery=true//看这里
                     //新功能:事务禁用NoLock 
                     //DisableWithNoLockWithTran = true
                     //需要和IsWithNoLockQuery一起使用才有效果
                });

//全局设置禁用自动Nolock,只针对当前查询禁用
db.Queryable<Order>().With(SqlWith.Null).ToList()

//全局设置禁用自动Nolock,只针对当前上下文禁用
db.CurrentConnectionConfig.MoreSettings.IsWithNoLockQuery = false;

 1.2 With Index

db.Queryable<Order>().With("with(indexname, NoLock)").ToList()

2、Linux Centeros

建议用高版本的SqlServer数据库 

3、常见性能优化

 3.1 N''参数性能优化

 原理:ORM默认字符串都是nvarchar参数的方式传到数据库

 问题:特殊情况会影响索引,导致性能失效,并不是所有SQL都有影响

 方案:

//1通过特性指定类型
[SugarColumn(SqlParameterDbType =System.Data.DbType.AnsiString)] 
public string  name { get; set; }

//2. 全局操作 (适合所有表都没有nvarchar)
DbType = SqlSugar.DbType.Oracle,
ConnectionString = Config.ConnectionString,
InitKeyType = InitKeyType.Attribute,
 MoreSettings=new ConnMoreSettings() {
        DisableNvarchar=true//添加这一行 ,将参数全部转成varchar模式
}

//3. 指定当方法 (在当前方法加上这行,这个方法里面会生效)
db.CurrentConnectionConfig.MoreSettings=new MoreSettings(){DisableNvarchar=true};


//4. 指定具体代码   (具体的条件会生效)
Where(it=>it.Name==SqlFunc.ToVarchar("张"))//函数只能用到参数上面,字段要走索引禁止用函数

//5. 原生SQL用法
var name=new SugarParameter("@name","haha",System.Data.DbType.AnsiString)

 3.2 NoLock性能优化

sqlserver查询默认是不能脏读的,所以在非事务的查询操作一定开启nolock,行业规范,一般写sqlserver都这样操作

 3.3 异步:大文本或者大文件

升级SqlSugarCore到5.1.4.136及以上,或者单独安装 Microsoft.Data.SqlClient到最新

3.4  异步 调试启动 .NET API慢

需要ctrl+F5启动项目 或者发布项目测试,SqlServer驱动异步在调试下不快,ctrl+F5启动项目 测试就行了

4、SqlServer中geometry

实体定义

    public class UnitGe 
    {
            [SugarColumn(ColumnDataType = "geometry")]
            public string geometry1 { get; set; }
        }

代码

db.Insertable(new UnitGe() { geometry1 = "POINT (20 180)" }).ExecuteCommand();
var gelist=db.Queryable<UnitGe>().Select(it=>new { geometry1 = it.geometry1.ToString()}).ToList();

用例1

GemoSqlServer.rar

用例2

SqlSugarUdtDemo.zip

5、Sql 存储过程 DataTable参数

表变量、表值、表参数

 //SqlSugar中用法
 var s = new SugarParameter("@p", dt);
 s.TypeName = "dtTableName";   
   
//等同于原生SQL
//sqlParameter.TypeName = "dtTableName";
//sqlParameter.SqlDbType = SqlDbType.Structured;

6、sql server 2000

对于这版本请使用 .net framework版本SqlSugar ,如果用低版本SqlSugar InitKey=InitKey.Attribute要设置

功能除了CodeFirst 和 分页其他功能应该没问题

7、微软连不上大全

https://docs.microsoft.com/zh-cn/sql/connect/ado-net/sqlclient-troubleshooting-guide?view=sql-server-ver15

8、CodeFirst默认使用Nvarchar

   DbType = SqlSugar.DbType.SqlServer,
    ConnectionString = Config.ConnectionString,
    IsAutoCloseConnection = true,
     MoreSettings=new ConnMoreSettings() {
          SqlServerCodeFirstNvarchar= true,//建表字符串默认Nvarchar
     }

9、指定索引

SqlServer中指定索引

db.Queryable<T>.With("WITH(INDEX(index_name))").ToList();

10、Schema用法

注意:这个sqlserver中用法,其他库看其他库用法

    var db = new SqlSugarClient(new ConnectionConfig()
    { 
        IsAutoCloseConnection = true,
        DbType = DbType.SqlServer,
        ConnectionString = Connection,
        ConfigureExternalServices = new ConfigureExternalServices()
        {
            EntityNameService = (type, entity) =>
            {
                entity.DbTableName = $"myschema1.{entity.DbTableName}";
            }
        }
    });//这个是sqlserver中用法,不同库看具体文档

11、连不上库解决方案

11.1  Sqlsugar linux下  连接sqlserver 2008 提示tsl/ssl握手错误

  安装一个sqlserver tls1.2补丁包(SQLServer2008R2-KB4057113-x64)就解决了

11.2 The negotiated TLS 1.0错误

The negotiated TLS 1.0 is an insecure protocol and is supported for backward compatibility only. The recommended protocol version is TLS 1.2 and later.

解决方案:

安装一个sqlserver tls1.2补丁包 或者 升级SqlServer

11.3 successfully established

Microsoft.Data.SqlClient.SqlException (0x80131904): A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0 - The certificate chain was issued by an authority that is not trusted.) ---> System.ComponentModel.Win32Exception (0x80090325): The certificate chain was issued by an authority that is not trusted.

方案1. 在客户端环境中安装目标 SQL Server 的 TLS/SSL 证书。 如果需要加密,将对其进行验证。

方案2.(不太安全)在连接字符串中设置“TrustServerCertificate=true”属性。

方案3.(不安全的解决方案在 docker 映像/客户端环境中配置 TLS/SSL 设置,以便与 TLS 1.0 连接。

MinProtocol = TLSv1 

CipherString = DEFAULT@SECLEVEL=1

11.4 Only the invariant  globalization

Only the invariant culture is supported in globalization-invariant mode. See https://aka.ms/GlobalizationInvariantMode for more information. (Parameter 'name')

//SqlServer如果报下面配置相关的错要改成false
 <InvariantGlobalization>false</InvariantGlobalization>    
//改一下启动文件把这个设为false

是启动项目的.csproj文件

11.5 更多

https://docs.microsoft.com/zh-cn/sql/connect/ado-net/sqlclient-troubleshooting-guide?view=sql-server-ver15

关闭
果糖网