2010-10-05 35 views
46

Tôi đang gặp một vấn đề với mã của tôi:Truy vấn tham số hy vọng các tham số được không được cung cấp

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

Khi tôi gõ vào chuỗi trong textbox để tìm kiếm một mục tôi nhận được lỗi này:

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

Có ai giúp tôi không?

Trả lời

103

Nếu bạn vượt qua giá trị null cho tham số, bạn sẽ nhận được lỗi này ngay cả sau khi bạn thêm tham số vì vậy hãy thử để kiểm tra giá trị và nếu nó null thì sử dụng DBNull.Value

này sẽ làm việc

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 

Điều này sẽ chuyển đổi các giá trị null từ lớp đối tượng thành giá trị DBNull được chấp nhận cho cơ sở dữ liệu.

+17

Viết tắt: cmd.Parameters ("@ Department"). Value = (object) TextBox2.Text ?? DBNull.Value; –

+0

Tác phẩm này Đối với tôi .Thêm đã được khấu hao.cmd.Parameters.AddWithValue ("@ Department", (đối tượng) TextBox2.Text ?? DBNull.Value); –

1

Hãy thử thêm parameters như thế này -

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

và thay đổi văn bản lệnh của bạn với những gì @Abe Miessler làm anh là đúng tôi chỉ nghĩ rằng bạn sẽ tìm ra cách.

+0

tại sao tôi nhận được biến OfficeText đã được khai báo? .. – demic0de

+0

Tôi không biết tại sao .... nhưng tôi có cảm giác rằng bạn có vấn đề về dữ liệu ở đây ... hoặc điều gì đó ... nhìn thấy 'Departmen' 'tôi cảm thấy bạn không có đủ ký tự được phân bổ hoặc một cái gì đó ... – Vishal

+0

hi i've tnx .. ive thay đổi mã của tôi nhưng vẫn im nhận được lỗi .. cmd.CommandText =" SELECT * FROM mượn ở đâu (Sở LIKE '% @ DepartmentText% ') "cmd.Parameters.Add (" @ DepartmentText ", SqlDbType.VarChar) cmd.Parameters.AddWithValue (" @ DepartmentText ", TextBox2.Text) lỗi" Truy vấn tham số hóa "(@ Parameter1 nvarchar (4000), @ Cục varchar (8000), @ Departmen 'dự kiến ​​tham số' @ Parameter1 ', không được cung cấp. – demic0de

14

Trang web của bạn có nguy cơ bị tấn công nghiêm trọng.

Đọc trên SQL Injectionhow to prevent it in .NET

vấn đề truy vấn của bạn là tối thiểu các mối quan tâm của bạn ngay bây giờ.

Nhưng .....

@ giải pháp nhầm lẫn là gần nhưng không hoàn toàn có:

Thay đổi truy vấn của bạn như thế này:

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

và thêm các thông số theo cách này (hoặc đường mà @Misnomer làm):

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

Sự khác biệt quan trọng là bạn cần phải thay đổi CommandText của bạn.

+0

hi i've tnx .. ive thay đổi mã của tôi nhưng vẫn im nhận được lỗi .. cmd.CommandText = "SELECT * FROM mượn nơi (Sở LIKE '% @ DepartmentText%')" cmd.Parameters.Add ("@ Department", SqlDbType.VarChar) cmd.Parameters.AddWithValue ("@ DepartmentText", TextBox2.Text) "Truy vấn tham số hóa" (@ Parameter1 nvarchar (4000), @ Varchar (8000), @ Departmen 'hy vọng tham số' @ Parameter1 ', không được cung cấp. " – demic0de

+0

Tôi nghi ngờ lỗi của bạn đang bị ném từ nơi khác Bạn cũng có thể đăng bài theo dõi ngăn xếp của mình không? –

+0

Bạn cũng có thể cập nhật câu hỏi của mình bằng mã được cập nhật? –

-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

Không giải thích? Đây không phải là câu trả lời hay. –

Các vấn đề liên quan