読者です 読者をやめる 読者になる 読者になる

1.21 jigowatts

Great Scott!

データベース接続!ADO.NETでSQLServerに接続する?

C#

概要

.NET Framework初期のテクノロジであるADO.NETの接続型と呼ばれる方法でSQLServerに接続してみます。

ADO.NET 接続型

.NET Framework初期のテクノロジで低レベルAPIです。パフォーマンスはいいんだけどデータベースに接続し続けるんで、時間のかかる処理とかだとサーバリソースを消費しちゃいます。
SQL文は文字列のため、パラメータはSQLインジェクションを防ぐためにSqlParameterクラスを使用します。
使いどころとしては、

パフォーマンスが要求されるバッチ処理や定期的なバッチ処理や、更新が頻繁に行われるトランザクション処理

に対してADO.NET接続型が向いているようです。

SELECT
public List<WorkData> Select() 
{
    using (SqlConnection con = new SqlConnection(
        System.Configuration.ConfigurationManager.ConnectionStrings["ADONetConnection"].ConnectionString))
    using (SqlCommand cmd = con.CreateCommand())
    {

        //接続を開いて..
        con.Open();
        cmd.CommandText = "Select * from dbo.T_Work";

        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            var list = new List<WorkData>();
            while (reader.Read())
            {
                var rec = new WorkData();
                rec.ID = (int)reader["ID"];
                rec.ProductCode = (string)reader["ProductCode"];
                rec.ProductName = (string)reader["ProductName"];
                rec.CategoryNo = (string)reader["CategoryNo"];
                rec.Type = (string)reader["Type"];
                list.Add(rec);
            }
            return list;
        }
        //処理が終わると接続を閉じます。
    }
}
INSERT
public void Insert(WorkData data) 
{
    using (SqlConnection con = new SqlConnection(
        System.Configuration.ConfigurationManager.ConnectionStrings["ADONetConnection"].ConnectionString))
    {
        SqlCommand cmd = new SqlCommand(
            "Insert into dbo.T_Work (ProductCode,ProductName,CategoryNo,Type) Values (@ProductCode,@ProductName,@CategoryNo,@Type)", 
            con);
        cmd.Parameters.AddWithValue("@ProductCode", data.ProductCode);
        cmd.Parameters.AddWithValue("@ProductName", data.ProductName);
        cmd.Parameters.AddWithValue("@CategoryNo", data.CategoryNo);
        cmd.Parameters.AddWithValue("@Type", data.Type);
        con.Open();
        cmd.ExecuteNonQuery();
    }        
}
UPDATE
public void Update(WorkData data) 
{
    using (SqlConnection con = new SqlConnection(
        System.Configuration.ConfigurationManager.ConnectionStrings["ADONetConnection"].ConnectionString))
    {
        SqlCommand cmd = new SqlCommand(
            "Update dbo.T_Work Set ProductCode=@ProductCode,ProductName=@ProductName,CategoryNo=@CategoryNo,Type=@Type Where ID=@Id",
            con);
        cmd.Parameters.AddWithValue("@ProductCode", data.ProductCode);
        cmd.Parameters.AddWithValue("@ProductName", data.ProductName);
        cmd.Parameters.AddWithValue("@CategoryNo", data.CategoryNo);
        cmd.Parameters.AddWithValue("@Type", data.Type);
        cmd.Parameters.AddWithValue("@Id", data.ID);
        con.Open();
        cmd.ExecuteNonQuery();
    }    
}
DELETE
public void Delete(WorkData data)
{
    using (SqlConnection con = new SqlConnection(
        System.Configuration.ConfigurationManager.ConnectionStrings["ADONetConnection"].ConnectionString))
    {
        SqlCommand cmd = new SqlCommand(
            "Delete from dbo.T_Work Where ID=@Id",
            con);
        cmd.Parameters.AddWithValue("@Id", data.ID);
        con.Open();
        cmd.ExecuteNonQuery();
    }    
}
接続文字列はconfigに設定

App/Web.config

<configuration>
  <connectionStrings>
    <add name="ADONetConnection" connectionString="server=(localdb)\v11.0;database=LocalDB;Integrated Security=True"/>
  </connectionStrings>
</configuration>