如何搜索 SQL 数据库并在 C# listview 中显示

How to search SQL database and display in C# listview

我需要使用 C# 过滤 SQL 数据库以在 windowsFormsHost 中显示它。

为此,我创建了一个文本框,您可以在其中输入所需的字符串。使用此输入,代码使用文本搜索数据库并在单击刷新按钮时显示。

刷新按钮起作用并完成了,我只需要根据我的过滤器创建包含所选行的列表。

下面是代码,其中声明没有返回任何值:

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

检查您的变量,您已经声明了 sSqlSelect 和 sSqlLike,但没有声明您在查询中使用的 sSqlWhere。

a) 你的函数不会编译: - 丢失的 ”;”在几行中, - 第 2 行中的局部变量声明 "sPessanger" 与参数名称冲突 ...

b) 你永远不会 return 一个值。至少您需要在代码中的某处使用一个 "return sPassenger;" 来 return 所选值。

c) 使用 sql 注入的糟糕风格。如评论中所述,在 SQL.

中使用参数

d) 据我所知,您只从结果集中选择了一个值,还是应该由 GetSqlDataString 函数来完成这项工作?

您发布的代码中有一些错误。

  1. 在您的 sql 查询中使用连接字符串而不是参数。
  2. 重新声明一个与函数参数同名的变量。您现在在函数中不必要地声明了另一个乘客变量 sPasssengerL
  3. 未从函数返回字符串值。您编辑的代码显示函数现在返回看似不需要的额外乘客变量 sPasssengerL
  4. 您的 LIKE 语句未包括它正在检查的列 反对。

我稍微清理了代码,留下了 sSqlWhere 以防在您的示例之外出现奇怪的问题。这也展示了如何按照您的要求将第一列数据添加到列表视图。

EDIT: Per your comment on the original question I've updated the code to show your sSqlWhere variable.

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

注意:还有其他地方可以清理和简化这段代码,但这超出了这个问题的范围。