トップページ

Visual Studio 2005 ASP.NET2.0 C#

試しに見よう見真似でいじっくってみた。

ユーザー名

string username0;
string username1;
string username2;

username0 = User.Identity.Name;
username1=Request.ServerVariables["AUTH_USER"];
username2 = HttpContext.Current.User.Identity.Name.ToString();

いずれでもクライアントのユーザー IDが取得できるが、サーバーのIISの匿名アクセスを禁止にする必要がある。

サーバー名

System.Net.Dns.GetHostName()

ファイルアップロードコントロール

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {

  }
  protected void Button1_Click(object sender, EventArgs e)
  {
     if (FileUpload1.HasFile) {
     //string strSaveAs = "C:/test/" + FileUpload1.FileName;
     string strSaveAs = "//マシン名/フォルダ名/" + FileUpload1.FileName;
     FileUpload1.SaveAs(strSaveAs);
     }
  }
}
リモートマシンにも保存できるが、アクセス権がeveryone 書き込みになってないと難しい。ちなみにIIS6.0のASP.NETのプログラムアカウントのデフォルト値はNetwork Serviceです。
 

GridViewをDataBind

多くのGridViewの解説書ではプログラムを書かないでデータを表示させてますが、これはDataGridと同様にDataBindでデータを表示させるプログラムです。

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Collections;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
     GridView1.DataSource = CreateDataSource();
     GridView1.DataBind();

  }

  ICollection CreateDataSource()
  {

   stringconnStr="Server=servername;uid=username;pwd=password;database=DatabaseName";

     string sqlStr = "SELECT 番号,情報,日付 FROM テーブル";
     sqlStr = sqlStr + " WHERE 情報";

     SqlConnection conn = new SqlConnection(connStr);
     SqlCommand cmd = new SqlCommand(sqlStr, conn);

     conn.Open();
     SqlDataReader dr = cmd.ExecuteReader();

     DataTable dt = new DataTable();
     DataRow drow;

     dt.Columns.Add(new DataColumn("番号", typeof(int)));
     dt.Columns.Add(new DataColumn("情報", typeof(String)));
     dt.Columns.Add(new DataColumn("日付", typeof(DateTime)));


     while (dr.Read())
     {
        drow = dt.NewRow();
        drow[0] = dr["番号"];
        drow[1] = dr["情報"];
        drow[2] = dr["日付"];

        dt.Rows.Add(drow);
     }
     dr.Close();
     conn.Close();

     DataView dv = new DataView(dt);

     return dv;
  }

}
 

GridViewにハイパーリンク列を追加

 

GridViewはデフォルトでできるものではなく、ひとつずつSELECT文の項目を追加する。ハイパーリンクはハイパーリンク項目を追加する。通常の項目はDataBind項目である。パイーパーリンクのプロパティ設定は以下のようになる。{番号}はSELECT文の0から始まる抽出項目の順番である。列のヘッダーもプロパティで指定できる。

DataNavigeteUrlFields    :データベース項目名
DataNavigeteUrlFormatString:   (リンク先).aspx?no={0}
DataTextField :  データベース項目名
DataTextFormatString   {0}


[コーティング例]

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;


public partial class jucyu : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {

  }

  private DataTable SqlSelect()
  {

    string connStr = "Server=" + clsDb.Server+ ";";
    connStr = connStr + "uid=" + clsDb.Id + ";";
    connStr = connStr + "pwd=" + clsDb.Pass + ";";
    connStr = connStr + "database=" + clsDb.DbName;


    string sqlStr = "SELECT 項目1,項目2,項目3,項目4 FROM テーブル名";

    DataSet ds = new DataSet();
    SqlDataAdapter da = new SqlDataAdapter(sqlStr,connStr);

    da.Fill(ds, "table");

    DataTable tbl = new DataTable();
    tbl = ds.Tables["table"];
    return (tbl);

  }

  protected void Button1_Click(object sender, EventArgs e)
  {
    GridView1.DataSource = SqlSelect();
    GridView1.DataBind();
  }
}

GridViewにTemplate列を追加しEVALによる算出式を挿入

GridViewにデータベース項目以外の項目を追加する方法です。

テンプレート列の編集で追加した列のItemTemplateを選択し、LabelのDataBindingの編集をします。
カスタムバインドに

multi((int)Eval("price") , (int)Eval("unit"))

とかきます。price と unit はデータベース項目で、この列は price × unit をGridViewに表示させます。multiという関数を使っているので、プログラムにpublic でメンバー関数multiを使います。Evalはオブジェクト型なので、メンバー関数で使えるようにキャストで型変更して使ってください。

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {

  }
  public int multi (int a,int b) {
    return(a * b) ;
  }
}

ObjectDataSourceを使ったデータ検索

books DataSetを作成
booksTableAdapter ができる

以下のようなパーシャルクラスを作成する
using System;
using System.Data;
using System.Data.SqlClient;
using System.ComponentModel;

namespace booksDataSetTableAdapters
{
  // partial定義による拡張の例
  public partial class booksTableAdapter
  {

