2017-02-13 7 views
0

助けてください。これは私の会社のClient Servicesチームが約6週間働いていたUI用です。UIチェックボックス(チェックボックス)を選択した場合、データベーステーブルの 'id'値を見つけることができません

タイトルと同様に、チェックボックスを含む行に関連付けられた「ID」値を選択しようとしています。そのチェックボックスが 'チェックされている'場合は、select文を実行し、その行から 'ID'値を取得します。

protected void UpdateSelectedRecords() 
{ 
    string strPerSignStart = "%"; 
    string strPerSignEnd = "%"; 
    string strDbSearch = strPerSignStart + ddlDatabasesUpdateTCID.Text +  strPerSignEnd; 
    object NewTCID = txtTargetCID.Text; 

    DateTime curtstmp = DateTime.Now; 

    foreach (GridViewRow row in GridView1.Rows) 
    { 
    if (row.RowType == DataControlRowType.DataRow) 
    { 
     chkBox = (row.Cells[0].Controls[0] as CheckBox); 

     if (chkBox != null && Convert.ToBoolean(chkBox.Checked) == true) 
     { 
     OdbcConnection Postgreconnect2 = new OdbcConnection("Driver= {PostgreSQL Unicode};Server=localhost;Port=5433;Database=postgres;Uid=xxx;Pwd=xxx"); 

     Postgreconnect2.Open(); 

     OdbcCommand cmd = new OdbcCommand("SELECT id FROM conceptidmapping WHERE database ILIKE " + "?" + " AND " + (chkBox.Checked == true) + " ORDER BY id ASC", Postgreconnect2); 
     cmd.Parameters.AddWithValue("@database", strDbSearch); 
     cmd.Parameters["@database"].Value = Convert.ToString(strDbSearch); 
     cmd.Connection = Postgreconnect2; 
     string idVal = (string)cmd.ExecuteScalar(); 


     OdbcCommand cmd1 = new OdbcCommand("UPDATE conceptidmapping SET selected = true WHERE database ILIKE " + "?" + " AND id = " + idVal, Postgreconnect2); 
     cmd1.Parameters.AddWithValue("@database", strDbSearch); 
     cmd1.Parameters["@database"].Value = Convert.ToString(strDbSearch); 
     cmd1.Connection = Postgreconnect2; 
     cmd1.ExecuteNonQuery(); 
     } 
     } 
    } 
    } 
+0

私の謝罪なしで上記と同じコード。起こっているのは、プログラムが 'For'ループに入ったときに、Gridview(上から下)を介して行ごとにナビゲートしているときです。チェックボックスがオンになっていることを確認すると、2番目のIF文(ODBCコマンド付き)が入力されます。最初のODBCコマンドは、その行の 'ID'値の検索を試みます。その 'ID'値を取得すると、2番目のODBCコマンドでその値を使用して、 'selected'列を 'false'から 'true'に更新します。 – M72

+0

