2010-10-05 99 views
46
我有我的代码有问题

:有一次,我在文本字符串中键入的搜索项目参数化查询预计但未提供该参数

Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged 
    list.Items.Clear() 

    cmd.CommandText = "SELECT * FROM borrow where (Department LIKE '%" & TextBox2.Text & "%')" 
    cmd.Connection = con 
    cmd.CommandType = CommandType.Text 
    con.Open() 


    rd = cmd.ExecuteReader() 
    If rd.HasRows = True Then 
     While rd.Read() 

      Dim listview As New ListViewItem 

      listview.Text = rd("ID").ToString 
      listview.SubItems.Add(rd("Department").ToString) 
      listview.SubItems.Add(rd("Purpose").ToString) 
      listview.SubItems.Add(rd("Items_Details").ToString) 
      listview.SubItems.Add(rd("Requested_by").ToString) 
      listview.SubItems.Add(rd("Approved_by").ToString) 
      listview.SubItems.Add(rd("Date").ToString) 
      listview.SubItems.Add(rd("Status").ToString) 
      listview.SubItems.Add(rd("Date_Returned").ToString) 

      list.Items.Add(listview) 

     End While 
    End If 
    con.Close() 

我得到这个错误:

The parameterized query '(@Parameter1 nvarchar(4000))SELECT * FROM borrow where (Departme' expects the parameter '@Parameter1', which was not supplied.

任何人都可以帮我吗?

回答

103

如果传递null值的参数,你会得到这个错误甚至在您添加参数 所以尽量要检查的价值,如果它为null,则使用DBNull.Value

这将工作

cmd.Parameters.Add("@Department", SqlDbType.VarChar) 

If (TextBox2.Text = Nothing) Then 
    cmd.Parameters("@Department").Value = DBNull.Value 
Else 
    cmd.Parameters("@Department").Value = TextBox2.Text 
End If 

这会将空值从对象层转换为数据库可接受的DBNull值。

+17

速记:cmd.Parameters(“@ Department”)。Value =(object)TextBox2.Text ?? DBNull.Value; – 2012-05-18 09:02:42

+0

This works对于.Add。已经折旧了。cmd.Parameters.AddWithValue(“@ Department”,(object)TextBox2.Text ?? DBNull.Value); – 2017-09-14 20:52:38

1

尝试增加parameters这样的 -

cmd.Parameters.Add("@Department", SqlDbType.VarChar) 
cmd.Parameters("@Department").Value = TextBox2.Text 

,改变你的命令文本什么@Abe Miessler确实他是对的,我只是觉得你会找到答案。

+0

为什么我收到可变DepartmentText已经声明?.. – demic0de 2010-10-05 18:25:48

+0

我不知道为什么....但我得到你在这里有一个数据类型的问题......什么感觉......看到'Departmen '我觉得你没有足够的字符alloted ... – Vishal 2010-10-05 18:41:16

+0

嗨我tnx .. ive改变了我的代码,但仍然我得到错误.. cmd.CommandText =“选择*从借位在(部门LIKE'%@ (@ DepartmentText“,SqlDbType.VarChar)cmd.Parameters.AddWithValue(”@ DepartmentText“,TextBox2.Text)错误”参数化查询'(@ Parameter1 nvarchar(4000),@ DepartmentText%')“cmd.Parameters.Add Department varchar(8000),@ Departmen'期望参数'@ Parameter1',它没有提供。 – demic0de 2010-10-05 18:52:41

14

您的网站存在被黑客攻击的严重危险。

阅读上SQL Injectionhow to prevent it in .NET

您所查询的问题是至少您的问题现在。

但是.....

@名不副实的解决方案是接近,但也不能令人信服:

查询改成这样:

cmd.CommandText = "SELECT * FROM borrow where (Department LIKE '%@DepartmentText%')" 

,并添加参数,这种方式(或方法@Misnomer确实):

cmd.Parameters.AddWithValue("@DepartmentText",TextBox2.Text) 

重要的区别是你需要改变你的CommandText。

+0

嗨,我已经tnx .. ive改变了我的代码,但仍然得到错误.. cmd。CommandText =“SELECT * FROM borrow where(Department LIKE'%@ DepartmentText%')” cmd.Parameters.Add(“@ Department”,SqlDbType.VarChar) cmd.Parameters.AddWithValue(“@ DepartmentText”,TextBox2.Text )错误“参数化查询'(@ Parameter1 nvarchar(4000),@ Department varchar(8000),@ Departmen'期望参数'@ Parameter1',它没有提供。” – demic0de 2010-10-05 18:18:04

+0

我怀疑你的错误是从其他地方抛出的您可以发布您的堆栈跟踪吗? – 2010-10-05 18:53:14

+0

也可以使用更新的代码更新您的问题吗? – 2010-10-05 18:53:33

-2
SqlConnection conn = new SqlConnection(connectionString); 

conn.Open(); 
//SelectCustomerById(int x); 
comboBoxEx1.Items.Clear(); 

SqlCommand comm = new SqlCommand("spSelectCustomerByID", conn); 
//comm.Parameters.Add(new SqlParameter("cust_name", cust_name)); 
//comm.CommandText = "spSelectCustomerByID"; 
comm.Parameters.Add(new SqlParameter("cust_id", SqlDbType.Int)); 
comm.CommandType = CommandType.StoredProcedure; 
comm.ExecuteNonQuery(); 

SqlDataAdapter sdap = new SqlDataAdapter(comm); 
DataSet dset = new DataSet(); 
sdap.Fill(dset, "cust_registrations"); 

if (dset.Tables["cust_registrations"].Rows.Count > 0) 
{ 
    comboBoxEx1.Items.Add("cust_registrations").ToString(); 
} 
comboBoxEx1.DataSource = dset; 
comboBoxEx1.DisplayMember = "cust_name"; 
+2

没有解释?这不是一个好的答案。 – 2015-05-13 22:37:04

相关问题