  [DataObjectMethod(DataObjectMethodType.Select)]
  public booksDataSet.booksDataTable GetDataByState2(string state)
  {
    SqlDataAdapter sqlda;
    if (state == "all")
    {
      sqlda = new SqlDataAdapter("SELECT * FROM books", this.Connection);
    }
    else
   {
     sqlda = new SqlDataAdapter("SELECT * FROM books WHERE publish LIKE '%' + @state + '%'", this.Connection);
     sqlda.SelectCommand.Parameters.AddWithValue("@state", state);
   }
   booksDataSet.booksDataTable table = new booksDataSet.booksDataTable();
   sqlda.Fill(table);
   return table;
   }
  }
}
 

これで一旦保存しObjectDataSourceにこのメソッドを登録します。@パラメータを使ったLIKE SQL文は書き方に注意したほうがいいです。

ファイルの読み書き

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
    System.IO.StreamReader sr =
    new System.IO.StreamReader(@"C:\test\title.txt",
   System.Text.Encoding.GetEncoding(932));
   //内容をすべて読み込む
   //string s = sr.ReadToEnd();
   string s = "";

   while (!sr.EndOfStream)
   {
     s += sr.ReadLine() + "<BR>";
   }


    //閉じる
    sr.Close();
    Label1.Text = s;
    s = s.Replace("<BR>", "\r\n");

    //StreamWriterの初期化
    //ファイルを上書きし、Shift JISで書き込む
    System.IO.StreamWriter sw = new System.IO.StreamWriter(@"c:\test\title2.txt", false,
    System.Text.Encoding.GetEncoding(932));
    //TextBox1.Textの内容をすべて書き込む
    sw.Write(s);
    //閉じる
    sw.Close();

  }
}

EXCELを開く

結局マイクロソフトはサーバーサイドでのASP.NETをつかったEXCELの操作を推奨していないそうです。ここの方法は使ってはいけないので注意してください。

Microsoft Office**.* Object library COMを参照追加します。

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
     Excel.Application app;
     app = new Excel.Application();
     // 表示する
    app.Visible = true;
    // ワークブックを追加する
    // Excel.Workbook workbook =
    // app.Workbooks.Add (Excel.XlWBATemplate.xlWBATWorksheet);
     Excel.Workbook workbook = app.Workbooks.Open(@"c:\test\aaa.xls",0,false, 5,
     "", "", true, Excel.XlPlatform.xlWindows, "\t", false, false,
     0, true,true,false);
     // (Excel.XlWBATemplate.xlWBATWorksheet);

     workbook.Activate();
     Excel.Sheets sheets = workbook.Sheets;
     // シートを10枚追加する
     // 一番最後に追加したシートが返却される
     Object after = sheets[sheets.Count];
     Object before = System.Reflection.Missing.Value;
     Excel.Worksheet sheet =
     (Excel.Worksheet)sheets.Add(before, after, 10,
     Excel.XlSheetType.xlWorksheet);

     // セルに値を追加
     sheet.Cells[2, 1] = "ABCDE";
      // セルを取得し、ハイパーリンクを追加する
     Excel.Range range = (Excel.Range)sheet.get_Range("B2", "B2");
     range.Hyperlinks.Add(range,
     "http://www.yahoo.co.jp", "",
    "GoldFish", "");
    sheet.Name="おまけ";

  }
}

 

Auto Incremet キーのテーブルにレコード追加 MS ACCESS

キー項目のNULLを入れることができないので、なんらかの値でしかも既存のテーブルのIDとオーバーラップしないものを入れる必要があります。ここでは -1 の インクリメント値をプログラム上で設定しますが、テーブルの設定はインクリメント値が+1なので実際にはそうなります。

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.OleDb;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {

  }
  protected void Button1_Click(object sender, EventArgs e)
  {

    OleDbConnection oConn = new OleDbConnection();
    oConn.ConnectionString
    = "PROVIDER=Microsoft.JET.OLEDB.4.0;"
    + @"DATA SOURCE=" + MdbLocation;

    string filename="aaa.xls";
    string txtComment = "Hello"

   InsertLog(filename,txtComment.Text,oConn);

   oConn.Close();

  }

   //ログテーブルに書き込む
  private void InsertLog(string filename, string comment, OleDbConnection oConn)
  {

    OleDbDataAdapter da = new OleDbDataAdapter("select * from ログ", oConn);

    DataSet ds = new DataSet();
    da.Fill(ds, "ログ");
    DataTable tbl = new DataTable();

    tbl = ds.Tables["ログ"];
    tbl.Columns["id"].AutoIncrement = true;
    tbl.Columns["id"].AutoIncrementSeed = -10;
    tbl.Columns["id"].AutoIncrementStep = -1;
    //追加の場合

    //DataRow row;
    DataRow row;
    row = tbl.NewRow();

    row["ファイル名"] = filename;
    row["コメント"] = comment;
    row["日時"] = DateTime.Now;


    OleDbCommandBuilder cb = new OleDbCommandBuilder(da);

    tbl.Rows.Add(row);

    da.Update(ds, "ログ");
  }
}

 

MultiViewコントロール

