dポイントプレゼントキャンペーン実施中!

こんばんは。

標記の件で勉強しています。
string userid = textBox1.Text;
に値を入力しボタンするとDBにinsertして、その際に同じUserID(DB上の)をinsertできないようにしたいのですが、下記ソースでうまくいきません。
下記はDBのUserIDをforeachでグルグル回して、そこにtextBox1に入力した
値と同じであれば、処理を中断したいのですが、まず、「colは繰り返し変数であるため割り当てることができません」と怒られます。
しかもぐるぐる回ると思われた、foreachが1回しか回らずに内容はDBの
列名である「UserID」が代入されてしまいます。

下記ソースは重複チェックの部分のみです。

SqlDataAdapter da = new SqlDataAdapter("SELECT UserID FROM user_master", cnc);

// データをキャッシュする DataSet のインスタンスを作成する
DataSet ds = new DataSet();
// データセットにデータを読み込む
da.Fill(ds, "user_master");

foreach (DataColumn col in ds.Tables["user_master"].Columns)
{
col = userid;
}

以上宜しくお願いします。

A 回答 (2件)

実際のデータを取得するなら DataTableのRowsコレクションから取得しないといけませんよ


Columnsコレクションは DBのフィールドを返してくるように思います

DataSetのTables["user_master"]で取得したDataTableは本当に希望のデータを取得して来ているのでしょうか
DataRow row = tb.Rows[0];
if ( row["UserID"] == userid ) {
  // 重複時の処理
}
といった具合になるかと思いますよ

row["UserID"]はObject型ですので比較のためにはキャストする必要があると思いますので適宜修正してください
    • good
    • 0
この回答へのお礼

redfox63さん

おはようございます。

下記ソースでいけました。

select文をUserIDから*にしたらできました。
わざわざコードを提示してもらったにもかかわらず、それを使用できずに
すいませんでした。できなかったところなどは今後の課題としておきます。
昨日というか今日の朝まで、ADOの本を読んでみました。
細切れの知識しかなかったため、接続非接続から始まり、コネクションプールやXMLとの関係など体系的に勉強して、かなり面白かったです。
(まだまだ勉強不足ですが…)これからも宜しくお願いします(__)

SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM user_master", cnc);
DataSet ds = new DataSet();
da.Fill(ds, "user_master");
DataTable tb = ds.Tables["user_master"];
foreach (DataRow dr in tb.Rows)
{
if (userid == dr["UserID"].ToString())
{
MessageBox.Show("UserIDが重複しています");
return;
}
}

お礼日時:2008/07/02 11:07

SQL文で登録済みのUserIDが有るかを確認したほうが現実的なのでは



#フィールド名などは適宜修正してください
SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM user_master WHERE userID=" + userid.ToString(), cnc );
といった具合にしておいて

da.Fill( ds, "user_master");
if ( ds.Tables["user_master"].Rows.Count > 0 ) {
  MessageBox.Show("UserIDが重複しています");
}
といった具合で判断可能なように思います

DB側で UserIDが文字列で定義されているなら
WHERE userID='" + userid.ToString() + "'"
などの変更が必要でしょう

この回答への補足

>redfox63さん

毎回ありがとうございます。

回答のもので試してみましたが、
ds.Tables["user_master"].Rows.Count
が常に「1」となり全部処理されてしまいます。

ちょっと変更してみました

SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM user_master WHERE UserID='" + userid.ToString() + "'", cnc);

////データをキャッシュする DataSet のインスタンスを作成する
DataSet ds = new DataSet();
da.Fill(ds, "user_master");
DataTable tb = ds.Tables["user_master"];

//DataRowCollection rows = tb.Rows;
DataColumnCollection columns = tb.Columns;
for (int r = 0; r < columns.Count; r++)
{

}

@itより

これで(for文はいれてないですが)columnsが取得できるはず
なのですが、columns.Countが8となり(DBの列は8列です)
その値すら取得できません。どこかにUserID列の(2列目にあります)。
を追加してfor文で回して「=」だったら、messageboxとしたほうがいいのでしょうか?

補足日時:2008/07/01 22:06
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!