即使指定了参数,SqlCommand也会返回所有记录

时间:2016-08-10 20:30:42

标签: c# sql-server

我有一个简单的ASP.NET Web表单,其中包含5个文本框和一个提交按钮,用于过滤从数据库返回的结果集。

无论输入什么,DataAdapter都会填充表格的完整内容,而不包含任何参数。

我的代码有什么问题?

 private void BindGridView()
 {
     using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SQLServer2005DBConnectionString"].ToString()))
     {
         SqlCommand cmd = new SqlCommand();
         cmd.Connection = conn;
         cmd.CommandType = System.Data.CommandType.Text;

         cmd.CommandText = "select Cust_SID, First_name, Last_name, Address1, Phone1, Email_addr from Customer where 1=1";

         if (!String.IsNullOrEmpty(txtAddress.Text))
         {
             cmd.Parameters.AddWithValue("@Address1", SqlDbType.NVarChar).Value = "%" + txtAddress.Text + "%";
         }

         if (!String.IsNullOrEmpty(txtFirstName.Text))
         {
             cmd.Parameters.AddWithValue("@FirstName", txtFirstName.Text + "%");
         }

         if (!String.IsNullOrEmpty(txtLastName.Text))
         {
             cmd.Parameters.AddWithValue("@LastName", "%" + txtLastName.Text + "%");
         }

         if (!String.IsNullOrEmpty(txtEmail.Text))
         {
             cmd.Parameters.AddWithValue("@Email", "%" + txtEmail.Text + "%");
         }

         if (!String.IsNullOrEmpty(txtPhone.Text))
         {
             cmd.Parameters.AddWithValue("@Phone1", "%" + txtPhone.Text + "%");
         }

         conn.Open();

         SqlDataAdapter da = new SqlDataAdapter(cmd);
         DataSet dsCustomer = new DataSet();

         da.Fill(dsCustomer, "Customer");

         DataView dvCustomer = dsCustomer.Tables["Customer"].DefaultView;
         dvCustomer.Sort = ViewState["SortExpression"].ToString();

         gvCustomer.DataSource = dvCustomer;
         gvCustomer.DataBind();
    }
}

2 个答案:

答案 0 :(得分:1)

您必须在SQL中实际包含参数:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.data_list_layout);
        listView = (ListView) findViewById(R.id.list_view);
        listView.setAdapter(listDataAdapter);
        listView.setOnItemClickListener(this);


}

答案 1 :(得分:0)

SQL字符串有时会让人感到困惑。

第一部分SELECT在对数据库的请求结束时执行。

数据库适配器所做的第一件事是输入表(FROM tableName)。

第二件事是WHERE陈述的比较。 在这里,您可以选择数据库需要返回的行。 例如。 WHERE column1 =“someValue”。 你将得到column1为“someValue”的行。

第三个是group byorder by语句。

最后,从数据库为该请求保存的内部行列表(在WHERE之后),您可以SELECT找到您想要的列。 如果你想要所有的colums你只需要*,否则你会给出更多列名甚至“MAX(columName)”,它们会给你那个列中最高的数字(仅限数字列)。

您可以通过两种方式编写SQL字符串代码:

First方法是对WHERE语句进行硬编码。如果参数不是像DateTime这样的复杂类型,则可以接受:

"SELECT * FROM tableName WHERE column1=" + variable;

Second方式是使用参数。这种方式更好,因为SqlCommand对象会将您的参数转换为正确的DbType:

"SELECT * FROM tableName WHERE column1=@paramerter1";
var t = com.CreateParameter();
t.ParameterName = "@parameter1";
t.Value = variable;
com.Parameters.Add(t);

测试sql-strings的好程序是“SqlTryOut”。 谷歌搜索会做。