Mutltiviewコントロール上にViewコントロールを2つ置き、最初のViewコントロールにGridView、もうひとつのViewコントロールにDetailsView を置く。GridViewのユニークな項目をテンプレートフィールドに指定する。そしてこのラベルで値を渡し、DetailsViewにデータを表示させる.GridView、DetailsViewにSqlDataSourceを指定させる。ここでは、DetailsViewのSqlDataSource名はsds_dとする。

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {

  }
  protected void MultiView1_ActiveViewChanged(object sender, EventArgs e)
  {

  }
  protected void grid_SelectedIndexChanged(object sender, EventArgs e)
  {
    Label lbl = (Label)grid.SelectedRow.FindControl("Label1");
    sds_d.SelectParameters["name"].DefaultValue = lbl.Text;
    mv.ActiveViewIndex = 1;
  }
  protected void DetailsView1_PageIndexChanging(object sender, DetailsViewPageEventArgs e)
  {

  }
}

DetailsViewの画面にボタンを置き プロパティCommandName に PrevView と入力すればGridViewの画面に戻ることができる。mv.ActiveViewIndexの値は、Viewコントロールの表示画面の番号を示す

 

データの削除

DataSetで削除するためには、テーブルのプライマリーキーをプログラム中で指定する必要がある。ここでは対象レコードをFindでなくSelectで指定しているので複数レコードの削除も可能。

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.OleDb;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {

  }
  protected void Button1_Click(object sender, EventArgs e)
  {

    OleDbConnection oConn = new OleDbConnection();
    oConn.ConnectionString
    = "PROVIDER=Microsoft.JET.OLEDB.4.0;"
    + @"DATA SOURCE=" + MdbLocation;

    //削除******************************************************************
    OleDbDataAdapter da = new OleDbDataAdapter("select * from テーブル名", oConn);

    da.Fill(ds, "table");

    DataTable tbl = new DataTable();
    tbl = ds.Tables["table"];


    tbl.PrimaryKey = new DataColumn[] { tbl.Columns["番号"] };

    DataRow row;
    DataRow[] rows;
    rows = tbl.Select("番号='" + strShainBan + "'");

    foreach (DataRow rowitem in rows)
    {
      rowitem.Delete();
    }

    OleDbCommandBuilder cb = new OleDbCommandBuilder(da);

  }
}



配列の要素数

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
    string[] a = { "東京", "千葉", "埼玉", "茨城" ,"千葉", "埼玉", "茨城"};
    int b = a.Length;
  
    Label1.Text = b.ToString();


  }
}
 

文字列配列を区切り文字で配列に分解する

Splitメソッドを使い区切り文字はシングルクウォーテーションでくくる。以下の例はスペースで文字列を配列に分解するサンプル例。

 string[] txtTmp;

 txtTmp = strTmp.ToString().Split(' ');
 

文字列を含むかどうかのチェック

moji.Contains("文字列")

 

配列の宣言

配列要素を宣言したり、Splitにより分解した配列でなければ以下のように要素数を new で宣言する。 

 string[] txtTmp2;

 txtTmp2 = new string[3];
 

 

1レコードだけデータをテーブルから取得 SQL Server :SqlDataReader

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
    Label1.Text = SqlSelect(strBan
  }
< br >
  private string SqlSelect(string ban)
  {
    stringconnStr="Server=サーバー名;uid=userid;pwd=password;database=データベース名";

    string sqlStr = "SELECT * FROM テーブル名";
    sqlStr = sqlStr + " WHERE 番号 = '" + ban + "'"; 

    SqlConnection conn = new SqlConnection(connStr);
    SqlCommand cmd = new SqlCommand(sqlStr, conn);

    conn.Open();
    SqlDataReader dr = cmd.ExecuteReader();

    DataTable dt = new DataTable();

    string name = "";
    while (dr.Read())
    {
      name = dr["名前"].ToString() ;
    }
   dr.Close();
   conn.Close();

   return (name);
  }

}

1レコードだけテーブルからデータを取得 MS ACCESS DataSet

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.OleDb;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {

  }
  protected void Button1_Click(object sender, EventArgs e)
  {

    OleDbConnection oConn = new OleDbConnection();
    oConn.ConnectionString
    = "PROVIDER=Microsoft.JET.OLEDB.4.0;"
    + @"DATA SOURCE=" + MdbLocation;

    oConn.Open();
    strSelect = SelectDataSet(strBan,oConn);

    oConn.Close();

  }


  private string SelectDataSet(string ban, OleDbConnection oConn)
  {
    string sqlStr = "SELECT * FROM テーブル名";
    sqlStr = sqlStr + " WHERE 番号 = '" + ban + "'";

    DataSet ds = new DataSet();
    OleDbDataAdapter da = new OleDbDataAdapter(sqlStr, oConn);

    da.Fill(ds, "table");

    DataTable tbl = new DataTable();
    tbl = ds.Tables["table"];

    string return_value = "";

    if (tbl.Rows.Count > 0) {
      return_value = tbl.Rows[0]["項目名"].ToString();
    }

    return (return_value);

   }
}

DataSetによるデータ更新 ACCESS

