2017-04-13 3 views
2

C#を使用してSQLデータベースをフィルタリングして、windowsFormsHostに表示する必要があります。C#listviewでSQLデータベースと表示を検索する方法

そのために、必要な文字列を入力するテキストボックスを作成しました。この入力を使用して、コードはテキストを使用してデータベースを検索し、更新ボタンをクリックして表示します。

リフレッシュボタンが機能して完了しました。フィルタに応じて選択した行のリストを作成するだけで済みます。ここで

は何も値が返されないと述べているコードは、次のとおりです。

private string GetPassengerList(string sPasssenger) 
    { 
    string sPasssengerL = textBoxPassengerName.Text; 
     if (sPasssenger.Trim().Length > 0) 
     { 
      string sToTime = dtpToDate.Value.Year.ToString("D4") + @"/" + dtpToDate.Value.Month.ToString("D2") + @"/" + dtpToDate.Value.Day.ToString("D2"); 
      sToTime += @" " + dtpToTime.Value.Hour.ToString("D2") + @":" + dtpToTime.Value.Minute.ToString("D2") + @":" + dtpToTime.Value.Second.ToString("D2"); 
      string sFromTime = dtpFromDate.Value.Year.ToString("D4") + @"/" + dtpFromDate.Value.Month.ToString("D2") + @"/" + dtpFromDate.Value.Day.ToString("D2"); 
      sFromTime += @" " + dtpFromTime.Value.Hour.ToString("D2") + @":" + dtpFromTime.Value.Minute.ToString("D2") + @":" + dtpFromTime.Value.Second.ToString("D2"); 

      string sSqlSelect = @"SELECT Passenger FROM "; 
      string sSqlWhere = @" WHERE (Created BETWEEN '" + sFromTime + @"' AND '" + sToTime + @"')";// and (IATA='" + sIata + @"')"; 
      string sSqlLike = @" LIKE '%" + sPasssengerL + "'%"; 

      SqlDataReader sqlReader = null; 
      try { 
       SqlCommand sqlCommand = new SqlCommand(sSqlSelect + @"dbo.BagData" + sSqlWhere + sSqlLike, this.dbConnection); 
       sqlReader = sqlCommand.ExecuteReader(); 
       if(!sqlReader.Read()) { 
        sqlReader.Close(); 
        sqlCommand.CommandText = sSqlSelect + @"dbo.BagDataHistory" + sSqlWhere + sSqlLike; 
        sqlReader = sqlCommand.ExecuteReader(); 
        if(!sqlReader.Read()) { 
         sqlReader.Close(); 
         sqlCommand.CommandText = sSqlSelect + @"dbo.BagDataArchive" + sSqlWhere + sSqlLike; 
         sqlReader = sqlCommand.ExecuteReader(); 
         if(!sqlReader.Read()) { 
           sqlReader.Close(); 
         } 
        } 
       } 
       if(!sqlReader.IsClosed) { 
        sPasssengerL = this.GetSqlDataString(@"Passenger", sqlReader); 
        sqlReader.Close(); 
       } 
      } 
      catch(SqlException x) { 
       MessageBox.Show(@"GetPassengerName(): SQL Exception: " + x.Message, this.GetHashString("Error"), MessageBoxButton.OK, MessageBoxImage.Error); 
      } 
      catch(Exception ex) { 
       MessageBox.Show(@"GetPassengerName(): General Exception: " + ex.Message, this.GetHashString("Error"), MessageBoxButton.OK, MessageBoxImage.Error); 
      } 
      finally { 
       if(sqlReader != null) { 
        if(!sqlReader.IsClosed) { 
         sqlReader.Close(); 
        } 
       } 
      } 
      return sPasssengerL; 
     } 
    } 
+2

一方ではなく、パラメータを使用する必要があります。文字列を連結してクエリを構成することは、セキュリティ上問題ありません。例えば'select * from @tableName where @Foo = @ Bar'そして' sqlCommand.Parameters.AddWithValue( "@ tableName"、 "yourTableName"); ' – Stuart

+1

' sSqlWhere'はどこに定義されていますか? –

+0

@TimothyG。 sSqlWhereは私のコードで定義されていますが、意図的に省略しましたが、私の懸念はsSqlLikeの上にあります –

答えて

1

投稿したコードにいくつかの誤りがあります。

  1. SQLクエリでパラメータの代わりに連結文字列を使用します。
  2. 関数のパラメータと同じ名前の変数を再宣言します。別の乗客変数sPasssengerLが不必要に関数に宣言されています。
  3. 関数から文字列値を戻しません。あなたの編集したコードは、一見不必要な余分な旅客変数sPasssengerLを返す関数を示しています。
  4. LIKEステートメントには、 をチェックしている列が含まれていませんでした。

