我正在尝试根据当前用户和当前日期查询数据库。我目前没有从我的查询中得到任何结果,我认为问题在于我在vb.net中对当前日期的格式化
query = "SELECT movie_name from movie2 Where movie_id=(SELECT movie_id from rental where client_username='" & currentUser & "' AND start_date<='" & Format(Now, "yyyy-MM-dd") & "' AND return_date>='" & Format(Now, "yyyy-MM-dd") & "')"
我知道查询的其余部分(除了调用currentUser)是有效的,因为我已经在mySql服务器上测试过了。我以前调用过currentUser,它是通过模块中的一个变量保存的,没有任何麻烦,所以我觉得问题出在我的日期上。我不知道如何格式化当前日期,以便mySql能够正确接收它?我也试过代码
query = "SELECT movie_name from movie2 Where movie_id=(SELECT movie_id from rental where client_username='" & currentUser & "' AND start_date<='" & DateTime.Now.ToString("yyyy-MM-dd") & "' AND return_date>='" & DateTime.Now.ToString("yyyy-MM-dd") & "')"
没有成功。如有任何帮助,我们将不胜感激!谢谢,阿兰。
问题是在构建sql命令时使用字符串串联的常见错误做法
补救办法总是一样的。参数化查询。
query = "SELECT movie_name from movie2 Where movie_id=" & _
"(SELECT movie_id from rental where client_username=@name" &_
" AND start_date<=@date AND return_date>=@date"
Using cmd = new MySqlCommand(query, connection)
cmd.Parameters.Add("@name", MySqlDbType.VarChar).Value = currentUser
cmd.Parameters.Add("@date", MySqlDbType.DateTime).Value = DateTime.Now
Using reader = cmd.ExecuteReader()
.... now read your data ....
End Using
End Using
使用字符串串联时,您很容易受到Sql注入的攻击,当强制将小数或日期转换为字符串时,您容易成为错误转换的受害者。参数避免所有
编辑:使用MySqlDataAdapter
query = "SELECT movie_name from movie2 Where movie_id=" & _
"(SELECT movie_id from rental where client_username=@name" &_
" AND start_date<=@date AND return_date>=@date"
Using cmd = new MySqlCommand(query, connection)
cmd.Parameters.Add("@name", MySqlDbType.VarChar).Value = currentUser
cmd.Parameters.Add("@date", MySqlDbType.DateTime).Value = DateTime.Now
Using adapter = new MySqlDataAdapter(cmd)
Dim dt = new DataTable()
adapter.Fill(dt)
End Using
End Using