目次
SqlConnection と SqlCommand の違い
SqlClient が SQL Server に接続する
SqlClientをインストールする
vs または Rider の nuget パッケージ マネージャーから直接ダウンロードします。nuget パッケージ System.Data.SqlClient、SqlClient は、SQL Server と他のリレーショナル データベースを接続するために Microsoft が提供するクラス ライブラリです。
SQL接続
using System.Data.SqlClient;
string connectionString = "Server=myServerAddress;Database=myDatabase;User Id=myUsername;Password=myPassword;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
// 进行数据库操作
connection.Close();
}
上記のコードでは、「myServerAddress」を SQL Server データベース サーバーの IP アドレスまたはホスト名に、「myDatabase」を接続するデータベースの名前に、「myUsername」と「myPassword」をデータベースユーザーのユーザー名とパスワード。
SQLコマンド
SqlConnection オブジェクトに加えて、SqlCommand オブジェクトを使用して SQL Server データベースに接続し、SQL クエリ操作を実行することもできます。以下は、SqlCommand オブジェクトを使用して SQL Server データベースに接続するためのサンプル コードです。
using System.Data.SqlClient;
string connectionString = "Server=myServerAddress;Database=myDatabase;User Id=myUsername;Password=myPassword;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand("SELECT * FROM myTable", connection))
{
command.ExecuteReader();
// 进行数据库操作
}
connection.Close();
}
上記のコードでは、「myServerAddress」を SQL Server データベース サーバーの IP アドレスまたはホスト名に、「myDatabase」を接続するデータベースの名前に、「myUsername」と「myPassword」をデータベースユーザーのユーザー名とパスワード。
SqlConnection と SqlCommand の違い
SqlConnection と SqlCommand は、リレーショナル データベースに接続して操作するための SqlClient クラス ライブラリ内の 2 つの重要なオブジェクトですが、次のような違いがあります。
-
接続オブジェクト: SqlConnection はデータベースに接続するオブジェクトであり、データベースとの接続を確立するために使用され、接続状態で SQL ステートメントを実行できます。SqlCommand は SQL ステートメントを実行するために使用されるオブジェクトです。SQL ステートメントと接続オブジェクトの情報が含まれている必要があります。接続状態で SQL ステートメントを実行することも、単独で使用することもできます。
-
SQL ステートメント: SqlCommand オブジェクトは、SELECT、INSERT、UPDATE、DELETE などの任意の SQL ステートメントやその他の操作を含む SQL ステートメントを実行できます。SqlConnection オブジェクトは SQL ステートメントの実行にのみ使用でき、他の操作は実行できません。
-
接続状態: 接続状態で SQL ステートメントを実行するには、SqlCommand オブジェクトに接続オブジェクトの情報が含まれている必要があります。SqlConnection オブジェクトは、接続状態で SQL ステートメントを実行することも、単独で使用することもできます。
-
実行モード: SqlCommand オブジェクトは非同期で実行でき、SQL ステートメントの実行が完了するまで他の操作を実行し続けることができます。SqlConnection オブジェクトは同期的にのみ実行でき、他の操作の実行を続行する前に、コード ブロック内で SQL ステートメントの実行が完了するまで待機する必要があります。
一般に、SqlConnection オブジェクトは主に SQL ステートメントの確立と実行に使用されますが、SqlCommand オブジェクトはより柔軟で、任意の SQL ステートメントを実行できます。
Npgsql が PostgreSQL に接続します
情報によると、SqlClient クラス ライブラリは、SQL Server、MySQL、Oracle、PostgreSQL などのさまざまなリレーショナル データベースに接続するために使用できます。
それを試してみてください
using System.Data.SqlClient;
SqlConnection connection = new SqlConnection ("Server= 127.0.0.1;Database=study;User Id=postgres;Password=1qazZAQ!;");
connection.Open();
どこを間違えたのか分かりませんが、開いたときにエラー報告が出たのでNpgsqlに変更しました
Npgsqlをインストールする
using Npgsql;
string connString = "Host=localhost;Port=5432;Username=postgres;Password=1qazZAQ!;Database=study";
var conn = new NpgsqlConnection(connString);
conn.Open();
ステータスを印刷する
Console.WriteLine(conn.State);
成功!
次に、接続を使用していくつかの操作を実行します。まずデータベース視覚化ツールを開いてテーブルを作成します。
pgsql設定の自動インクリメント
ここで少し口を挟ませていただきますが、pgSQL は MySQL よりも自動インクリメントを設定するのが少し面倒です。
navicat では、mysql は自動インクリメントを設定するオプションを直接チェックできます。
pgsql の場合は、「その他」をクリックしてシーケンスを選択し、新しいシーケンスを作成します。
所有者: テーブルのデータベース名
インクリメント値、現在値、開始値、最大値、最小値
キャッシュ: 迅速にアクセスできるように、データベースに事前に割り当てられたシーケンスの値を指定します。これは、事前に自動インクリメントを提供できることを意味します。たとえば、ID フィールドに自動インクリメントを設定したいので、キャッシュを設定します。このとき、ID は自動的に 2 に増えますが、この 2 はすでに生成されており、今後は生成されません。これにより、データベースへの負担が軽減されます。
周期:自己インクリメント値が最大値設定を超えると再び最小値から開始することを意味し、周期が設定されていない場合は超えたときにエラーが報告されます。
次に、シーケンスを保存します。ここでは pg_test として保存したので、保存した名前を覚えておいてください。
先ほどの設計テーブルに戻ります
id 行をクリックし、デフォルトで nextval('pg_test'::regclass) と入力し、pg_test を設定した名前に置き換えます。それ以降、pgsql の自動インクリメント ID が設定されます。
入れる
using Npgsql;
string connString = "Host=localhost;Port=5432;Username=postgres;Password=1qazZAQ!;Database=study";
using (NpgsqlConnection conn = new NpgsqlConnection(connString))
{
conn.Open();
string sql = "INSERT INTO user1 ( name,age) values ('小明',3)";
using (NpgsqlCommand command = new NpgsqlCommand(sql, conn))
{
command.ExecuteNonQuery();
}
}
2 回実行して navicat を開くと、データベースにデータが追加され、ID が増加していることがわかります。
なぜ私のIDが最初に9なのかというと、何度も実行してテーブルを空にしただけなので、自動インクリメントをリセットした場合は、自動インクリメントを設定した場所に戻り、現在の値を次のように戻します。 1.
選択する
DataReader を使用したクエリ
または、今すぐデータベースに接続してください
string connString = "Host=localhost;Port=5432;Username=postgres;Password=1qazZAQ!;Database=study";
using NpgsqlConnection conn = new NpgsqlConnection(connString);
conn.Open();
添字によるデータの取得
using NpgsqlCommand command = new NpgsqlCommand("select * from user1", conn);
var npgsqlDataReader = command.ExecuteReader();
while (npgsqlDataReader.Read())
{
var student = new Student(
npgsqlDataReader.GetInt32(0),
npgsqlDataReader.GetString(1),
npgsqlDataReader.GetInt32(2)
);
Console.WriteLine(student.Id + student.Name + student.Age);
}
record Student(int Id, string Name, int Age);
フィールド名で取得
using NpgsqlCommand command = new NpgsqlCommand("select * from user1", conn);
var npgsqlDataReader = command.ExecuteReader();
while (npgsqlDataReader.Read())
{
Console.WriteLine(npgsqlDataReader["id"].ToString()+npgsqlDataReader["name"]+npgsqlDataReader["age"]);
}
効果は同じです
DataAdapter を使用したクエリ
DataAdapter と DataReader の違いは、DataAdapter はデータを取得した後に自動的に切断し、データをメモリに保存することです。
string connString = "Host=localhost;Port=5432;Username=postgres;Password=1qazZAQ!;Database=study";
using NpgsqlConnection conn = new NpgsqlConnection(connString);
データをメモリに読み取り、データセットまたはデータテーブルを使用して保存できます
var npgsqlDataAdapter = new NpgsqlDataAdapter();
npgsqlDataAdapter.SelectCommand = new NpgsqlCommand("select * from user1",conn);
// var dataSet = new DataSet();
// npgsqlDataAdapter.Fill(dataSet);//将数据填充到dataSet
var dataTable = new DataTable();
npgsqlDataAdapter.Fill(dataTable);//将数据填充到dataTable
foreach (DataRow dataTableRow in dataTable.Rows)
{
Console.WriteLine(dataTableRow["id"]+(string)dataTableRow["name"]+dataTableRow["age"]);
}
リストするdataTable
List<student> list = new List<student>();
foreach (DataRow dataTableRow in dataTable.Rows)
{
student student = new student(
(int)dataTableRow["id"],
(string)dataTableRow["name"],
(int)dataTableRow["age"]
);
list.Add(student);
}
foreach (var student1 in list)
{
Console.WriteLine(student1);
}
record student(int Id, string Name, int Age);
要約する
コマンドは、SQL クエリの実行またはコマンドの更新に使用されるオブジェクトであり、データベースにデータを渡すための 1 つ以上のパラメーターを含めることができます。Command オブジェクトを使用して、クエリまたは更新操作を実行し、結果セットを返します。
DataAdapter は、データ ソース (データベースなど) とデータ コントロール (データ テーブルなど) を接続するために使用されるオブジェクトです。Command オブジェクトに従って SQL クエリや更新操作を実行し、結果セットをデータ コントロールにバインドできます。
DataReader はデータ セットを読み取るために使用されるオブジェクトで、クエリされたデータを読み取り、それをデータ コントロールにバインドできます。DataReader オブジェクトは、すでにクエリ操作を実行した結果セットしか読み取ることができないため、複雑なクエリ操作の実行には適していません。
通常、これら 3 つのオブジェクトを使用する前に、Connection オブジェクトを使用してデータベースに接続する必要があります。Connection オブジェクトは、データベース接続を管理するために使用されます。これにより、データベース接続を開いたり閉じたり、データベースの接続、切断、または更新操作を実行したりできます。データベースに正常に接続した後にのみ、Command、DataAdapter、および DataReader オブジェクトを使用してデータのクエリ、更新、または読み取りを行うことができます。
平たく言えば、次のとおりです。
Connection はデータベースに接続し、Command は SQL ステートメントを実行します。挿入、更新、および削除の操作で結果セットを返す必要がない場合、値を返す必要のない操作には DataAdapter クラスは必要ありません。通常、クエリ操作は結果セットを返す必要があるため、DataAdapter オブジェクトを使用して結果セットをデータ コントロールにバインドする必要があります。