使用MS-Access在Windows窗体应用程序C#中搜索多个TextBox和ComboBox

时间:2014-02-09 10:35:33

标签: c# sql ms-access

我在创建多个TextBoxComboBox搜索时遇到了问题。

我首先使用了以下查询:

SELECT p.property_id, p.property_name, s.type_name, p.property_purpose, p.property_price, p.area, p.bedrooms, p.property_location, c.customer_name, c.customer_mobile1
FROM (tb_property AS p INNER JOIN lk_tb_property_type AS s ON p.property_type_id=s.property_type_id) INNER JOIN tb_customer AS c ON p.customer_id=c.customer_id
WHERE ([@propertyType] Is Null Or s.type_name Like '%'+[@propertyType]+'%') And ([@propertyPurpose] Is Null Or p.property_purpose Like '%'+[@propertyPurpose]+'%') And ([@area] Is Null Or p.area Like '%'+[@area]+'%') And ([@bedrooms] Is Null Or p.bedrooms Like '%'+[@bedrooms]+'%') And ([@price] Is Null Or p.property_price Like '%'+[@price]+'%') And ([@buidName] Is Null Or p.property_name Like '%'+p.property_name+'%') And ([@location] Is Null Or p.property_location Like '%'+[@location]+'%');

当我在MS-Access中的查询向导中运行时,它正在做的是当我没有传递任何参数时,即所有参数为null它显示所有内容。当我传递单个参数的那一刻它没有给我任何东西,只显示空白表。 当我使用CommandText使用此查询并使用Parameters.Add传递参数时,我得到error 缺少一个或多个参数

任何人都可以向我提供解决方案,即在MS-Access DB中进行搜索的方式是什么

我在SQL Server中使用了相同类型的查询,它可以提供正确的结果。

我正在使用以下c#代码:

string propertyType = combo_prop_type.Text;
if (propertyType == "Select Property Type")
{
    propertyType = null;
}
else
{
    propertyType = combo_prop_type.Text;
}

string propertyPurpose = combo_purpose.Text;
if (propertyPurpose == "Select Property Purpose")
{
    propertyPurpose = null;
}
else
{
    propertyType = combo_prop_type.Text;
}

string area = combo_area.Text;
if (area == "Select Area")
{
    area = null;
}
else
{
    area = combo_area.Text.ToString();
}

string bedrooms = combo_bedrooms.Text;
if (bedrooms == "Select Bedrooms")
{
    bedrooms = null;
}
else
{
    bedrooms = combo_bedrooms.Text.ToString();
}

string price = combo_price.Text;
if (price == "Select Price")
{
    price = null;
}
else
{
    price = combo_price.Text.ToString();
}

string buidName = txt_build_name.Text.Trim();
string location = txt_location.Text.Trim();

OleDbConnection con = new OleDbConnection(constr);
OleDbCommand cmd = new OleDbCommand();

cmd.Connection = con;
cmd.CommandText = "select p.property_id, p.property_name, s.type_name, p.property_purpose, p.property_price, p.area, p.property_location, c.customer_name, c.customer_mobile1  from ((tb_property p INNER JOIN lk_tb_property_type s ON p.property_type_id = s.property_type_id) INNER JOIN tb_customer c ON p.customer_id = c.customer_id) WHERE (@propertyType is null or s.type_name like '%' + @propertyType + '%') and (@propertyPurpose is null or p.property_purpose like '%'+ @propertyPurpose +'%') and (@area is null or p.area like '%'+ @area +'%') and (@bedrooms is null or p.bedrooms like '%'+ @bedrooms +'%') and (@price is null or p.property_price like '%'+ @price +'%') and (@buidName is null or p.property_name like '%'+ @buildName +'%') and (@location is null or p.property_location like '%'+ @location +'%')";
cmd.Parameters.Add("@propertyType", OleDbType.VarChar, 50).Value = propertyType;
cmd.Parameters.Add("@propertyPurpose", OleDbType.VarChar, 50).Value = propertyPurpose;
cmd.Parameters.Add("@area", OleDbType.VarChar, 50).Value = area;
cmd.Parameters.Add("@bedrooms", OleDbType.VarChar, 50).Value = bedrooms;
cmd.Parameters.Add("@price", OleDbType.VarChar, 50).Value = price;
cmd.Parameters.Add("@buildName", OleDbType.VarChar, 50).Value = buidName;
cmd.Parameters.Add("@location", OleDbType.VarChar, 50).Value = location;
cmd.CommandType = CommandType.Text;
OleDbDataAdapter da = new OleDbDataAdapter();
da.SelectCommand = cmd;
DataSet ds = new DataSet();
da.Fill(ds);
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{

    for (int j = 0; j < 9; j++)
    {
        dataGridView2.Rows.Add(new DataGridViewRow());
        dataGridView2.Rows[i].Cells[j].Value = ds.Tables[0].Rows[i][j].ToString();
    }
}
con.Close();

我还搜索了IFF()COALESCE()NZ()以下要在我们需要发送默认值时使用的函数但是COALESCE()我得到了未定义的函数在MS-ACCESS中,当我使用IFF OR条件时,当用户向TextBoxComboBox提供任何内容时,DataGridTextBox没有向ComboBox显示任何内容1}}。它仅在用户为每个{{1}}或{{1}}

提供至少一些值时才有效

1 个答案:

答案 0 :(得分:1)

您不能在查询语句中两次引用相同的参数。因为每次它引用一个新参数!

  

MSDN - OleDbCommand.Parameters

     

OLE DB .NET提供程序不支持传递的命名参数   SQL语句或由a调用的存储过程的参数   CommandType设置为Text时的OleDbCommand。在这种情况下,   必须使用问号(?)占位符。例如:

     

SELECT * FROM Customers WHERE CustomerID =?

     

因此,顺序在哪   OleDbParameter对象必须添加到OleDbParameterCollection中   直接对应于问号占位符的位置   用于命令文本中的参数。

相反,您必须根据UI模式构建查询和动态参数。

像这样:

string propertyType = combo_prop_type.Text;
if (propertyType == "Select Property Type")
{
    propertyType = null;
}
else
{
    da.SelectCommand.CommandText += " AND s.type_name LIKE ? ";
    da.SelectCommand.Parameters.Add("", "%" + combo_prop_type.Text + "%");
}