C#にてSQL Server を使用する方法を説明します。

using で System.Data.SqlClient を追加します。

他のDBに接続する場合もほぼ同様となります。(System.Data.Odbc、System.Data.OleDb)など

またオープンソース等も同等の関数が用意されている場合があります。

Postgre (Npgsql)、SQLite(System.Data.SQLite)、MySql(MySql.Data.MySqlClient)などライセンスには注意してください。

SQL Serverに接続

単にSQL Server に接続するだけのサンプルです。(例はD:\DB\TestDB.mdfのデータベースに接続しています)

using System;
using System.Data;
using System.Data.SqlClient;

namespace DBTest
{
    class sample
    {
        public void Connect01()
        {
            SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
            builder.DataSource = @".\SQLEXPRESS";
            builder.AttachDBFilename = @"D:\DB\TestDB.mdf";
            builder.IntegratedSecurity = true;
            builder.UserInstance = true;
            builder.MultipleActiveResultSets = true;
            String ConnectString = builder.ToString();

            SqlConnection sqlConnect = new SqlConnection();

            sqlConnect.ConnectionString = ConnectString;

            // 接続します。
            sqlConnect.Open();

            // 接続を解除します。
            sqlConnect.Close();

            sqlConnect.Dispose();
        }
    }
}

 

レコードを追加する(INSERT)

データベースにINSERTする方法です。以下の例はSqlCommandのParametersにて追加をしています。

using System;
using System.Data;
using System.Data.SqlClient;

namespace DBTest
{
    class sample
    {
        public void Connect02()
        {
            string ConnectString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=D:\DB\TestDB.mdf;Integrated Security=True;MultipleActiveResultSets=True;User Instance=True";
            using (SqlConnection sqlConnect = new SqlConnection(ConnectString))
            {
                sqlConnect.Open();

                string sqlStr = "INSERT INTO Table_1 (Item1,Item2) VALUES (@Item1,@Item2)";
                using (SqlCommand command = new SqlCommand(sqlStr, sqlConnect))
                {
                    String val = "AAAAA";
                    SqlParameter p1 = new SqlParameter("@Item1", val);
                    command.Parameters.Add(p1);

                    //SqlParameterの省略追加
                    command.Parameters.Add("@Item2", SqlDbType.Char).Value = "XXXX2";

                    command.ExecuteNonQuery();
                }

                sqlConnect.Close();     //usingは省略可能
            }
        }
    }
}

※エスケープ処理には注意が必要です。Parametersが行ってますが、オープンソース等も同じとはかぎりません。

 

DataTableにレコードを読み込む

DataTableにSELECT文で指定したレコードデータを読み込む例です。

using System;
using System.Data;
using System.Data.SqlClient;

namespace DBTest
{
    class sample
    {       
        public void Connect03()
        {
            DataTable tbl = new DataTable(); 
            
            string ConnectString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=D:\DB\TestDB.mdf;Integrated Security=True;MultipleActiveResultSets=True;User Instance=True";
            using (SqlConnection sqlConnect = new SqlConnection(ConnectString))
            {
                sqlConnect.Open();

                using (SqlCommand command = sqlConnect.CreateCommand())
                {
                    command.CommandText = @"SELECT * FROM Table_1";

                    SqlDataReader reader = command.ExecuteReader();
                    tbl.Load(reader);
                    reader.Close();
                }

                sqlConnect.Close();     //省略可
            }
        }
    }
}

※注意としては、データ量が大きすぎるとデータをDataTableに読み込みきれずプログラムが落ちます。

 

レコード数を取得する

SELECT のCOUNTにて レコード数を取得する例です。

using System;
using System.Data;
using System.Data.SqlClient;

namespace DBTest
{
    class sample
    {
        public void Connect04()
        {
            string ConnectString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=D:\DB\TestDB.mdf;Integrated Security=True;MultipleActiveResultSets=True;User Instance=True";

            int Count;
            using (SqlConnection sqlConnect = new SqlConnection(ConnectString))
            {
                sqlConnect.Open();

                using (SqlCommand command = new SqlCommand("SELECT COUNT(*) FROM Table_1", sqlConnect))
                {
                    Count = (int)command.ExecuteScalar();
                }

                sqlConnect.Close();     //省略可
            }
        }
    }
}

 

スキーマ情報の取得

レコードフィールドの属性の取得方法の例です。

using System;
using System.Data;
using System.Data.SqlClient;

namespace DBTest
{
    class sample
    {
        public void Connect05()
        {
            string ConnectString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=D:\DB\TestDB.mdf;Integrated Security=True;MultipleActiveResultSets=True;User Instance=True";

            DataTable AllTable;
            DataTable schemaTable;
            using (SqlConnection sqlConnect = new SqlConnection(ConnectString))
            {
                sqlConnect.Open();

                //全てのテーブルを取得します。
                AllTable = sqlConnect.GetSchema("Tables");

                using (SqlCommand command = sqlConnect.CreateCommand())
                {
                    command.CommandText = "SELECT * FROM Table_1";
                    SqlDataReader dtReader = command.ExecuteReader();

                    //テーブル内の列情報を取得します。
                    schemaTable = dtReader.GetSchemaTable();

                    dtReader.Close();
                }

                sqlConnect.Close();     //省略可
            }
        }
    }
}

 

トランザクション

データベースにトランザクションを行う例です。

using System;
using System.Data;
using System.Data.SqlClient;

namespace DBTest
{
    class sample
    {
        public void Connect06()
        {
            SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
            builder.DataSource = @".\SQLEXPRESS";
            builder.AttachDBFilename = @"D:\DB\TestDB.mdf";
            builder.IntegratedSecurity = true;
            builder.UserInstance = true;
            builder.MultipleActiveResultSets = true;
            String ConnectString = builder.ToString();

            using (SqlConnection sqlConnect = new SqlConnection(ConnectString))
            {
                sqlConnect.Open();

                using (SqlCommand command = sqlConnect.CreateCommand())
                {
                    //トランザクション処理を開始する
                    using (SqlTransaction tran = sqlConnect.BeginTransaction())
                    {
                        //コマンドをトランザクション処理に組み入れる
                        command.Transaction = tran;

                        try
                        {
                            command.CommandText = "UPDATE Table_1 SET Item2 = 'A0001'";
                            command.ExecuteNonQuery();

                            //コミット処理
                            tran.Commit();
                        }
                        catch (Exception ex)
                        {
                            //ロールバック処理
                            tran.Rollback();
                        }
                    }
                }

                sqlConnect.Close();     //省略可
            }
        }
    }
}