2017-04-13 76 views
2

我需要使用C#篩選SQL數據庫以將其顯示在windowsFormsHost中。如何搜索SQL數據庫並在C#中顯示listview

爲此,我創建了一個文本框,在其中輸入所需的字符串。使用此輸入,代碼使用文本搜索數據庫,並在單擊刷新按鈕時顯示。

刷新按鈕的工作和完成,我只需要根據我的過濾器創建與選定的行的列表。

下面是代碼,其中指出,沒有返回值:

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' then sqlCommand.Parameters.AddWithValue(「@ tableName」,「yourTableName」);' – Stuart

+1

'sSqlWhere'定義在哪裏? –

+0

@TimothyG。 sSqlWhere是在我的代碼中定義的,雖然我故意省略它,但我的關注點更多地在sSqlLike –

回答

1

您在發佈的代碼中存在一些錯誤。

  1. 在sql查詢中使用連接字符串而不是參數。
  2. 重新聲明與函數參數具有相同名稱的變量。您現在在功能中不必要地聲明另一個乘客變量sPasssengerL
  3. 不從函數返回字符串值。您編輯的代碼顯示現在返回看似不需要的額外乘客變量sPasssengerL的功能。
  4. 您的LIKE聲明未包含檢查 的哪一列。

我清理了一下代碼,在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

檢查你的變量,你聲明sSqlSelect和您使用在查詢sSqlLike但不sSqlWhere。

0

a)您的功能將無法編譯: - 缺少「;」在幾行中, - 第2行中的局部變量聲明「sPessanger」與參數名稱衝突...

b)您永遠不會返回一個值。至少你需要一個「返回sPassenger」在代碼的某處返回選定的值。

c)使用sql注入的不良風格。正如評論中所述,在SQL中使用參數。

d)據我所見,你只從結果集中選擇一個值,或者是GetSqlDataString函數應該完成這項工作?

相關問題