一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sql Server - 為什么要使用ODBC連接SQLServer?

為什么要使用ODBC連接SQLServer?

2024-01-02 08:40未知服務器之家 Sql Server

ODBC是什么? ODBC是什么?我也不知道,用摘抄一個互聯網上的話來解釋:ODBC英文全稱為:Open Database Connectivity。用于在不同的操作系統和數據庫管理系統之間進行數據訪問的標準化接口。它提供了一組函數和API,使得應用程序可以

ODBC是什么?

ODBC是什么?我也不知道,用摘抄一個互聯網上的話來解釋:ODBC英文全稱為:Open Database Connectivity。用于在不同的操作系統和數據庫管理系統之間進行數據訪問的標準化接口。它提供了一組函數和API,使得應用程序可以通過統一的方式訪問不同類型的數據源。大多數數據源都有適用的 ODBC 驅動程序。

那么ODBC和ADO.NET以及JDBC的關系是什么?讓GPT來回答一下吧:

ODBC(Open Database Connectivity)和ADO.NET(ActiveX Data Objects .NET)是 Microsoft 開發的數據庫訪問接口。而 JDBC(Java Database Connectivity)則是由 Sun Microsystems 開發的 Java 數據庫訪問標準。

ODBC 和 JDBC 都提供了一種通用的方式來訪問數據庫,允許開發人員使用標準 SQL 語句來操作各種不同類型的數據庫。ADO.NET則是微軟針對 .NET 平臺開發的數據庫訪問接口,提供了與 ODBC 類似的功能,但更加面向對象,具有更好的性能和可擴展性。

為什么要使用ODBC而不使用EFCore?

我也想使用EFCore或者其他的ORM框架,但是走不通!首先場景是這樣子的,我們業務中有一個地方需要去連接甲方的數據庫,然后查詢數據,這個時候我們是使用的System.Data.SqlClient+Dapper來執行SQL查詢的,可是一直報錯,大概信息就是類似下面這些

// 因為修改了好幾次,所以信息我已經對不上了,大概出現了下面的這些
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.cnf
RUN sed -i 's/MinProtocol = TLSv1.2/MinProtocol = TLSv1/g' /usr/lib/ssl/openssl.cnf

結果還是不行,錯誤變了,繼續查閱文章,然后終于找到【嘿dotNet】公眾號老哥的一個博客,他在2019年遇到了這個問題,我將他總結性的那部分摘抄出來

.net core 的System.Data.SqlClient支持的最低SqlServer版本是2008 r2 SP3,小于這個版本的就會報這個錯。

來源:https://github.com/dotnet/corefx/issues/9719

結論:.netcore 連接使用sqlserver遇到以上報錯1、報錯2的同學,需注意:**.net core 的System.Data.SqlClient支持的最低SqlServer版本是2008 r2 SP3**請先檢查數據庫版本。

呼~這個鬼問題浪費了我整整兩天+(3個熬夜)

文章地址:https://www.cnblogs.com/xiaxiaolu/p/10309064.html

雖然這個文章的評論中也提到了升級數據庫版本可以解決,但是?甲方那邊升級數據庫肯定不現實的,那只好考慮換個組件什么的?我也嘗試了EFCore依賴的包Microsoft.Data.SqlClient也是不行,所以這個時候就咨詢其他部門(java)那邊連接正常不?他們回復沒有問題,然后就產生了要不再搞個java服務去連接的念頭???這多尷尬,連接微軟家的數據庫還需要去麻煩其他語言???

領導說再找找資料 。。。然后就找到了Microsoft ODBC Driver for SQL Server

開始操作

在Nuget上搜索odbc,排名第一個的一個包是微軟和dotnetframework維護的,最近一次更新在幾天前,還是8.0.0版本怪新,那就根據文檔去操作吧,這里需要注意的是使用ODBC去操作數據庫是需要手動安裝驅動的,比如我本地調試需要去下載驅動安裝

下面來演示一個連接的小示例,新建一個控制臺項目名字叫做MsSqlNetCoreOdbc(這里我直接創建.Net6的控制臺項目),然后安裝nuget包

<ItemGroup>
  <PackageReference Include="System.Data.Odbc" Version="6.0.1" />
</ItemGroup>

編寫如下代碼

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? 我

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 啪啪大幂幂被c | 免费在线视频观看 | 99在线资源 | 青青草成人影院 | 好湿好紧太硬了我太爽了h 好湿好滑好硬好爽好深视频 | 日本大尺度激情做爰叫床 | 思思玖玖玖在线精品视频 | 青青草成人在线 | 娇小老少配xxxxx性视频 | 波多野结衣中文字幕在线 | 国产麻豆91网在线看 | 亚洲精品久久久成人 | 国语视频高清在线观看 | 欧美不卡一区二区三区免 | 国产麻豆在线观看网站 | 色综合视频在线 | 日韩欧美天堂 | 日本护士撒尿xxxxhd | 好男人好资源在线观看免费 | 无码AV毛片色欲欧洲美洲 | 毛片在线网址 | 精品一成人岛国片在线观看 | 日剧整部剧护妻狂魔免费观看全集 | 亚洲国产美女精品久久久久 | 四虎影院最新网址 | 亚洲国产一区二区三区a毛片 | 欧美区在线 | 美女张开下身让男人桶 | 国产亚洲视频在线 | 男人香蕉好大好爽视频 | 天堂成人在线观看 | 描写细腻的高h肉 | 亚洲欧美天堂综合久久 | 色视频国产 | aaa一级最新毛片 | 午夜在线观看视频 | 国产性视频 | 亚洲毛片基地4455ww | 久久午夜一区二区 | 欧美s级人做人爱c视频 | 国产探花视频 |