我想使用参数在日志表的字段中搜索嵌入字符串中的数字。
从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 (client_user=@UserName 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;
}
答案 0 :(得分:10)
WHERE message like '%' + @ErrorMessage + '%'
根据您的编辑,我不会立即看到导致您错误的原因,但我确实发现了两个潜在问题:
试试这个:
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 (client_user=@UserName 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();
}
}
顺便说一句:我不是第一个给你那个代码吗? :)
答案 1 :(得分:4)
你走在正确的道路上,但是这样使用它:
SET @ErrorMessage = '%' + @ErrorMessage + '%'
SELECT messageId FROM [yourTable]
WHERE message like @ErrorMessage
否则服务器将无法缓存执行计划
答案 2 :(得分:1)
或者@ErrorMessage是否包含%,例如@ErrorMessage ='ABCD%'然后这也将起作用
... WHERE message like @ErrorMessage