我想使用以下存储过程在数据库中进行搜索:
@niveau varchar(50),
@naam varchar(50)
)
as
begin transaction
if (LEN(@naam) > 0 and LEN(@niveau) > 0)
select * from Opleiding where OpleidingNaam like '%' + @naam + '%' and OpleidingNiveau like '%' + @niveau + '%'
else if (LEN(@naam) > 0 and LEN(@niveau) = 0 )
select * from Opleiding where OpleidingNaam like '%' + @naam + '%'
else if (LEN(@naam) = 0 and LEN(@niveau) > 0 )
select * from Opleiding where OpleidingNiveau like '%' + @niveau + '%'
else if (LEN(@naam) = 0 and LEN(@niveau) = 0 )
select * from Opleiding ;
使用if / if else语句的原因是因为我要搜索名称(@naam
)或级别(@niveau
),所以可以进行任何组合(例如留空等)。
现在的问题是我可以像这样搜索“ m”:
我得到了MBO级的工作,所以我想这很好。但是,当我搜索像“ MBO”这样的完整职位级别时:
我什么也没得到。
这是我在数据库中进行的测试,以模拟从应用程序中获得的字符串:
declare @naam varchar(50);
declare @niveau varchar(50);
set @naam = '';
set @niveau = 'MBO';
if (LEN(@naam) > 0 and LEN(@niveau) > 0)
select * from Opleiding where OpleidingNaam like '%' + @naam + '%' and OpleidingNiveau like '%' + @niveau + '%'
else if (LEN(@naam) > 0 and LEN(@niveau) = 0 )
select * from Opleiding where OpleidingNaam like '%' + @naam + '%'
else if (LEN(@naam) = 0 and LEN(@niveau) > 0 )
select * from Opleiding where OpleidingNiveau like '%' + @niveau + '%'
else if (LEN(@naam) = 0 and LEN(@niveau) = 0 )
select * from Opleiding ;
并且您会看到它应该返回我想要的工作。
这是我填写列表框的方式:
public void laadGegevens()
{
try
{
SqlCommand zoeken = new SqlCommand("spSelecteerOpleidingenList", conn);
zoeken.CommandType = CommandType.StoredProcedure;
zoeken.Parameters.AddWithValue("@naam", SqlDbType.VarChar).Value = Convert.ToString(txtNaam.Text);
zoeken.Parameters.AddWithValue("@niveau", SqlDbType.VarChar).Value = Convert.ToString(txtNiveau.Text);
conn.Open();
using (SqlDataReader reader = zoeken.ExecuteReader())
{
while (reader.Read())
{
foreach (IDataRecord record in reader)
{
ListOpleidingen.Items.Add(string.Format(reader[1].ToString() + " " + reader[2].ToString()));
}
}
}
}
catch (Exception error)
{
MessageBox.Show(error.Message);
}
finally
{
conn.Close();
}
}
如果您知道我在做什么错,请告诉我!
谢谢!
答案 0 :(得分:1)
您似乎对两种用于传递参数的方法感到困惑。代码正在执行:
zoeken.Parameters.AddWithValue("@naam", SqlDbType.VarChar).Value = Convert.ToString(txtNaam.Text);
zoeken.Parameters.AddWithValue("@niveau", SqlDbType.VarChar).Value = Convert.ToString(txtNiveau.Text);
这是将SqlDbType.VarChar
枚举设置为值,但该值将被覆盖,但您可能是这样想的:
zoeken.Parameters.Add("@naam", SqlDbType.VarChar).Value = Convert.ToString(txtNaam.Text);
zoeken.Parameters.Add("@niveau", SqlDbType.VarChar).Value = Convert.ToString(txtNiveau.Text);
其他一些提示:
using
块中。using
块中的局部变量。完成此操作后,就不需要finally...Close
了,因为隐式Dispose在退出块时就可以完成。BEGIN...END
中是个好主意。也许这就是您要拥有BEGIN TRANSACTION
的意思,因为这在执行SELECT
的过程中似乎不合适。