これもテーブルキーをプログラム中で指定し、DataTable の Find(1件のみ) Select(複数件)を使う。Findはキーが複数の場合は キーをオブジェクト配列に入れて object[] オブジェクト配列名 = {key1,key2}、Find(オブジェクト配列名)とすること

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.OleDb;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
  // ページを初期化するユーザー コードをここに挿入します。
  string MdbLocation = Server.MapPath("DATA") + "\\" + "地名.mdb";
  //TextBox1.Text = MdbLocation;
  OleDbConnection oConn = new OleDbConnection();
  oConn.ConnectionString
  = "PROVIDER=Microsoft.JET.OLEDB.4.0;"
  + @"DATA SOURCE=" + MdbLocation;

  oConn.Open();
  //DataSet ds = new DataSet("tbl1");
  DataSet ds = new DataSet();
  OleDbDataAdapter da = new OleDbDataAdapter("select * from 地名テーブル where かな='いすみ'", oConn);
  da.Fill(ds,"地名テーブル");
  DataTable tbl = new DataTable();
  tbl = ds.Tables["地名テーブル"];

  tbl.PrimaryKey= new DataColumn[] { tbl.Columns["id"] };

  DataRow[] rows;
  rows = tbl.Select();
  //row = tbl.Rows.Find("夷隅");
  foreach (DataRow row in rows)
  {
    row["漢字"] = "沖縄";
  }

   OleDbCommandBuilder cb = new OleDbCommandBuilder(da);
   //tbl.Rows.Add(row);
   da.Update(ds, "地名テーブル"); ;
   //ds.AcceptChanges();


    oConn.Close();

    Label1.Text = "完了";


  }
}

データベース一覧 ストアードプロシージャによるSQLサーバーアクセス

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Collections;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {

   stringconnStr="Server=servername;uid=userid;pwd=password;database=master";

    SqlCommand cmd = new SqlCommand();
    cmd.CommandType = CommandType.StoredProcedure;
    SqlDataAdapter da = new SqlDataAdapter("sp_databases",connStr);

    DataSet ds = new DataSet();

    da.Fill(ds,"tbl");

    DataTable dt = new DataTable();
    dt = ds.Tables["tbl"];


    GridView1.DataSource = dt;
    GridView1.DataBind();

  }
}
 

テーブル項目一覧 ストアードプロシージャによるSQLサーバーアクセス

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Collections;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {

   stringconnStr="Server=servername;uid=userid;pwd=password;database=databasename";

    SqlCommand cmd = new SqlCommand();
    cmd.CommandType = CommandType.StoredProcedure;
    SqlDataAdapter da = new SqlDataAdapter("sp_help",connStr);

    DataSet ds = new DataSet();

    da.Fill(ds,"tbl");

    DataTable dt = new DataTable();
    dt = ds.Tables["tbl"];


    GridView1.DataSource = dt;
    GridView1.DataBind();

  }
}


 

パラメータ付ストアードプロシージャ

// sp_spaceused @updateusage = 'true'
SqlDataAdapter da = new SqlDataAdapter("sp_spaceused", connStr);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.SelectCommand.Parameters.Add("@updateusage", SqlDbType.VarChar).Value = "true";
//da.SelectCommand.CommandTimeout = 600;

da.Fill(ds);

 

ExecuteNonQueryによるクエリーの実行

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Collections;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
    SqlConnection conn;
    SqlCommand cmd;
    string SQL;

   stringconnStr="Server=servername;uid=jinji;pwd=password;database=databasename";
    conn = new SqlConnection( connStr) ;
    conn.Open( ) ;

    SQL = "Insert Into publish (name ,postnum ,address)";
    SQL = SQL + "Values ('悪徳','666','不明')";

    cmd = new SqlCommand(SQL, conn ) ;
    cmd.ExecuteNonQuery() ;

  }

}
 

バルクインサートはSQLサーバーにテキストデータを一括ロードするのに便利な機能です。タブ区切りテキストのデータベースロードは以下のようになります
 

private void LoadData(SqlConnection conn, string table, string file)
{
string Sql;

Sql = "BULK INSERT " + table + " FROM '" + file + "'";
Sql = Sql + " WITH (FIELDTERMINATOR='\t')";

SqlCommand cmd = new SqlCommand(Sql, conn);
cmd.CommandTimeout = 600;
cmd.ExecuteNonQuery();


}

static変数

クラス内でstatic変数を定義すれば、その変数を使う場合インスタンスを生成しなくて、(クラス名).(static変数名) でその変数値を参照できる。

クラス

Webサイトで項目追加すればApp_Codeの下にクラスを作ることができる

using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

/// <summary>
/// clsDb の概要の説明です
/// </summary>
public class clsDb
{
  public clsDb()
  {
  //
  // TODO: コンストラクタ ロジックをここに追加します
  //
  }

  public static string DbName = "DatabaseName";
  public static string Id = "ID";
  public static string Pass = "PASSWORD";
}

クラスの呼び出し

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
    Label1.Text = clsDb.DbName + clsDb.Id + clsDb.Pass;
  }
}

 

SMTPメール

Visual Studio2005 からは以下のようなクラスに変わった。

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Net.Mail;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {

    MailMessage message = new MailMessage();

    message.From = new MailAddress("xxxx@xxxx.co.jp");

     message.To.Add(new MailAddress("yyyy@xxxx.co.jp"));

    message.CC.Add(new MailAddress("zzzz@xxxx.co.jp"));

    message.Subject = "This is my subject";

    message.Body = "メールテスト<BR>2006年12月";

    message.IsBodyHtml = true;

    SmtpClient client = new SmtpClient("SMTPサーバー名");

    client.Send(message);

  }
}

