我需要使用 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 查询中使用串联字符串而不是参数。
-
重新声明与函数参数同名的变量。您现在正在函数中声明另一个不必要的乘客变量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) 你永远不会返回一个值。至少您需要在代码中的某个位置使用单个"return sPassenger;"来返回所选值。
c)使用SQL注入的不良风格。如注释中所述,在 SQL 中使用参数。
d) 据我所知,您只从结果集中选择一个值,还是 GetSqlDataString 函数应该完成这项工作?