C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: C#でWMIを取得し、DBに格納したい。


(過去ログ 95 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■56500 / inTopicNo.1)  C#でWMIを取得し、DBに格納したい。
  
□投稿者/ 杜若 桔梗 (1回)-(2011/01/17(Mon) 12:44:59)

分類:[C#] 

めちゃくちゃお久しぶりです。杜若桔梗です。
表記の通り、C#でWMI情報を取得し、取得結果をDBにまとめたいと考えています。
それぞれ、格納部分とWMI取得部分はうまくいったのですが、一つのプログラムにまとめる際にローカル変数とグローバル変数なんぞで引っかかってしまいました。
そこで、相談ですが、foreach関数で取得した変数を{}の外で使う方法はないでしょうか・・・・?
以下、ソースコードを貼り付けします。

DBはDB2 9.7 Express-CでVisual Studio 2005 Professionalです。

--ここから--
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Management;
using IBM.Data.DB2;

namespace UserRegist
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //ユーザー登録のための変数宣言
            string familyname = textBox1.Text; //姓
            string givenname = textBox2.Text; //名
            string mailaddress = textBox3.Text; //メールアドレス
            //PC情報収集のための変数宣言
            string SerialNumber; //製造番号
            string Vender; //製造会社
            string Mtype; //モデル
            //製造番号取得用ルーチン
            ManagementClass bios = new ManagementClass("Win32_BIOS");
            ManagementObjectCollection objsetbios = bios.GetInstances();
            foreach (ManagementObject objbios in objsetbios)
                SerialNumber = objbios["SerialNumber"].ToString();
            
            //PC情報収集ルーチン
            ManagementClass pcinfo = new ManagementClass("Win32_ComputerSystem");
            ManagementObjectCollection objsetpcinfo = pcinfo.GetInstances();
            foreach (ManagementObject objpcinfo in objsetpcinfo)
            {
                Vender = objpcinfo["Vender"].ToString();
                Mtype = objpcinfo["Type"].ToString();
            }    
            //----ここまで情報取得系----
            //Database接続
            DB2ConnectionStringBuilder conn = new DB2ConnectionStringBuilder();
            conn.Server = "xxxxxx";
            conn.UserID = "UserID";
            conn.Password = "Password";
            conn.Database = "Database";
            DB2Connection con = new DB2Connection(conn.ConnectionString);
            DB2Command Number1 = con.CreateCommand();
            DB2Command Number2 = con.CreateCommand();
            //ユーザー登録関係
            Number1.CommandText = "select num count from usertable";
            Number2.CommandText = "select num from usertable where mailaddress = '" + mailaddress + "';";
            con.Open();
            DB2DataReader reader2 = Number2.ExecuteReader();
            int num2 = reader2.GetInt32(0);
            //すでに登録済みメールアドレスは登録しない
            if (reader2 == null)
            {
                DB2DataReader reader1 = Number1.ExecuteReader();
                int num1 = reader1.GetInt32(0);
                num1++;
                DB2Command userdata = con.CreateCommand();
                userdata.CommandText = "insert into usertable(num,familyname,givenname,mailaddress) values('" + num1 + "','" + familyname + "','" + givenname + "','" + mailaddress + "');";
                userdata.ExecuteNonQuery();
            }
            //ここからマシン情報登録ルーチン
            //UserNumとSerialが同じだったら同一人物の同一PCと判定
            DB2Command judge1 = con.CreateCommand();
            DB2Command judge2 = con.CreateCommand();
            judge1.CommandText = "select userno from pcreglist where serialno = '" + SerialNumber + "';";
            judge2.CommandText = "select count userno from pcreglist";
            DB2DataReader readerJudge1 = judge1.ExecuteReader();
            DB2DataReader readerCount = judge2.ExecuteReader();
            int userno = readerJudge1.GetInt32(0);
            if (readerJudge1 == null)
            {
                int count = readerCount.GetInt32(0);
                count++;
                DB2Command pcinfo1 = con.CreateCommand();
                pcinfo1.CommandText = "insert into pcreglist(num,Vender,serialno,userno,mtype) values ('" + count + "','" + Vender + "','" + SerialNumber + "','" + userno + "','" + Mtype + "');";
                pcinfo1.ExecuteNonQuery();
            }
            if(userno == num2)
            {
                MessageBox.Show("登録済みです");
            }
            if (userno != num2 && readerJudge1 != null)
            {
                DB2Command pcinfo1 = con.CreateCommand();
                pcinfo1.CommandText = "update pcreglist set userno = '" + userno + "' where serialno = '" + SerialNumber + "';";
                pcinfo1.ExecuteNonQuery();
            }
            MessageBox.Show("登録が終了しました。");
            
        }
    }
}