トランザクションコミット

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
    SqlConnection sConn = new SqlConnection("Server=servername;"
    + "database=databasename;"
    + "uid=id;"
    + "pwd=password");
    sConn.Open();

    SqlCommand sCmd = sConn.CreateCommand();
    SqlTransaction sTrn = sConn.BeginTransaction();

    sCmd.Connection = sConn;
    sCmd.Transaction = sTrn;

    try
    {
      sCmd.CommandText = "UPDATE テーブル SET 番号=123 WHERE ID=1";
      sCmd.ExecuteNonQuery();
      sTrn.Commit();
      Label1.Text = "成功しました";
    }
    catch(Exception ex)
    {
      sTrn.Rollback();
       Label1.Text = ex.Message;
    }

  }
}

TextBoxのIMEをオフにする

headに以下の記述をする

<head runat="server">
<title>無題のページ</title>
<style type="text/css">
<!--
.active {ime-mode: active;}
.disabled {ime-mode: disabled;}
-->
</style>

</head>

TextBoxのプロパティCssClassをdisabledにする

 

チェックボックスコントロール

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)

  if (!IsPostBack)
  {
    CheckBox1.Checked = false;
  }
    TextBox1.Text = "Hello";

  }

  protected void Button1_Click(object sender, EventArgs e)
  {
    if (CheckBox1.Checked)
    {
      TextBox1.Text = "Yes";
    }
    else
    {
      TextBox1.Text = "No";

     }

   }
}

ラベルにリンクを入れる方法

Label.Text = "リンク<a href='http://www.yahoo.co.jp'>yahoo</a>";

 

 日付型Evalデータ項目から時刻を取り除き日付のみを表示する
 

public static string ShortDate(object datetime)
{
  string strDate = datetime.ToString();

  if (strDate.Trim() != "")
  {
    try
    {
      strDate = DateTime.Parse(strDate).ToShortDateString();

    }
    catch
    {
      strDate = "";

    }
  }

return (strDate);
}


 

拡張子付を取得する

int ExtPos;
string Ext;

ExtPos = file.LastIndexOf(".");
Ext = file.Substring(ExtPos);


日付型でなければエラーを検出する


public static bool DateError(string strDate)
{
  bool error = false;

  try
  {
    DateTime.Parse(strDate);
  }
  catch
  {
    error = true;

  }
  return (error);
}

 

ドロップダウンリスト表示メソッド

テーブルの値をドロップダウンリストにできるメソッド。コーティングしなくてもできるが、コードを一発書いてしまえば、後は自由に使えます。


public static void DropDownBind(DropDownList ddl,string Table, string Field)
{

  string connStr = "Server=" + clsDb.Server + ";";
  connStr = connStr + "uid=" + clsDb.Id + ";";
  connStr = connStr + "pwd=" + clsDb.Pass + ";";
  connStr = connStr + "database=" + clsDb.DbName;

  SqlConnection myConn = new SqlConnection(connStr);
  SqlCommand myCmd = new SqlCommand("SELECT " + Field + " FROM " + Table, myConn);
  myConn.Open();
  SqlDataReader myReader = myCmd.ExecuteReader();

  //Set up the data binding.
  ddl.DataSource = myReader;
  ddl.DataTextField = Field;
  ddl.DataValueField = Field;
  ddl.DataBind();

  //Close the connection.
  myConn.Close();
  myReader.Close();

  //Add the item at the first position.
  ddl.Items.Insert(0, "");

}





カウンターテーブルから採番

トランザクションコミットでやろう始めたのですが、どうしてもカウンターテーブルの読み込みができないのでデータセットを使ってやりました。あまり自身がないです。コミットや楽観的ロックに詳しいかたはアドバイスください。


private static long GetNumber(int Index)
{
  long Number = -1;
  long Counter;
  string connStr = "Server=" + clsDb.Server + ";";


  connStr = connStr + "uid=" + clsDb.Id + ";";
  connStr = connStr + "pwd=" + clsDb.Pass + ";";
  connStr = connStr + "database=" + clsDb.DbName;
  string selectStr = "SELECT * FROM カウンター";

  // 接続用オブジェクトの作成
  SqlConnection conn = new SqlConnection();
  conn.ConnectionString = connStr;

  // select用コマンド・オブジェクトの作成
  SqlCommand selectCmd = new SqlCommand();
  selectCmd.Connection = conn;
  selectCmd.CommandText = selectStr;

  // データアダプタの作成
  SqlDataAdapter da = new SqlDataAdapter();
   da.SelectCommand = selectCmd;

  // データセットへの読み込み
  DataSet ds = new DataSet();
  da.Fill(ds, "tbl");

  DataTable dt = ds.Tables["tbl"];

  // 主キーの設定
  dt.PrimaryKey = new DataColumn[] { dt.Columns["インデックス"] };

  // データの更新
  DataRow targetRow;

  targetRow = dt.Rows.Find(Index);

  Counter = Convert.ToInt32(targetRow["カウンター"]);
  targetRow["カウンター"] = Counter + 1;

  Number = Counter + 1;

  // コマンド自動作成
  SqlCommandBuilder cb = new SqlCommandBuilder(da);

  try
  {
    // データベースの更新
    da.Update(ds, "tbl");

   }
    catch (Exception ex)
   {

  if (ex.Message != null)
  {
    Number = -1;
  }

 }

conn.Close();
return (Number);

}

 

