为什么要经常使用ODBC衔接SQL Server?
ODBC 和 JDBC 都提供了一种通用的模式来访问数据库,准许开发人员经常使用规范 SQL 语句来操作各种不同类型的数据库。ADO.NET则是微软针对 .NET 平台开发的数据库访问接口,提供了与 ODBC 相似的配置,但愈加面向对象,具备更好的性能和可裁减性。ODBC是什么?
ODBC是什么?我也不知道,用摘抄一个互联网上的话来解释:ODBC英文全称为:Open>
// 由于修正了好几次,所以消息我曾经对不上了,大略发生了上方的这些Connection Timeout Expired. The timeout period elapsed during the post-login phase. The connection could have timed out while waiting for server to complete the login process and respond; Or it could have timed out while attempting to create multiple active connections. The duration spent while attempting to connect to this server was - [Pre-Login] initialization=3; handshake=10; [Login] initialization=0; authentication=0; [Post-Login] complete=14074;或许Microsoft.Data.SqlClient.SqlException (0x80131904): A connection was successfully established with the server, but then an error occurred during the pre-login handshake.(provider: SSL Provider, error: 31 - Encryption(ssl/tls) handshake failed)System.IO.EndOfStreamException: End of stream reached或许SSL Handshake failed with OpenSSL error - SSL_ERROR_SSL。
遇到这个疑问,咱们首先想在衔接字符串上操作去修复处置这个疑问,然而最后没有处置,咱们想在公司复现,首先间接在我自己电脑本地衔接sqlserver2019是没有疑问的,而后没方法又在主机装置了sqlserver2008也没有疑问(这里我还傻不拉几想着经常使用容器部署一个sqlserver2008快,而后信了一个博客老哥的鬼话去拉取他的镜像,结果拉取上去是2019版本的,起初查阅资料才知道sqlserver2008哪里有什么镜像),而后又模拟正式环境容器化部署,而后终于复现了上方的失误,而后就开局尝试,咱们也在网络上查阅了资料,终于在一个文章上看到sqlserver2008不支持TLS1.2,而后依照那个文档的方法去降低容器TSL版本,比如dockerfile参与
RUN sed -i 's/MinProtocol = TLSv1.2/MinProtocol = TLSv1/g' /etc/ssl/openssl.cnfRUN sed -i 's/MinProtocol = TLSv1.2/MinProtocol = TLSv1/g' /usr/lib/ssl/openssl.cnf
结果还是不行,失误变了,继续查阅文章,而后终于找到【嘿dotNet】群众号老哥的一个博客,他在2019年遇到了这个疑问,我将他总结性的那局部摘抄进去
只管这个文章的评论中也提到了更新数据库版本可以处置,然而?甲方那边更新数据库必需不事实的,那只好思考换个组件什么的?我也尝试了EFCore依赖的包Microsoft.Data.SqlClient也是不行,所以这个时刻就咨询其余部门(java)那边衔接反常不?他们回复没有疑问,而后就发生了要不再搞个java服务去衔接的念头???这多难堪,衔接微软家的数据库还须要去费事其余言语???
指导说再找找资料 。。。而后就找到了Microsoft ODBC Driver for SQL Server
开局操作
在Nuget上搜查odbc,排名第一个的一个包是微软和dotnetframework保养的,最近一次性更新在几天前,还是8.0.0版本怪新,那就依据文档去操作吧,这里须要留意的是经常使用ODBC去操作数据库是须要手动装置驱动的,比如我本地调试须要去下载驱动装置
上方来演示一个衔接的小示例,新建一个控制台名目名字叫做MsSqlNetCoreOdbc(这里我间接创立.Net6的控制台名目),而后装置nuget包
编写如下代码
using System.Data.Odbc;try{var str = "Server=xxxx;Database=dbName;Uid=sa;Pwd=123xxxx;Encrypt=no;driver=ODBC Driver 18 for SQL Server";await using var connection = new OdbcConnection(str);connection.Open();string sqlQuery = "Select @@version";var command = new OdbcCommand(sqlQuery, connection);var reader = command.ExecuteScalar();Console.WriteLine(reader.ToString());Console.WriteLine("conn success");Console.WriteLine("over");}catch (Exception ex){Console.WriteLine($"message:{ex.Message} stackTrace:{ex.StackTrace}");}Console.ReadLine();
这里光看这个示例的话,和之前经常使用System.Data.SqlClient的改变确实不大,换了一个包,经常使用OdbcConnection创立DbConnection(须要留意的是假设你要经常使用到参数化等就须要留意了,它的参数化不是@key,而是?key? 我