何が起こっているのは、正しいデータベースの「ID」値を取得しますが、チェックボックスを選択しなかったことです。誰も私がこのアプローチで持っている簡単な欠陥を見ますか?私はこのプロセスの最初のステップはドロップダウンリストから 'データベース'の値を選択することなので、 'コードビハインド'ファイル(C#)ですべてをやっています。私は間違っているかもしれませんが、マークアップに埋め込まれたコマンドでこのアプローチを使用するのは難しいと思います。どんな提案も大歓迎です!! – M72

答えて

0

GridViewsはデータの表示と管理に非常に優れています。あなたは"行に関連付けられた 'ID'値があると述べています。しかし、あなたは実際にIDを取得するためにDB呼び出しを行います。

私にはこれが "DataKey"と叫びます。個人的には、GridViewにデータを挿入するために必要なIDを作成し、そのIDをGridView DataKeyとして追加する方法があります。これはIDをGridViewRowに関連付ける方法です。これは、UpdateSelectedRecords()

の中のSelect DB呼び出しを排除することができます。ただし、ここではあなたのコードがあります。両方のソリューションで修正され、いくつかの点で考慮されています。

protected void UpdateSelectedRecords() 
{ 
    //////////////////////////////////////////// 
    // Since these are all local to the function 
    // 
    string strPerSignStart = "%"; 
    string strPerSignEnd = "%"; 
    string strDbSearch = strPerSignStart + ddlDatabasesUpdateTCID.Text + strPerSignEnd; 
    // 
    ////////////////////////////////////////////// 
    // Consider : 
    string strDbSearch = String.Format("%{0}%", ddlDatabasesUpdateTCID.Text); 


    ////////////////////////////////////////////// 
    // FYI These are never used 
    // 
    object NewTCID = txtTargetCID.Text; 
    DateTime curtstmp = DateTime.Now; 

    ////////////////////////////////////////////// 
    // Instantiate and open a connection once 
    // also consider using the using() statement 
    // it make managing connections much easier 
    // 
    using(OdbcConnection Postgreconnect2 = new OdbcConnection("Driver= {PostgreSQL Unicode};Server=localhost;Port=5433;Database=postgres;Uid=xxx;Pwd=xxx")); 
    { 
    Postgreconnect2.Open(); 

    // Instantiate commands once 
    OdbcCommand cmd = new OdbcCommand("", Postgreconnect2); 
    OdbcCommand cmd1 = new OdbcCommand("", Postgreconnect2); 

    foreach (GridViewRow row in GridView1.Rows) 
    { 
     if (row.RowType == DataControlRowType.DataRow) 
     { 
     chkBox = (row.Cells[0].Controls[0] as CheckBox); 

     ////////////////////////////////// 
     // chkBox.Checked *is* a boolean value, no need to convert to Bool 
     // 
     if (chkBox != null && chkBox.Checked) 
     { 
      ////////////////////////////////// 
      // Since strDbSearch doesn't change 
      // just make it part of the select string you are building 
      // This eliminates the need for parameter passing 
      // 
      // Also, check the string you are building 
      // It doesn't look like it builds a proper SELECT statement 
      // You're missing a field after "AND" 
      cmd.CommandText = 
       "SELECT id FROM conceptidmapping " 
       "WHERE database ILIKE " + strDbSearch + " AND " + 
       (chkBox.Checked == true) + " ORDER BY id ASC"; 

      ////////////////////////////////// 
      // No parameters necessary, but... 
      // This already assigns the value to the parameter 
      // 
      //cmd.Parameters.AddWithValue("@database", strDbSearch); 
      // 
      // So there is no need to do it again here 
      // 
      //cmd.Parameters["@database"].Value = Convert.ToString(strDbSearch); 


      string idVal = (string)cmd.ExecuteScalar(); 

      /////////////////////////////////// 
      // IF YOU ARE ABLE TO MAKE THE ID A DATAKEY 
      // Then the entire cmd for the select call above 
      // can be removed in favor of this: 
      // 
      string idVal = Gridview1.DataKeys(row.RowIndex).Values("id") 

      cmd1.CommandText = "UPDATE conceptidmapping SET selected = true WHERE database ILIKE " + strDBSearch + " AND id = " + idVal ; 

      cmd1.ExecuteNonQuery(); 
     } 
     } 
    } 
    } 
} 

コメントと最初にこの上の多くの情報を提供していないためdatakeyで行わ

protected void UpdateSelectedRecords() 
{ 
    string strDbSearch = String.Format("%{0}%", ddlDatabasesUpdateTCID.Text); 

    using(OdbcConnection Postgreconnect2 = new OdbcConnection("Driver= {PostgreSQL Unicode};Server=localhost;Port=5433;Database=postgres;Uid=xxx;Pwd=xxx")); 
    { 
    Postgreconnect2.Open(); 
    OdbcCommand cmd1 = new OdbcCommand("", Postgreconnect2); 

    foreach (GridViewRow row in GridView1.Rows) 
    { 
     if (row.RowType == DataControlRowType.DataRow) 
     { 
     chkBox = (row.Cells[0].Controls[0] as CheckBox); 
     if (chkBox != null && chkBox.Checked) 
     { 
      string idVal = Gridview1.DataKeys(row.RowIndex).Values("id"); 

      cmd1.CommandText = String.Format("UPDATE conceptidmapping SET selected = true WHERE database ILIKE {0} AND id = {1}", strDbSearch, idVal) ; 
      cmd1.ExecuteNonQuery(); 
     } 
     } 
    } 
    } 
} 
関連する問題