Request.QueryStringのパラメータがあるかないかの判定

if (Request.QueryString{"パラメータ名"] == null) {

} else {

}

 

テーブルの文字フォントを変える方法

<style type="text/css">
<!--
td{
font-size:13px;
}
-->
</style>

 

テーブルの大きさを変える方法

デザイン画面の下に<table>というのがあるのでそれクリックし、テーブルの枠をドラッグすればテーブルの大きさが変わります。プロパティ画面のStyleでテーブルの構成を設定できます。テーブル内をクリックして<td><tr>も画面の下に出てくるのでStyleプロパティを設定できます。

うまくレイアウトする方法はテーブルをうまく利用することですが、けっこうやってみると設定が厄介で、Visual Studioが落ちたりすることもありますので、頻繁に保存したほうがいいです。テーブルはソースを直接編集する手も有効です。

 

Request.QueryStringで日本語を使った場合の文字化けを防止する方法

ASP.NET ではデフォルトでUTF-8 という規格なのでこれを SHIFT-JISに直す必要があるそうです。WebConfigファイルのsystem.web内に以下のglobalization の記述を追加してください。

<globalization responseEncoding="shift-jis"
              requestEncoding="shift-jis"/>

</system.web>

 

ActiveDirectoryの情報を取得する

まず、参照設定で.NETタブのSystem.DirectoryServicesを追加する。
LDAP://ドメインサーバー名/OU=第2階層,OU=第一階層,dc=A,dc=B,dc= C では、OUはAcriveDirectoryの下の階層から指定する。dcはActiveDirectoyのドメイン名がXXX@A.B.Cならばdc=A,dc=B,dc=C のように指定する。
drSearch.Sort.Direction = System.DirectoryServices.SortDirection.Ascending; の昇順並べ替えは機能しなかった。

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.DirectoryServices;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
    DisplayAD();
  }


  private void DisplayAD()
  {

    // ActiveDirectoryに接続する

   stringstrPath=@"LDAP://ドメインサーバー名/OU=第2階層,OU=第一階層,dc=A,dc=B,dc=C";
    string strUser = @"ドメイン名\Administrator";
    string strPass = @"パスワード";
    DirectoryEntry drEntry =
    new DirectoryEntry(strPath,
    strUser, strPass);

    try
    {
      // ADSI オブジェクトを取得する
      Object obj = drEntry.NativeObject;
      // LDAP検索オブジェクトを作成
      DirectorySearcher drSearch =
     new DirectorySearcher(drEntry);

     // アカウントフィルターを設定
     drSearch.Filter = "(SAMAccountName=*)";
     //昇順並べ替え
     drSearch.Sort.Direction = System.DirectoryServices.SortDirection.Ascending;


     // Common Name(cn)プロパティを同時に
      // 取得するように設定
      drSearch.PropertiesToLoad.Add("cn");
      // 検索する
      SearchResultCollection scn =
            drSearch.FindAll();


      if (scn == null)
      {
        Response.Write("対象ユーザーがいません。");
        return;
      }


      foreach (SearchResult sResult in scn)
      {
        Response.Write(
       (string)sResult.Properties["cn"][0]);
        Response.Write("<BR>");
      }

      Response.Write("完了");

   }
   catch (Exception ex)
   {
      Response.Write("エラー:"); 
      Response.Write(ex.Message);
    }
  }
}
 

JavaScriptを使ってポップアップ画面を出す

親画面 Default.asp

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {

    //TextBox1.Text = Session["name"].ToString();
    Button1.Attributes["onclick"] = "javascript:returnwindow.open('Default2.aspx','','width=250,height=250')";

  }
  protected void Button1_Click(object sender, EventArgs e)
  {

  }
}

子画面 Default2.aspx

window.opener.form1.TextBox1.value は親画面Default.aspxのHTMLソース画面のformタグのidがform1でTextBox名がTextBox1なのでこのようになります。これにより、ボタンをクリックすると、子画面が閉じ、Hello! が親画面のテキストボックスに表示されます。\n については必要かどうか不明です。ブラウザの種類によって影響するのでしょうか?

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class Default2 : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {

  }
  protected void Button1_Click(object sender, EventArgs e)
  {

    string id = Request.Params["id"];

    string st = "<SCRIPT LANGUAGE='javascript'>";
    st += "window.opener.form1.TextBox1.value = '" + "Hello!" + "';\n";
    st += "window.close();\n";
    st += "</SCRIPT>";

    Response.Write(st);


  }

}

Active Directory情報の取得