--ここまで--

お手数をおかけしますがよろしくお願いします。

引用返信 編集キー/
■56501 / inTopicNo.2)  Re[1]: C#でWMIを取得し、DBに格納したい。
□投稿者/ マサヤ (215回)-(2011/01/17(Mon) 13:06:30)
2011/01/17(Mon) 13:17:13 編集(投稿者)
2011/01/17(Mon) 13:15:28 編集(投稿者)

>foreach関数で取得した変数を{}の外で使う方法はないでしょうか・・・・?
配列に格納して下さい。
ArrayListとかListとか。

Listの例とか書いたのですが、スパム扱いになってしまいます。。。

わかりにくくなってしまいますが。
格納用のクラスを用意して
IList<格納用クラス> list = new List<格納用クラス>();
格納用クラス test = new test(引数1,引数2);
list.Add(test);
リストに登録してあげる。
引用返信 編集キー/
■56502 / inTopicNo.3)  Re[2]: C#でWMIを取得し、DBに格納したい。
□投稿者/ PATIO (78回)-(2011/01/17(Mon) 14:29:23)
2011/01/17(Mon) 14:30:30 編集(投稿者)

既に溜めておいてDBに書き込むという方法は提示されているので
他のパターンを。

今はデータの取得とDBへの書き込みを別々に考えていますが、
そもそもそれって別々に考えなくてはいけない事?
と考えてみます。

目的は、データを取得してDBに書きこむ事ですから
これをデータの個数分だけ繰り返せば良いという発想もできます。
繰り返し回数はデータの個数分で一つ取り出してはDBに書き込む
と言う処理を一つの流れとして考えてみてはいかがでしょう。

この方法だとデータ取得部分とDB書き込み部分が融合してしまいますので
別々のルーチンとして独立させておきたい場合は問題になりますが、
そうでは無いのであれば、上記のような考え方も有りなのではないでしょうか。

ちなみにループが一つになるので繰り返し回数はこちらの方が少なくなります。

引用返信 編集キー/
■56505 / inTopicNo.4)  Re[3]: C#でWMIを取得し、DBに格納したい。
□投稿者/ 杜若 桔梗 (3回)-(2011/01/17(Mon) 16:16:45)
マサヤさん PAITOさん

回答どうもありがとうございます。
少し悩みましたがマサヤさんの教えていただいた方式で何とかできました。

今はまた別な帰ってきた値がNULLの時の処理ではまっていますが・・・

ともかく、ありがとうございました。
引用返信 編集キー/
■56506 / inTopicNo.5)  Re[4]: C#でWMIを取得し、DBに格納したい。
□投稿者/ マサヤ (218回)-(2011/01/17(Mon) 16:29:46)
>Vender = objpcinfo["Vender"].ToString();
>Mtype = objpcinfo["Type"].ToString();
このあたりがNullの場合ですか?

if(objpcinfo["Vender"] == null)
で判断したらいいかと。
もしくは三項演算子で
http://tech.bbtune.com/csharp/items/3-4.html
引用返信 編集キー/
■56507 / inTopicNo.6)  Re[5]: C#でWMIを取得し、DBに格納したい。
□投稿者/ 杜若 桔梗 (4回)-(2011/01/17(Mon) 16:42:35)
マサヤさん

ありがとうございます。
WMI取得部分については心配はしていないのですが、ユーザー登録済みか否か、二重登録していないかの判別のところではまっています。
以下、ソースコードになります。

--ここから--
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Management;
using IBM.Data.DB2;

namespace UserRegist
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
//[U[o^
string familyname = textBox1.Text; //
string givenname = textBox2.Text;@//
string mailaddress = textBox3.Text;@//[AhX
//PCW
string SerialNumber;@//
string Vender;@//
string Mtype;@//f
List<string> pcinfolist = new List<string>();

//p[`
ManagementClass bios = new ManagementClass("Win32_BIOS");
ManagementObjectCollection objsetbios = bios.GetInstances();
foreach (ManagementObject objbios in objsetbios)
{
SerialNumber = objbios["SerialNumber"].ToString();
pcinfolist.Add("SerialNumber");
}

