前言
自從用 Entity Framework 就再也沒有用過 ADO.NET 了. 很多年前寫過 基礎 ADO.NET 訪問MYSQL 與 MSSQL 數據庫例子.
今天剛好想做個單側, 那就順便翻新一下唄.
安裝
dotnet new console -o TestAdoNet
dotnet add package Microsoft.Data.SqlClient
是 Microsoft.Data.SqlClient 而不是 System.Data.SqlClient 哦, 不要搞混了.
而且用 Microsoft.Data.SqlClient 的話 connection string 一定要 TrustServerCertificate, 參考1, 參考2
Connection
namespace TestAdoNet; public class Program { public static async Task Main() { var connectionStringBuilder = new SqlConnectionStringBuilder( $"Server=192.168.1.152;Database=MyDatabase;User Id=username;TrustServerCertificate=True;" ) { Password = "my password" }; using var connection = new SqlConnection(connectionStringBuilder.ConnectionString); await connection.OpenAsync(); } }
記得要 using 哦, using 結束 connect 也會自動 close.
Command
using var command = new SqlCommand { Connection = connection, CommandText = "SELECT * FROM [Products] WHERE [title] = @title", }; command.Parameters.Add(new SqlParameter("@title", "Fly Sticky Pad Type 1"));
防止 SQL Inject 記得用 Parameter 哦
Read Result
using var reader = await command.ExecuteReaderAsync(); while (await reader.ReadAsync()) // loop rows { for (var i = 0; i < reader.FieldCount; i++) // loop columns { var name = reader.GetName(i); var filedType = reader.GetFieldType(i); var value = reader.GetValue(i); } var id = reader.GetInt32("Id"); // get known column value }
Put result into Table
reader 只能讀取一輪, 如果想復讀可以把它裝進 table 裏
var table = new DataTable(); table.Load(reader); // 需要強轉去 DataRow 和 DataColumn 哦 foreach (DataRow row in table.Rows) // loop rows { foreach (DataColumn column in table.Columns) // loop column { if (column.ColumnName == "id") { row.Field<int>(column); // get by column var cell1 = row.Field<int>(0); // get by index } } foreach (var value in row.ItemArray) // loop cells { } }
其它
以後有用到才寫 TODO...