Active Directoryの情報を取得し、グループのメンバー一覧を表示するプログラムです。LDAPのOUやDCの設定はドメインコントローラでファイル名を指定して実行 adsiedit.msc を起動して、ADの階層を参照すればわかります。また、Properties["member"]をProperties["memberOF"]に変更すると所属するグループが表示されるように変わります。

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.DirectoryServices;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
    int i;
    DirectoryEntry de=newDirectoryEntry("LDAP://OU=xxx,DC=xxx,DC=xxx,DC=xxx","アカウント","パスワード",    
    System.DirectoryServices.AuthenticationTypes.ServerBind);
    DirectorySearcher directorySearcher = new DirectorySearcher(de);
    directorySearcher.Filter = "(SAMAccountName=" + "*検索キーワード*" + ")";
    //SearchResult searchResult = null;

    SearchResultCollection searchResult = directorySearcher.FindAll();


    foreach (SearchResult child in searchResult)
    {
      Response.Write("<br>" + child.Properties["cn"][0]);
      for (i = 0; i < child.Properties["member"].Count; i++)
      Response.Write("<br>" + child.Properties["member"][i]);
    }

  }
}

動的に作成したテキストボックスからの値の取得と設定

 protected void Page_Init(object sender, EventArgs e)
{
   TableRow newRow = new TableRow();
   TableCell newCell = new TableCell();

   TextBox newText = new TextBox();

   Table1.Rows.Clear();


   newText.ID = "Text999";
   newText.Style["text-align"] = "center";
   newText.Width = 40;
   newCell.Controls.Add(newText);
   newRow.Cells.Add(newCell);

   Table1.Rows.Add(newRow);
   newText.Text = "Hello";
}

protected void Button1_Click(object sender, EventArgs e)
{
   TextBox tb = (TextBox)Table1.FindControl("Text999");

   tb.Text = "good by";

}
protected void Button2_Click(object sender, EventArgs e)
{
   TextBox tb = (TextBox)Table1.FindControl("Text999");

   Label1.Text = tb.Text;

}

データテーブルの作成

DataTable tbl = new DataTable();
tbl.Columns.Add("項目1", Type.GetType("System.String"));
tbl.Columns.Add("項目2", Type.GetType("System.String"));

tbl.Rows.Add(値1, 値2);

 

チャートコントロール VS2010

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Web.UI.DataVisualization.Charting;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing;


public partial class _Default : System.Web.UI.Page
{
  DataTable dt = new DataTable();

  protected void Page_Load(object sender, EventArgs e)
  {
    // 初期表示ダミーデータをデータテーブルに設定
    Random rnd = new Random();

    dt.Columns.Add("X軸",Type.GetType("System.String"));
    dt.Columns.Add("値",Type.GetType("System.String"));

    for (int i = 0; i < 8; i++)
    {
      dt.Rows.Add("P" + i, (rnd.NextDouble() * 100).ToString());
    }


    chart1.BackColor = System.Drawing.Color.Aquamarine;

    ChartArea ChartArea1 = new ChartArea();
    //チャートエリア内の線を点線にする
    ChartArea1.AxisX.MajorGrid.LineColor = Color.Aqua;
    ChartArea1.AxisX.MajorGrid.LineDashStyle = ChartDashStyle.Dash;
    ChartArea1.AxisY.MajorGrid.LineColor = Color.Aqua;
    ChartArea1.AxisY.MajorGrid.LineDashStyle = ChartDashStyle.Dash;


    chart1.ChartAreas.Add(ChartArea1);

    //X軸ラベルの文字を縦方向にする
    chart1.ChartAreas["ChartArea1"].AxisX.LabelStyle.Angle = -90;


    Series series = new Series();
    series.ChartType = SeriesChartType.Column;
   //series.BorderWidth = 5;
    //折れ線グラフ
    //series.ChartType = SeriesChartType.Line;
    //series.BorderWidth = 5;
    //棒グラフ
    series["DrawingStyle"] = "Cylinder";
    series["PointWidth"] = "1"; //棒の太さ
    //数値を表示させる
    series.Label = "#VALY{##.##}";

    for (int i = 0; i < dt.Rows.Count; i++)
    {
      DataPoint point = series.Points.Add(Convert.ToDouble(dt.Rows[i][1]));
      point.AxisLabel = dt.Rows[i][0].ToString();

    //3番目の棒を赤にする
    if (i == 3)
    {
      point.Color = System.Drawing.Color.Red;
    }
  }
   chart1.Series.Add(series);

   dataGridView1.DataSource = dt;
   dataGridView1.DataBind();

 }

}

本番環境で実行すると、c:\TempImageFiles が存在しないというエラーが出るので、何らかの対策が必要、このフォルダはWeb.config に指定されているので、それを変更してもよい。このフォルダにNetwork Service のアクセス権は必要。

 

GridViewからエクセル出力

protected void btnExcel_Click(object sender, EventArgs e)
{
  string fileName = "output";
  Response.Clear();
  Response.ContentEncoding = System.Text.Encoding.GetEncoding("shift-jis");
  Response.AddHeader("content-disposition", string.Format("attachment;filename={0}.xls", fileName));
  Response.Charset = "";
  Response.ContentType = "application/vnd.xls";

  StringWriter stringWrite = new StringWriter();
  HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
  htmlWrite.Write("<meta http-equiv='Content-Type' content='text/html; charset=sjis'>");
  GridView1.RenderControl(htmlWrite);

  Response.Write(stringWrite.ToString());
  Response.End();
}
public override void VerifyRenderingInServerForm(Control control)
{
}
 

