如何搜索SQL数据库并在C#中显示listview
问题描述:
我需要使用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;
}
}
答
您在发布的代码中存在一些错误。
- 在sql查询中使用连接字符串而不是参数。
-
重新声明与函数参数具有相同名称的变量。您现在在功能中不必要地声明另一个乘客变量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();
}
}
}
}
}
注:还有其他地方这个代码可以清理和简化,但已经超出了这个问题的范围。
答
检查你的变量,你声明sSqlSelect和您使用在查询sSqlLike但不sSqlWhere。
答
a)您的功能将无法编译: - 缺少“;”在几行中, - 第2行中的局部变量声明“sPessanger”与参数名称冲突...
b)您永远不会返回一个值。至少你需要一个“返回sPassenger”在代码的某处返回选定的值。
c)使用sql注入的不良风格。正如评论中所述,在SQL中使用参数。
d)据我所见,你只从结果集中选择一个值,或者是GetSqlDataString函数应该完成这项工作?
作为一方,你应该使用参数。连接字符串以形成查询是一个非常糟糕的安全问题。例如'select * from @tableName where @Foo = @ Bar' then sqlCommand.Parameters.AddWithValue(“@ tableName”,“yourTableName”);' – Stuart
'sSqlWhere'定义在哪里? –
@TimothyG。 sSqlWhere是在我的代码中定义的,虽然我故意省略它,但我的关注点更多地在sSqlLike –