2017-04-13 74 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函数应该完成这项工作?

相关问题