例外で奇妙にdelcaredされた場合のために、コードを少しきれいにして、sSqlWhereを残しました。これはまた、あなたが要求したように、データの最初の列をリストビューに追加する方法を示しています。

編集:私はあなたのsSqlWhere変数を表示するコード を更新した元の質問にあなたのコメントパー

private void GetPassengerList() 
{ 
    string sPassenger = textBoxPassengerName.Text; 
    if (sPassenger.Trim().Length > 0) 
    { 

     string sToTime = dtpToDate.Value.Year.ToString("D4") + @"/" + dtpToDate.Value.Month.ToString("D2") + @"/" + dtpToDate.Value.Day.ToString("D2"); 
     sToTime += @" " + dtpToTime.Value.Hour.ToString("D2") + @":" + dtpToTime.Value.Minute.ToString("D2") + @":" + dtpToTime.Value.Second.ToString("D2"); 
     string sFromTime = dtpFromDate.Value.Year.ToString("D4") + @"/" + dtpFromDate.Value.Month.ToString("D2") + @"/" + dtpFromDate.Value.Day.ToString("D2"); 
     sFromTime += @" " + dtpFromTime.Value.Hour.ToString("D2") + @":" + dtpFromTime.Value.Minute.ToString("D2") + @":" + dtpFromTime.Value.Second.ToString("D2"); 

     string sSqlSelect = @"SELECT Passenger FROM "; 
     string sSqlWhere = @" WHERE (Created BETWEEN @startDate AND @endDate)"; 

     // I assume this is looking for passenger. Change appropriately. 
     string sSqlLike = @"AND Passenger LIKE @name"; 
     string searchTerm = "%" + sPassenger + "%"; 

     SqlDataReader sqlReader = null; 
     try 
     { 
      SqlCommand sqlCommand = new SqlCommand(sSqlSelect + @"dbo.BagData" + sSqlWhere, parentWindow.dbConnection); 
      sqlReader = sqlCommand.ExecuteReader(); 
      if (!sqlReader.Read()) 
      { 
       sqlReader.Close(); 
       sqlCommand.CommandText = sSqlSelect + @"dbo.BagDataHistory" + sSqlWhere + sSqlLike; 
       sqlCommand.Parameters.Add(new SqlParameter("@name", searchTerm)); 
       sqlCommand.Parameters.Add(new SqlParameter("@startDate", sToTime)); 
       sqlCommand.Parameters.Add(new SqlParameter("@endDate", sFromTime)); 
       sqlReader = sqlCommand.ExecuteReader(); 
       if (!sqlReader.Read()) 
       { 
        sqlReader.Close(); 
        sqlCommand.CommandText = sSqlSelect + @"dbo.BagDataArchive" + sSqlWhere + sSqlLike; 
        sqlReader = sqlCommand.ExecuteReader(); 

        // This will loop through your returned data and add 
        // an item to a list view (listView1) for each row. 
        while (sqlReader.Read()) 
        { 
         ListViewItem lvItem = new ListViewItem(); 
         lvItem.SubItems[0].Text = sqlReader[0].ToString(); 
         lvItem.SubItems.Add(sqlReader[0].ToString()); 
         listView1.Items.Add(lvItem); 
        } 
        sqlReader.Close(); 
       } 
      } 
      if (!sqlReader.IsClosed) 
      { 
       sPassenger = parentWindow.GetSqlDataString(@"Passenger", sqlReader); 
       sqlReader.Close(); 
      } 
     } 
     catch (SqlException x) 
     { 
      MessageBox.Show(@"GetPassengerName(): SQL Exception: " + x.Message, parentWindow.GetHashString("Error"), MessageBoxButton.OK, MessageBoxImage.Error); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(@"GetPassengerName(): General Exception: " + ex.Message, parentWindow.GetHashString("Error"), MessageBoxButton.OK, MessageBoxImage.Error); 
     } 
     finally 
     { 
      if (sqlReader != null) 
      { 
       if (!sqlReader.IsClosed) 
       { 
        sqlReader.Close(); 
       } 
      } 
     } 
    } 
} 

注:あり、他の場所は、このコードをクリーンアップして簡略化することが可能ですが、それはこの質問の範囲を超えています。

1

はあなたの変数をチェックし、あなたがあなたのクエリで使用しているsSqlWhere sSqlSelectとsSqlLikeを宣言したがいませんでした。

0

a)あなたの関数はコンパイルされません: - "" - 2行目のローカル変数宣言 "sPessanger"がパラメータ名と矛盾しています...

b)決して値を返しません。少なくともあなたは単一の「返品者」を必要とします。コードのどこかで選択した値を返します。

c)SQLインジェクションを使用する悪いスタイル。コメントにすでに述べたように、SQLのパラメータを使用します。

d)私が見る限り、結果セットから1つの値しか選択していないか、ジョブを実行するはずのGetSqlDataString関数ですか?

関連する問題