//PCW[`
ManagementClass pcinfo = new ManagementClass("Win32_ComputerSystem");
ManagementObjectCollection objsetpcinfo = pcinfo.GetInstances();
foreach (ManagementObject objpcinfo in objsetpcinfo)
{
Vender = objpcinfo["Manufacturer"].ToString();
Mtype = objpcinfo["Model"].ToString();
pcinfolist.Add("Vender");
pcinfolist.Add("Mtype");
}
//----n----
//Database
DB2ConnectionStringBuilder conn = new DB2ConnectionStringBuilder();
conn.Server = "localhost";
conn.UserID = "Akiha_Tohno";
conn.Password = "mn3154812";
conn.Database = "PCREGIST";
DB2Connection con = new DB2Connection(conn.ConnectionString);
DB2Command Number1 = con.CreateCommand();
DB2Command Number2 = con.CreateCommand();
//ListWJ
foreach (string pcinfolist1 in pcinfolist)
{
//[U[o^W
Number1.CommandText = "select num count from usertable";
Number2.CommandText = "select num from usertable where mailaddress = '" + mailaddress + "';";
con.Open();
DB2DataReader reader2 = Number2.ExecuteReader();
//int num2;
//int num2 = reader2.GetInt32(0);
//o^[AhXo^
if (reader2 == null)
{
DB2DataReader reader1 = Number1.ExecuteReader();
int num1 = reader1.GetInt32(0);
num1++;
DB2Command userdata = con.CreateCommand();
userdata.CommandText = "insert into usertable(num,familyname,givenname,mailaddress) values('" + num1 + "','" + familyname + "','" + givenname + "','" + mailaddress + "');";
userdata.ExecuteNonQuery();
}

//}Vo^[`
//UserNumSeriallPC
DB2Command judge1 = con.CreateCommand();
DB2Command judge2 = con.CreateCommand();
judge1.CommandText = "select userno from pcreglist where serialno = '" + pcinfolist1[0] + "';";
judge2.CommandText = "select count userno from pcreglist";
DB2DataReader readerJudge1 = judge1.ExecuteReader();
DB2DataReader readerCount = judge2.ExecuteReader();
//int userno = readerJudge1.GetInt32(0);
if (readerJudge1 == null)
{
int count = readerCount.GetInt32(0);
count++;
DB2Command pcinfo1 = con.CreateCommand();
pcinfo1.CommandText = "insert into pcreglist(num,Vender,serialno,userno,mtype) values ('" + count + "','" + pcinfolist1[1] + "','" + pcinfolist1[0] + "','" + readerJudge1.GetInt32(0) + "','" + pcinfolist1[2] + "');";
pcinfo1.ExecuteNonQuery();
}
if (!readerJudge1.IsDBNull(0) && !reader2.IsDBNull(0)) //<==ここの判別
{
if (readerJudge1.GetInt32(0) == reader2.GetInt32(0))
{
MessageBox.Show("登録済みです");
}

if (readerJudge1.GetInt32(0) != reader2.GetInt32(0))
{
DB2Command pcinfo1 = con.CreateCommand();
pcinfo1.CommandText = "update pcreglist set userno = '" + readerJudge1.GetInt32(0) + "' where serialno = '" + pcinfolist1[0] + "';";
pcinfo1.ExecuteNonQuery();
}
MessageBox.Show("登録しました");

}
}
}
}
}

--ここまで--

何かいい手段ないですかねえ・・・
引用返信 編集キー/
■56509 / inTopicNo.7)  Re[6]: C#でWMIを取得し、DBに格納したい。
□投稿者/ 杜若 桔梗 (5回)-(2011/01/17(Mon) 16:58:37)
杜若 桔梗です。
とりあえず、HasRowで逃げることにしましたが、ほかに何かいい手段ないですかね?
引用返信 編集キー/
■56510 / inTopicNo.8)  Re[6]: C#でWMIを取得し、DBに格納したい。
□投稿者/ マサヤ (219回)-(2011/01/17(Mon) 17:02:12)
>judge2.CommandText = "select count userno from pcreglist";
をクエリした結果
>int count = readerCount.GetInt32(0);
とってますよね?

同じく
judge3.CommandText = "select count userno from pcreglist where serialno = '" + pcinfolist1[0] + "';"
でカウントを採ればいいのでは?

注)SQLのパラメータにシングルクォテーションを使うのはキケンですよ?
SQLParameterを使用して下さい。
http://www.atmarkit.co.jp/fdotnet/basics/adonet05/adonet05_02.html

引用返信 編集キー/
■56513 / inTopicNo.9)  Re[7]: C#でWMIを取得し、DBに格納したい。
□投稿者/ 杜若 桔梗 (6回)-(2011/01/17(Mon) 19:00:50)
マサヤさん

いろいろありがとうございます。
SQLパラメーターについてはわかっていて、リリース時には直す予定です。

だいぶコードもごちゃごちゃになってきたので書き直す予定です。
引用返信 編集キー/
■56549 / inTopicNo.10)  Re[8]: C#でWMIを取得し、DBに格納したい。
□投稿者/ 杜若 桔梗 (7回)-(2011/01/18(Tue) 18:53:12)
マサヤさん

いろいろありがとうございました。
おかげで何とかなりそうです。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -