参数化查询需要未提供的参数

时间:2010-10-05 17:05:45

标签: sql sql-server vb.net

我的代码出现问题:

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()

输入文本框中的字符串以搜索项目后,我收到此错误:

  

参数化查询'(@ Parameter1 nvarchar(4000))SELECT * FROM   借用where(Departme'期望参数'@ Parameter1',这是   没提供。

任何人都可以帮助我吗?

6 个答案:

答案 0 :(得分:129)

如果将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值。

答案 1 :(得分:16)

您的网站面临遭受黑客攻击的严重危险。

阅读SQL Injectionhow to prevent it in .NET

您的查询问题是您现在最不关心的问题。

但是.....

@ Misnomer的解决方案很接近,但并不完全存在:

将您的查询更改为:

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

并以这种方式添加参数(或@Misnomer的方式):

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

重要的区别是您需要更改CommandText。

答案 2 :(得分:1)

尝试像这样添加parameters -

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

并将你的命令文本更改为@Abe Miessler他是对的,我以为你会想出来的。

答案 3 :(得分:1)

建立并简化ravidev' answer

VB.NET的简写是

cmd.Parameters.AddWithValue("@Department", IF(TextBox2.Text, DBNull.Value))

C#简写是

cmd.Parameters.AddWithValue("@Department", TextBox2.Text ?? DBNull.Value)

答案 4 :(得分:0)

如果要从DataGridView控件写入数据库,请确保没有空行。将“允许用户添加行”设置为false;它会截断不必要的最后一个空行。

答案 5 :(得分:-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";