使用C#程序中的字符串在SQL Server数据库中搜索

时间:2018-12-08 16:11:39

标签: c# sql sql-server

我想使用以下存储过程在数据库中进行搜索:

@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”:

search: "m"

我得到了MBO级的工作,所以我想这很好。但是,当我搜索像“ MBO”这样的完整职位级别时:

search: "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();
        }
    }

如果您知道我在做什么错,请告诉我!

谢谢!

1 个答案:

答案 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);

其他一些提示:

  1. 值得一读的can we stop using AddWithValue
  2. SqlCommand是IDisposable的,因此应放在using块中。
  3. 该连接也是IDisposposable的,因此与其将其保留为字段,不如将其作为using块中的局部变量。完成此操作后,就不需要finally...Close了,因为隐式Dispose在退出块时就可以完成。
  4. 问题顶部的存储过程定义不完整,但是将整个正文包装在BEGIN...END中是个好主意。也许这就是您要拥有BEGIN TRANSACTION的意思,因为这在执行SELECT的过程中似乎不合适。