2016-04-27 91 views
0

当我点击搜索按钮,下面的代码将运行。代码中没有错误,但datagridview仅显示列名。查询是否有错误?VB.NET MYSQL Datagridview为空?

mySqlConn = New MySqlConnection 
    myCommand = New MySqlCommand 
    dt = New DataTable() 
    Try 
     If dt IsNot Nothing Then 
      dt.Dispose() 
     End If 
     If da IsNot Nothing Then 
      da.Dispose() 
     End If 
     If DataGridView1.DataSource IsNot Nothing Then 
      DataGridView1.DataSource = Nothing 
     End If 
     mySqlConn.ConnectionString = connStr 
     myCommand.CommandText = "Select * from createproject Where (FloatNumber = @floatNo OR @floatNo is Null) AND (DeveloperName = @devName OR @devName is Null) AND (DevelopmentType = @devType OR @devType is Null) AND (LotPt = @lotPt OR @lotPt is Null) AND (Mukim = @mukim OR @mukim is Null) AND (Daerah = @daerah OR @daerah is Null) AND (Negeri = @negeri OR @negeri is Null) AND (TempReference = @tempRef OR @tempRef is Null)" 
     myCommand.Connection = mySqlConn 
     mySqlConn.Open() 

     myCommand.Parameters.AddWithValue("@floatNo", TextBox3.Text.Trim()) 
     myCommand.Parameters.AddWithValue("@devName", ComboBox6.Text.Trim()) 
     myCommand.Parameters.AddWithValue("@devType", ComboBox7.Text.Trim()) 
     myCommand.Parameters.AddWithValue("@lotPt", TextBox4.Text.Trim()) 
     myCommand.Parameters.AddWithValue("@mukim", ComboBox8.Text.Trim()) 
     myCommand.Parameters.AddWithValue("@daerah", ComboBox9.Text.Trim()) 
     myCommand.Parameters.AddWithValue("@negeri", ComboBox10.Text.Trim()) 
     myCommand.Parameters.AddWithValue("@tempRef", TextBox6.Text.Trim()) 
     da = New MySqlDataAdapter(myCommand.ToString(), mySqlConn) 
     da.SelectCommand = myCommand 
     da.Fill(dt) 
     DataGridView1.DataSource = dt 
     da.Update(dt) 
    Catch ex As MySqlException 
     MsgBox(ex.ToString()) 
    Finally 
     mySqlConn.Close() 
     mySqlConn.Dispose() 

    End Try 

enter image description here

这是我点击搜索 enter image description here

+0

推断看看在http:// bobby- tables.com/ – William

+0

@William是关于sql注入预防的吗?我已经做对了......? – Student

+0

大概没有符合您的标准的记录。我们不应该真的需要解释这一点,但你应该改变你的查询使用一个条件,然后两个,等等。只要你没有得到你所期望的,你已经找到了问题。 – jmcilhinney

回答

1

后,如果你的意图是可以忽略的标准,如果用户离开一个字段为空,那么你实际上必须在这种情况下,将NULL值传递给查询。就像String.EmptyNothing在VB中不是一回事,所以SQL中的空字符串和NULL不是同一个东西。你将不得不做这样的事情:

Dim sql = <sql> 
       SELECT * 
       FROM MyTable 
       WHERE (@Column1 IS NULL OR Column1 = @Column1) 
       AND (@Column2 IS NULL OR Column2 = @Column2) 
      </sql> 

myCommand.CommandText = sql.Value 

Dim column1 = TextBox1.Text.Trim() 
Dim column2 = TextBox2.Text.Trim() 

With myCommand.Parameters 
    .Add("@Column1", SqlDbType.VarChar).Value = If(column1 = String.Empty, CObj(DBNull.Value), column1) 
    .Add("@Column2", SqlDbType.VarChar).Value = If(column2 = String.Empty, CObj(DBNull.Value), column2) 
End With 

注意,参数是用Add而不是AddWithValue补充说,因为数据类型不能从DBNull.Value

+0

但编译器不断说add被弃用。使用它很好吗? – Student

+0

有一些重载'添加'。具有'String'和'Object'类型参数的重载已被弃用,因为它已被'AddWithValue'取代。尽管我使用的重载参数的类型为'String'和'SqlDbType'。该过载尚未被弃用。 – jmcilhinney

+0

我明白了。你能解释一下SqlDbType和CObj吗?我不太明白那些东西和用途。不能,我只是把一个if语句来检查文本框是否为空然后Textbox.text =“”? – Student