c# - 如何搜索SQL数据库并在C# ListView 中显示

原文 标签 c# sql listview windowsformshost

我需要使用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;
        }
    }

最佳答案

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


在SQL查询中使用串联字符串而不是参数。
重新声明与functions参数相同名称的变量。您现在不需要在函数中声明另一个乘客变量sPasssengerL
不从函数返回字符串值。您编辑的代码显示了该函数现在返回似乎不需要的额外乘客变量sPasssengerL
您的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();
                }
            }
        }
    }
}


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

关于c# - 如何搜索SQL数据库并在C# ListView 中显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43391598/

相关文章:

javascript - 开始滚动时,使TouchableOpacity不突出显示元素[React Native]

android - 以定义的样式膨胀布局

android - CheckedTextView 未选中

java - 更新数据库后对程序进行更改?

sql - 是否可以使用一个UPDATE SQL语句执行多个更新?

c# - 在图像文件中定位点的最佳算法是什么?

c# - C#中的using(){…}是否与Cocoa中的autoreleasepool {…}具有相同的目的?

sql - 在 Aginity Workbench SQL 中选择 1% 的样本

c# - 使用 Windows 计划任务及时调用控制台应用程序。这是一种有效的方法吗

c# - 使用 .net 中的用户错误报告中的行号重新创建堆栈跟踪?