0
Как использовать Like с параметром
Я хочу найти число, встроенное в строку в поле нашей таблицы журнала, с помощью параметра.
выберите * из vwLogs, где log_time> '02 / 24/2009 'и сообщение типа ('% 2009022508241446% ')
Я знаю, как использовать параметры, когда предложение where является знаком равенства, но не знаю, как это сделать с помощью 'Like'
это не кажется правильным
WHERE message like ('%@ErrorMessage%')
Я просто попробовал это, и это не сработало. Единственное, что изменилось - это часть поиска сообщений.
protected void btnRunQuery_Click(object sender, EventArgs e)
{
string strConn, strSQL;
strConn = @";";
strSQL = @"SELECT * FROM weblogs.dbo.vwlogs WHERE Log_time >= @BeginDate AND Log_Time < @EndDate AND ([email protected] OR @UserName IS NULL) AND (message like '%' + @ErrorNumber + '%' OR @ErrorNumber IS NULL) ORDER BY Log_time DESC";
using (SqlConnection cn = new SqlConnection(strConn))
{
SqlCommand cmd = new SqlCommand(strSQL, cn);
cmd.Parameters.AddWithValue("@UserName", txtUserName.Text);
cmd.Parameters.AddWithValue("@ErrorNumber", txtErrorNumber.Text);
cmd.Parameters.Add("@BeginDate", SqlDbType.DateTime).Value =
DateTime.Parse(txtBeginDate.Text).Date;
cmd.Parameters.Add("@EndDAte", SqlDbType.DateTime).Value =
// add one to make search inclusive
DateTime.Parse(txtEndDate.Text).Date.AddDays(1);
cn.Open();
SqlDataReader rdr = cmd.ExecuteReader();
GridView1.DataSource = rdr;
GridView1.DataBind();
cn.Close();
}
}
Спасибо за помощь
У меня это работает
if (string.IsNullOrEmpty(txtUserName.Text))
{
cmd.Parameters.Add("@UserName", SqlDbType.VarChar, 50).Value = DBNull.Value;
}
else
{
cmd.Parameters.Add("@UserName", SqlDbType.VarChar, 50).Value = txtUserName.Text;
}
if (string.IsNullOrEmpty(txtErrorNumber.Text))
{
cmd.Parameters.Add("@ErrorNumber", SqlDbType.VarChar, 50).Value = DBNull.Value;
}
else
{
cmd.Parameters.Add("@ErrorNumber", SqlDbType.VarChar, 50).Value = txtErrorNumber.Text;
}
Ответов (3)3
0
WHERE message like '%' + @ErrorMessage + '%'
Основываясь на ваших изменениях, я не сразу понимаю, что вызывает вашу ошибку, но я обнаружил две потенциальные проблемы:
- Он неправильно обрабатывает нулевые номера ошибок. Я не думаю, что это так, потому что пустая строка все равно должна соответствовать всему для этого запроса. Но исправление нулей улучшит производительность в этом случае.
- Он рассматривает его как числовой тип, а не как varchar. Это также влияет на производительность и может фактически нарушить запрос LIKE: я не помню, какое поведение было у меня в голове.
Попробуй это:
protected void btnRunQuery_Click(object sender, EventArgs e)
{
string strConn = @";";
string strSQL =
"SELECT * "
+ " FROM weblogs.dbo.vwlogs"
+ " WHERE Log_time >= @BeginDate AND Log_Time < @EndDate"
+ " AND ([email protected] OR @UserName IS NULL)"
+ " AND (message like '%' + @ErrorNumber + '%' OR @ErrorNumber IS NULL)"
+ " ORDER BY Log_time DESC";
using (SqlConnection cn = new SqlConnection(strConn))
using (SqlCommand cmd = new SqlCommand(strSQL, cn))
{
cmd.Parameters.Add("@BeginDate", SqlDbType.DateTime).Value =
DateTime.Parse(txtBeginDate.Text).Date;
cmd.Parameters.Add("@EndDAte", SqlDbType.DateTime).Value =
// add one to make search inclusive
DateTime.Parse(txtEndDate.Text).Date.AddDays(1);
cmd.Parameters.Add("@UserName", SqlDbType.VarChar, 50).Value =
string.IsNullOrEmpty(txtUserName.Text) ? DBNull.Value : txtUserName.Text;
cmd.Parameters.Add("@ErrorNumber", SqlDbType.VarChar, 50).Value =
string.IsNullOrEmpty(txtErrorNumber.Text) ? DBNull.Value : txtErrorNumber.Text;
cn.Open();
SqlDataReader rdr = cmd.ExecuteReader();
GridView1.DataSource = rdr;
GridView1.DataBind();
}
}
Кстати: разве я не давал вам этот код в первую очередь? :)