C#データベースへの接続方法

8787 ワード

以下に、c#データベースへの接続方法について説明します.
ASP.NETがデータベースに接続する技術をADOという.NETは、sql文をデータベースにコミットするためのクラスです.ここに接続されているのはSql Server 2008データベースで、他のデータベースの使い方はあまり悪くありませんが、呼び出しのクラス名が違います.
まずWeb.config(ローカルの追加アプリケーションプロファイルApp.config、ローカルにSystem.configuration.dllプログラムセットも追加)にデータベース接続文字列を構成し、次のノードコードを追加します.


 
 
nameはリンク文字列名で、勝手に取ることができます.connectionStringはリンク文字列です.Data SourceデータベースがあるサーバのIPアドレスは、ここではローカルに「.」と書きます.Initial Catalogはデータベース名です.User Idはデータベース・ユーザーであり、saは最高権限管理者アカウントであり、慎重に使用する必要があり、データベースに対して専用の制限されたアカウントを確立します.Passwordはパスワードです.
プログラムがデータベースを使用する場合、プロファイルの接続文字列を抽出して変数に割り当てます.コードは次のとおりです.

public static readonly string connstr =
ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;
コンフィギュレーションマネージャは静的クラスであり、クライアントアプリケーションプロファイルへのアクセスを提供します.
次にデータベース接続を開き、使用が完了したらusingで自動的に接続を解除します.
SqlConnectionは、SQL Serverデータベースのオープン接続を示すシールクラスです.次にSQL文を実行し、まずデータベースにコマンドを送信するために使用するSqlCommandクラスを定義し、定義した後に文が実行する接続オブジェクトがconnであることを決定し、実行するSQL文を決定します.使用例は次のとおりです.

