• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C# vs2005 sqlserver2005 USERID列重複禁止 windows appli)

C# vs2005 sqlserver2005 USERID列重複禁止 windows appli

このQ&Aのポイント
  • C#のWindowsアプリケーションで、sqlserver2005のUSERID列に重複が禁止されるようにしたい
  • DBにinsertする際に、既存のUserIDと重複しないようにする方法を検討しています
  • 現在のコードでは、foreachでDBのUserIDを回しているが、1回しか回らず、列名が代入されてしまうという問題が発生している

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

実際のデータを取得するなら DataTableのRowsコレクションから取得しないといけませんよ Columnsコレクションは DBのフィールドを返してくるように思います DataSetのTables["user_master"]で取得したDataTableは本当に希望のデータを取得して来ているのでしょうか DataRow row = tb.Rows[0]; if ( row["UserID"] == userid ) {   // 重複時の処理 } といった具合になるかと思いますよ row["UserID"]はObject型ですので比較のためにはキャストする必要があると思いますので適宜修正してください

t_kanegon
質問者

お礼

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; } }

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

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() + "'" などの変更が必要でしょう

t_kanegon
質問者

補足

>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としたほうがいいのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • データベースから情報の取得・更新・削除 visual studio2005 sqlserver2005 c# (3)

    こんにちは、カネゴンです。 標記の件で再度質問させていただきます。 データグリッドへの新レコードの追加です。 下記ソースで、まず「daをfillできません」となります。 パラメータあたりがおかしいのはわかっていますが、どのように直したらいいのやらわかりません。 次にこのページは、登録画面をnewして、別画面で表示しているのですが もちろんデータグリッドは別ページにあるため、「datagird1がありません」となります。 皆さんのお力をおかしください(__) 以上よろしくお願いします。 string StrConn = @" server = ***\SQL2005 ; " + " database =ser_master ; " + " uid = sa ; " + " pwd = *** ; "; SqlConnection cnc = new SqlConnection(StrConn); cnc.Open(); SqlCommand cmd = new SqlCommand("INSERT INTO [user_master]" + " ( UserID ,UserName , Password , Age , Salary , Sex ) VALUES " + " ( @userid , @username, @password, @age, @salary, @sex ", cnc); cmd.Parameters.AddWithValue("@userid", SqlDbType.VarChar); cmd.Parameters.AddWithValue("@username", SqlDbType.VarChar); cmd.Parameters.AddWithValue("@password", SqlDbType.VarChar); cmd.Parameters.AddWithValue("@age", SqlDbType.Int); cmd.Parameters.AddWithValue("@salary", SqlDbType.Int); cmd.Parameters.AddWithValue("@sex", SqlDbType.VarChar); SqlDataAdapter da = new SqlDataAdapter(); da.SelectCommand = cmd; DataSet ds = new DataSet(); da.Fill(ds, "user_master"); cnc.Close(); dataGridView1.DataSource = ds.Tables["user_master"];  

  • データベースから情報の取得・更新・削除 SQL2005 C# 2

    おはようございます。カネゴです。 表記の件で再度質問させていただきいます。 まずは情報取得。 これは、検索・抽出といったほうがいいのでしょうか。ID PASSを テキストボックスに入力し検索ボタンを押下すると、データベースから 検索結果に、マッチしたレコードがデータグリッドに表示されると いうものです。 sqlconnection sqlcomand. などを使用し sqldataadaptedのfill メソッドで表示させればいいのでしょが、なかなかうまくいきません… 更新削除も同様に、ado.netで行いたいのですが、なかなかうまくいきません。 「検索」btn押下後のイベントです。 SqlConnection cn = new SqlConnection(@" server = ***\SQL2005 ; " + " database = user_master ; " + " uid = sa ; " + " pwd = *** ; "); cn.Open(); SqlCommand cmd = new SqlCommand("SELECT * FROM user_master where UserID=textBox1.Text and Password=textBox2.Tet ", cn); SqlDataAdapter da = new SqlDataAdapter (); da.SelectCommand = cmd; DataSet ds = new DataSet(); da.Fill(ds, "user_master"); cn.Close(); たぶん、select文のなかが違うと思います。 マルチパート識別子 "textBox1.Text" をバインドできませんでした。 マルチパート識別子 "textBox2.Text" をバインドできませんでした。 とエラーがでます。 素人なので、つぎはぎして作ったので、文法的なものがめちゃくちゃかもしれませんが 以上宜しくお願いします。

  • C#でのデータセットを使用したDBアクセス

    はじめまして。 データセットを使用したDBアクセスの実装では SqlDataAdapter da = new SqlDataAdapter(strsql,stConnectionString); DataSet ds = new DataSet();  …(1) da.Fill(ds);              …(2) としますが(1)と(2)を合わせて DataSet ds = da.Fill(); とはできません。 インスタンス作成の際はオブジェクトによっては「=」でつないで作成するのがあると 思いますが、データセット使用の際にはできないのは、使用するオブジェクトによって 定義の記述が違うという認識を持っておけば良いのでしょうか? 「=」を使用せず、da.Fill(ds)で記述することに違和感があります。 よろしくお願いします。

  • C# sqlserver 2005 vs2005 DB追加時重複ID禁止(2)

    こんにちは。標記の件で再度調べています。 ユーザ管理画面編集時に重複したID列を追加禁止としたいのですが、 datasetを使って、回すと件数が多くなったときに時間がかかって しまうので、SQLCOMMANDを使用使用と思っております。 SQLCOMMANDにはどのような指定を行ったらよいですか。 そこで、処理できますでしょうか? お願いします。 string userid = textBox1.Text;、 string StrConn = @" "; SqlConnection cnc = new SqlConnection(StrConn); cnc.Open(); SqlCommand cmd = new SqlCommand("●", cnc); cmd.ExecuteNonQuery(); cnc.Close();

  • SQL serverデータ取得

    public static DataSet GetCustomers() { string sql = @"SELECT * FROM M_CHARGE"; SqlConnection conn = new SqlConnection(DBConfiguration.DbConnectionString); SqlDataAdapter da = new SqlDataAdapter(sql, DBConfiguration.DbConnectionString); da.SelectCommand = new SqlCommand(sql, conn); DataSet ds = new DataSet(); ds.Tables.Add("M_CHARGE"); da.Fill(ds, "M_CHARGE"); return ds; } da.Fill(ds, "M_CHARGE");の部分でインスタンスエラーになります。どうしてでしょうか? 誰か教えて下さいお願いします(TдT)

  • DataSet ds = new DataSet();

    DataSet ds = new DataSet(); System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(); da.SelectCommand = cmd; da.Fill(ds); でデータを格納したときに、 重複データを省きたいのですが可能でしょうか? DataReader ならひとつひとつ格納していくので、 重複データを省くことができるのですが。

  • <VB.NET>INSERT文でDBにデータを入れたい 

    プログラム初心者です。 ボタンを押したらtextboxの値がDBのテーブルに格納されて画面が閉じるという処理をしたいです。 そして他の画面でボタンを押すとINSERT済みのテーブルが出るという 処理をしようと思っています。 今のところは、他の画面でボタンを押してもINSERT済みのテーブルが でないという状態です。元のテーブルのデータはでます。 サンプルを見つけてやってみたのですが、思った結果がでません。 public sub botton1-click dim sql_insert as string dim cmd_insert as oledbcommand dim strconn as string = "provider = ~OLEDB4.0 = ~.mdb" DA = New oledbDataAdapter conn = New oledbconnection(strconn) sql_insert = "INSERT INTO A組(名前) VALUES(TextBox1.Text) cmd_insert = New oledbcommand(sql_insert,conn) DA.insertCommand = cmd_insert Me.colse end sub DataAdapterはdatasetを使わず直接DBに格納させるINSERTの時にでも 使うのでしょうか? 自分自身まだよく分かっていないので、正しいコードと処理の流れを 教えて欲しいです。 使っているのはaccess2000、VB.NET2003です。よろしくお願いします。

  • SQL Server2012 とC#

    DataGridViewで選択した行を他の処理に渡したくて、Netで調べて、次のようにしてみました。 DataSet ds = new DataSet(); SqlDataAdapter adpt = new SqlDataAdapter(); DataTable tbl = new DataTable("Movies"); ds.Tables.Add(tbl); for(int i=0; i<DataGrifView1.ColumnCount; i++){ tbl.Columns.Add(DataGridVew1.Columns[i].Name,DataGridView1.Columns[i].ValueType); } foreach(DataGridViewRow dr in DataGridView1.SelectedRows){ DataRowView rv= (DataRowView)dr.DataBoundItem; tbl.ImportRow(rv.Row); } ここで、出来たDataSet dsを、他のフォームに渡しました。そのフォームにはDataBindingNavigator1と、内容を表示するためのテキストボックスがあります。フォームLoadで次のように ナビゲータと各テキストに設定しました。 BindingSource1.DataSource = ds; BindingSource1.DataMember = "Movies"; DataBindingNavigator1.BindingSource = BindingSource1; textBox1.DataBindings.Add(new Binding("Text", ds, "Movies.邦題")); textBox2.DataBindings.Add(new Binding("Text", ds, "Movies.原題")); textBox3.DataBindings.Add(new Binding("Text", ds, "Movies.読み")); textBox4.DataBindings.Add(new Binding("Text", ds, "Movies.制作国")); textBox5.DataBindings.Add(new Binding("Text", ds, "Movies.制作年")); textBox6.DataBindings.Add(new Binding("Text", ds, "Movies.上映時間")); DataGridViewの複数の行を選択して、この処理を行うと、ナビゲータには、Rowの行数分だけのレコード数の分母が表示され、各テキストにはそれぞれのレコードの内容の内の一件分が表示されています。 Q1:  ここで、ナビゲータの進むボタンを押してみると、レコード位置を示す数(分子の方)が進むのに、テキストの内容が変化しません。何か、やり足りないのでしょうか? Q2:  DataGridViewの左上の行ヘッダと列ヘッダの交わる部分をクリックして、全選択(のつもりで)この処理を呼ぶと、SelectedRowの内容が読めないようで、NullReferenceExceptionのハンドルされていない例外が発生して、「オブジェクト参照がオブジェクトインスタンスに設定されていません」と言われます。デバッガでSelectedRowを追っても、行数はあるものの内容がありません。全選択は使用方法が違うのでしょうか?

  • .net 複数の主キーを設定する方法

    VB2005、SQLServer2005環境です。 主キーの設定方法について教えて下さい。 主キーが一つの場合下記のように記述しますが、複数ある場合はどう記述すればよろしいですか? お願いします。 strsql = "SELECT * FROM Aテーブル" Dim comm As SqlCommand = New SqlCommand(strsql, Con) Dim dataadapter As SqlDataAdapter = New SqlDataAdapter(comm) Dim ds As DataSet = New DataSet() dataadapter.Fill(ds, "Aテーブル") Dim dt As New DataTable dt = ds.Tables("Aテーブル") '主キーの設定 dt.PrimaryKey = New DataColumn() {dt.Columns("コード1")}

  • SQLのデータの一部分を切り取って表示するには?

    visual basicでSQLのデータを表示する際に、そのデータの左二文字だけ切り取ってdatagridviewに表示したいのですが、やり方がわかりません。 単にselect文でdatagridviewに表示するのはできたのですが。 切り取りには(Strings.Right(A, Len(A) - 6))とこの構文を使えばいいのでしょうか? ちなみにdatagridviewは3列あって、そのうちの1列目だけをそうしたいと思います。 普通に表示した場合のコードは以下のようです。     Dim sConn As SqlClient.SqlConnection Dim sda As SqlClient.SqlDataAdapter Dim ds As New DataSet sConn = New SqlConnection () 'SQLへの接続文字列     sda = New SqlDataAdapter("SELECT * FROM         kakeibo",sConn) 'kakeiboから呼び出す条件 sda.Fill(ds) '呼び出す datagridview1.DataSource = ds.Tables(0) '表示