開発環境PCから本番WEBサーバーにリリース

開発環境のPCのWebSiteフォルダ(.aspx や App_Codeがあるフォルダ)を本番機にコピーし、本番機のIISでコピーされたフォルダを仮想ディレクトリに設定します。IIS6.0では.NET1.* のアプリケーションと別のアプリケーションプールで.NET2.0アプリケーションを設定する必要があるそうです。既存のWEBサイトのプロパティのASP.NETのWeb.Configの存在場所に、Web.Config があるかないかにかかわらず、この存在場所にeveryone のアクセス権があれば問題ないのですが、その他の場合は、NETWORK SERVICE のようなASPプログラムIDのアクセス権が必要です。

IIS5.0では以下の記事を参考にして、アプリケーションがどのバージョンの.NETで動作するか指定してください。エラーが起こったら.NET のバージョンが正しいかどうか確認してください。

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpguide/html/cpconmanagingmultipleversionsofaspnet.asp

 

Windowsアプリケーション

FORM の表示直後に処理を実行させたい

FORMのShownイベントを使う(プロパティのいなずまマークをクリックしてそのイベントを選択)

     private void Form1_Shown(object sender, EventArgs e)

の関数がプログラム中に表示されるのでその中に処理を記述する

 

FORMを閉じる

  this.Close();

 

プログラムを終了させる

Environment.Exit(0);

 

メッセージボックス

MessageBox.Show("メッセージ");

 

string型からDateTime型への変換 Convert.ToDate

DateTime.Parse(string) という方法でもできることを後で知りました。

DateTime dateFileDate;

dateFileDate = Convert.ToDateTime(FileDate);

 

設定ファイル

実行ファイルと同じフォルダに配置する設定ファイルはデバック字はプログラムフォルダの下のbinの下のDebugに配置して開発検証を行う。プログラムの配布をするには設定ファイルをソリューションエクスプローラでプログラムにファイルの追加を行い、プログラムフォルダの下にその設定ファイルを配置すると、その設定ファイルまで含めて配布ができるようになる。

 

コンソールアプリケーション

WMIでイベントログを取得

using System;
using System.Collections.Generic;
using System.Text;
using System.Management;

namespace WMI1
{
  class Program
  {
    static void Main(string[] args)
  {
    Wmi();
  }

  static void Wmi()
  {
    ConnectionOptions option = new ConnectionOptions();
    option.Username = "ドメイン名\\Administrator";
    option.Password = "パスワード";
    ManagementScope scope = new ManagementScope("\\\\サーバー名\\root\\cimv2", option);
    string s ;
    ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_NTLogEvent WHERE TimeGenerated > '2007/09/11'");
    ManagementObjectSearcher query1 = new ManagementObjectSearcher(scope,query);
    ManagementObjectCollection queryCollection1 = query1.Get();
    foreach (ManagementObject mo in queryCollection1)
    {

      s = mo["TimeWritten"].ToString();
      s += " " + mo["TimeGenerated"].ToString();
      s += " " + mo["Category"].ToString();
      s += " " + mo["EventCode"].ToString();
      s += " " + mo["Message"].ToString();
      s += mo["Type"].ToString();
      Console.WriteLine(s);

     }
   }
  }
}

WMIでリモートサーバーのディスク容量を取得

DeviceIDをCドライブと指定しています:

using System;
using System.Collections.Generic;
using System.Text;
using System.Management;

namespace WMI_DISK
{
  class Program
  {
    static void Main(string[] args)
    {
      ConnectionOptions option = new ConnectionOptions();
      option.Username = "アカウント";
      option.Password = "パスワード";
      ManagementScope scope = new ManagementScope("\\\\サーバー名\\root\\cimv2", option);
      string s;
      ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_LogicalDisk where DriveType=3 and DeviceID='C:'");
      ManagementObjectSearcher query1 = new ManagementObjectSearcher(scope, query);
      ManagementObjectCollection queryCollection1 = query1.Get();

     foreach (ManagementObject mo in queryCollection1)
     {

        ulong ts = (ulong)mo.Properties["Size"].Value;
        ulong fs = (ulong)mo.Properties["FreeSpace"].Value;

        Console.WriteLine("ドライブの容量は{0}バイトです。",ts);
        Console.WriteLine("ドライブの空き容量は{0}バイトです。", fs);

      }
     }
   }
}

フォルダー直下のファイルとフォルダーの一覧

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace FileSample1
{
  class Program
  {
    static void Main(string[] args)
    {
      //対象パス
      string path = "c:\\tmp";

      GetFile(path);
     GetFolder(path);
    }
    // ファイル一覧
    static void GetFile(string path)
    {
      DirectoryInfo dir = new DirectoryInfo(path);
      foreach (FileInfo f in dir.GetFiles())
      {
        string name = f.Name;
        DateTime t = f.CreationTime;
        Console.Write("{0},{1},\n",name, t.ToString("hh:mm:ss"));
      }
}
 //フォルダー一覧
 static void GetFolder(string path)
  {
   foreach (string f in Directory.GetDirectories(path))
    {
      string name = f;
      Console.Write("{0}\n", name);
    }
   }
  }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

inserted by FC2 system