c#在SqlDataAdapter中使用Parameters.AddWithValue

如何将Parameters.AddWithValue与SqlDataAdapter一起使用。 下面搜索代码。

var da = new SqlDataAdapter("SELECT * FROM annotations WHERE annotation LIKE '%"+txtSearch.Text+"%'", _mssqlCon.connection); var dt = new DataTable(); da.Fill(dt); 

我重写了这样的代码:

 SqlDataAdapter da; da = new SqlDataAdapter("SELECT * FROM annotations WHERE annotation LIKE '%@search%'", _mssqlCon.connection); da.SelectCommand.Parameters.AddWithValue("@search",txtSearch.Text); var dt = new DataTable(); da.Fill(dt); 

但它失败了。

用于初始化SqlDataAdapter的字符串成为SqlDataAdapter的SelectCommand属性的CommandText
您可以使用此代码向该命令添加参数

 da = new SqlDataAdapter("SELECT * FROM annotations WHERE annotation LIKE @search", _mssqlCon.connection); da.SelectCommand.Parameters.AddWithValue("@search","%" + txtSearch.Text + "%"); 
  • 首先,删除参数占位符周围的单引号。
  • 其次,直接在AddWithValue的Value参数中添加通配符

您已经要求使用AddWithValue ,但请记住,虽然它是一个有用的快捷方式,但也有许多缺点,并且都有很好的文档记录。

  • 第一: 我们可以停止使用AddWithValue()吗? 作者讨论了AddWithValue如何在查询中返回错误结果
  • 第二: 数据访问代码如何影响数据库性能 ,其中作者为AddWithValue提供了强大性能问题的证据

因此,没有AddWithValue并使用Object和Collection Initializers语法的相同代码可以写成

 da = new SqlDataAdapter("SELECT * FROM annotations WHERE annotation LIKE @search", _mssqlCon.connection); da.SelectCommand.Parameters.Add(new SqlParameter { ParameterName = "@search", Value = "%" + txtSearch.Text + "%", SqlDbType = SqlDbType.NVarChar, Size = 2000 // Assuming a 2000 char size of the field annotation (-1 for MAX) }); 

使用da.SelectCommand.Parameters.Add()而不是cmd.Parameters.Add() ,这里有一个处理存储过程的示例,它接受两个参数,第二个是可以为null的int参数:

 public DataTable GetData(int par1, int? par2) { using (SqlConnection conn = new SqlConnection(connectionString)) { using (SqlDataAdapter da = new SqlDataAdapter()) { string sql = "StoreProcedure_name"; da.SelectCommand = new SqlCommand(sql, conn); da.SelectCommand.CommandType = CommandType.StoredProcedure; da.SelectCommand.Parameters.Add("@Par1", SqlDbType.Int).Value = par1; da.SelectCommand.Parameters.Add("@Par2", SqlDbType.Int).Value = (object)par2?? DBNull.Value; DataSet ds = new DataSet(); da.Fill(ds, "SourceTable_Name"); DataTable dt = ds.Tables["SourceTable_Name"]; //foreach (DataRow row in dt.Rows) //{ //You can even manipulate your data here //} return dt; } } } 

试试这个:

 mySearchString = "Select * From test Where ([title] LIKE '%' + @title + '%')"; cmd.Parameters.Add("@title", SqlDbType.VarChar, 120); cmd.Parameters("@title").Value = TextBox1.Text; 

我使用Repeater来显示数据

 int queryString =int.Parse(Request.QueryString["Id"]); SqlConnection conn =new SqlConnection("server=.; Database=Northwind; Integrated Security=true;"); try{ conn.Open(); SqlDataAdapter dataAdapter = new SqlDataAdapter("SELECT ProductID, ProductName, UnitPrice, CategoryID FROM Products WHERE CategoryID =@CategoryID", conn); dataAdapter.SelectCommand.Parameters.Add("@CategoryID", queryString); DataSet dataSet = new DataSet(); dataAdapter.Fill(dataSet); QueryStringProductListRepeater.DataSource = dataSet; QueryStringProductListRepeater.DataBind(); } catch{ Response.Write("QueryStringProductListRepeater"); } finally{ conn.Close(); }