我想使用参数在我们的日志表中的字段中搜索嵌入字符串中的数字.
从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; }
Joel Coehoor.. 10
WHERE message like '%' + @ErrorMessage + '%'
根据您的编辑,我不会立即看到导致您的错误的原因,但我确实发现了两个潜在的问题:
它没有正确处理null ErrorNumbers.我不认为这是它,因为空字符串应该仍然匹配该查询的所有内容.但修复空值将改善该情况的性能.
它将它视为数字类型而不是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 (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(); } }
顺便说一句:我不是第一个给你那个代码吗?:)
WHERE message like '%' + @ErrorMessage + '%'
根据您的编辑,我不会立即看到导致您的错误的原因,但我确实发现了两个潜在的问题:
它没有正确处理null ErrorNumbers.我不认为这是它,因为空字符串应该仍然匹配该查询的所有内容.但修复空值将改善该情况的性能.
它将它视为数字类型而不是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 (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(); } }
顺便说一句:我不是第一个给你那个代码吗?:)