//SqlConnection            
using(SqlConnection conn = new SqlConnection(connstr))
{
conn.Open();//    
//               (Command)   SqlCommand
using(SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText =”Insert into T_Student*(Name,Age) values(‘XXX',18)”;// CommandText    SQL  
cmd.ExecuteNonQuery();//  
}
}
ExecuteNonQuery()は、一般的にUpdate、Delete、Insert文を実行するために使用されます.
1行、1列の戻り値の結果に対してExecuteScale()を実行し、objectタイプを返します.例を次に示します.

using(SqlConnection conn = new SqlConnection(connstr))
{
conn.Open();//    
//               (Command)   SqlCommand
using(SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText =”select Name from T_Student where Name=”XXX””;// CommandText    SQL  
cmd.ExecuteScalar();//  
}
}
戻り値に複数行の結果がある場合はExecuteReader()を、戻りタイプSqlDataReaderを使用します.たとえば、次のように使用します.

using(SqlConnection conn = new SqlConnection(connstr))
{
conn.Open();//    
//               (Command)   SqlCommand
using(SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText =”select * from T_Student where Age<18”;
using(SqlDataReader reader=cmd.ExecuteReader()
{
  while(reader.Read())
{
 string name=reader.GetString(1);//        
 int age=reader.GetIn32(2); //   2    
 Console.WriteLine(name);
 Console.WriteLine(age.ToString());
}
}
}
}
ここでReadメソッドはboolタイプを返し、クエリの結果はデータベースに格納され、クライアントに格納されません.最初のポインタが最初のデータを指す前に、Readerポインタを呼び出すたびに1つ下に移動し、最後のポインタに移動しない限りtrueに戻ります.readerのGetStringGetInt 32などのメソッドは整数パラメータ、すなわちシーケンス番号のみを受け入れ、GetOrdinalメソッドでカラム名に基づいてシーケンス番号を動的に得る.
0列
第1列
2列目
第3列
Id
Name
Age
Hobby
1
XXX
18
妹に取り入る
2
王旭
30
妹に取り入る
図1データベースT_Studentテーブル
データベース注入の脆弱性を回避するために、マイクロソフトには次のようなクエリー・パラメータが設定されています.
cmd.CommandText =”select * from T_Student where Age
cmd.Parameters.Add(new SqlParameter(“@Age”,19));
ここでは@Ageをクエリーパラメータに設定しますが、@パラメータはテーブル名、フィールド名、selectなどのキーワードなどを置き換えることはできません.
SqlDataReaderは接続に関連しており、SqlDataReaderのクエリー結果はプログラムではなく、データベース・サーバに配置されます.SqlDataReaderはカーソルに相当し、どこでどこで読むかを指します.
    ADO.NETはデータセットメカニズムを提供し、DataSetは、ローカルメモリが存在し、それはいくつかのDataTableを含み、DataTableはいくつかの行DataRowを含む.使用方法:

DataSet dataset=new DataSet();
SqlDataAdapter adapter=new SqlDataAdapter(cmd);
adapter.Fill(dataset);
SqlDataAdapterは、SqlCommandクエリの結果をDataSetに埋め込むクラスです.DataSetはローカルのlistセット(小さなデータベース)に相当します.遍歴方法は次のとおりです.

DataTable table=dataset.Tables[0];//         Tables,       select      Tables。

DataRowCollection rows=table.Rows;
for(int i=0;i
基本的にすべてのステップは、リンクを開く--コマンドを作成する--実行する--実行結果を処理します.だから、共通クラスを書いて自分で使うことができて、重複コードを避けて、詳細なコードは以下の通りです.

public static class SqlHelper
  {
    public static readonly string connstr =
      ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;
    public static SqlConnection OpenConnection()//    
    {
      SqlConnection conn = new SqlConnection(connstr);
      conn.Open();
      return conn;
    }
    public static int ExecuteNonQuery(string cmdText,
      params SqlParameter[] parameters)//                 
    {
      using (SqlConnection conn = new SqlConnection(connstr))
      {
        conn.Open();
        return ExecuteNonQuery(conn, cmdText, parameters);
      }
    }
    public static object ExecuteScalar(string cmdText,
      params SqlParameter[] parameters)
    {
      using (SqlConnection conn = new SqlConnection(connstr))
      {
        conn.Open();
        return ExecuteScalar(conn, cmdText, parameters);
      }
    }
    public static DataTable ExecuteDataTable(string cmdText,
      params SqlParameter[] parameters)
    {
      using (SqlConnection conn = new SqlConnection(connstr))
      {
        conn.Open();
        return ExecuteDataTable(conn, cmdText, parameters);
      }
    }
    public static int ExecuteNonQuery(SqlConnection conn,string cmdText,
      params SqlParameter[] parameters)
    {
      using (SqlCommand cmd = conn.CreateCommand())
      {
        cmd.CommandText = cmdText;
        cmd.Parameters.AddRange(parameters);
        return cmd.ExecuteNonQuery();//        
      }
    }
    public static object ExecuteScalar(SqlConnection conn, string cmdText,
      params SqlParameter[] parameters)
    {
      using (SqlCommand cmd = conn.CreateCommand())
      {
        cmd.CommandText = cmdText;
        cmd.Parameters.AddRange(parameters);
        return cmd.ExecuteScalar();
      }
    }
    public static DataTable ExecuteDataTable(SqlConnection conn, string cmdText,
      params SqlParameter[] parameters)
    {
      using (SqlCommand cmd = conn.CreateCommand())
      {
        cmd.CommandText = cmdText;
        cmd.Parameters.AddRange(parameters);
        using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
        {
          DataTable dt = new DataTable();
          adapter.Fill(dt);
          return dt;
        }
      }
    }
    public static object ToDBValue(this object value)
    {
      return value == null ? DBNull.Value : value;
    }
    public static object FromDBValue(this object dbValue)
    {
      return dbValue == DBNull.Value ? null : dbValue;
    }
  }
パッケージメソッドの原則:不変のメソッドに、変化のパラメータに、SqlHelperクラスの戻り値は1行1列のExecuteScaleで、ExecuteNonQueryは一般的にUpdateDeleteInsert文を実行するために使用され、ExecuteDataTableはクエリ結果の少ないsqlのみを実行し、戻り値はDataTableである.
データベースではNULLと「」が異なり、NULLと0も異なります.データベース内のNULLは「わかりません」を表します.テーブルに空のフィールドNameがある場合、いくつかのインスタンスNameがNULLである場合、
select * from T_Student where Name=NULLではデータは検出されません.select * from T_Student where Name is NULLは、すべてのNameがNULLを記入したデータを調べることができます.
需要:名前が入力されていない場合はNULL、年齢が入力されていない場合はNULLとなります.
質問:SqlParameterでパラメータ値がnullの場合、パラメータの値が指定されていないことを示し、エラーが発生します.
解决方法:.NETはDBNullを提供する.Valueは、データベース内のNULLを表すために使用されます.DBNull.Valueはobjectタイプです.次のように使用する必要があります.

object objName;
string name=tbName.Text;
if(name.Length<0)
{
  objName=DBNull.Value;
}else
{
  objName=name;
}
次にSqlParameterパラメータをobjNameに変更します.
同時にデータベースを読み込むときにNullが存在する、に戻る.NETの値もDBNull.Value.したがって、読み取り後に判断して値を付与します.

if(row[“Name”]==DBNull.Value)
{
 name=null;
}
else
{
 name=(string)row[“Name”];
}
しかし、intタイプであればnullではなく、この定義の際にint?age.
0,NULLと「」を厳密に区別しなければならない.そうしないと、問題が発生して調べにくい.
前回お話ししたSqlHelperに付いている2つの関数は、上記の2つの使い方のパッケージであり、SqlParameterパラメータに直接使用することができます.
空データ入力可能データベースの場合

public static object ToDBValue(this object value)

    {
      return value == null ? DBNull.Value : value;
    }
出力時用

    public static object FromDBValue(this object dbValue)
    {
      return dbValue == DBNull.Value ? null : dbValue;
    }
これは主にSqlParameterで用いられ,空データの入出力を実現する.
以上、本稿で紹介したC#データベースへの接続方法について、ご愛用ください.