有人能让我知道我的SQL语句有什么问题以及如何改进它吗?
da = new SqlDataAdapter("SELECT * FROM Guests"+" WHERE Students.name='" +
byNametextBox.Text + "'", MyConn);
答案 0 :(得分:4)
如果只想要其中一个表中的列,则EXISTS谓词的效率略高于JOIN。另外 - 永远不要将字符串注入到这样的SQL语句中 - 你只是要求SQL注入攻击或相关的崩溃错误(是的,我知道它是一个Forms应用程序,但同样的情况也是如此。如果你正在寻找像这样的名字“O'Leary”,你会崩溃的。)
SqlCommand cmd = new SqlCommand("SELECT * FROM Guests WHERE EXISTS (SELECT Id FROM Students WHERE Guests.StudentId = Students.Id And Students.name= @name)", MyConn);
cmd.Parameters.Add("@name", SqlDbType.VarChar, 50).Value = byNametextBox.Text;
SqlDataAdapter adapt = new SqlDataAdapter(cmd);
注意:有些人可能会说“SELECT *”不好,您应该考虑指定单个列名称
答案 1 :(得分:1)
您需要担心SQL注入。简而言之,SQL注入是指用户能够将任意SQL语句放入查询中。要解决此问题,请使用存储过程或参数化SQL查询。参数化SQL查询的示例如下:
SqlConnection conn = null;
SqlDataReader reader = null;
//Connection string goes here
string studentName = byNametextBox.Text;
SqlCommand cmd = new SqlCommand(
"SELECT * FROM Guests "+" WHERE Students.name = @name", conn);
SqlParameter param = new SqlParameter("@name", SqlDbType.NVarChar, 50);
param.Value = studentName;
cmd.Parameters.Add(param);
reader = cmd.ExecuteReader();
//Do stuff with reader here
答案 2 :(得分:0)
SqlDataAdapter("SELECT Guests.* FROM Guests,Students WHERE Guest.StudentId = Student.Id and Students.name='" + byNametextBox.Text + "'", MyConn);`
答案 3 :(得分:0)
您需要内部加入。我认为会是这样的:
SELECT Guests.* FROM Guests INNER JOIN Students ON Students.name = Guests.name WHERE Students.name = '" + byNametextBox.Text + "'"
答案 4 :(得分:-1)
试一试:
"SELECT g.*
FROM Guests g
INNER JOIN Students s ON g.StudentId = s.StudentId
WHERE Students.Name = '" + byNametextBox.Text + '"'
假设两个表相关的字段是StudentId。
请注意不同服务器之间的SQL不一样。这个语句适用于Sql Server,其他人不知道。另外,请注意您在SQL注入攻击时没有保护自己。您应该使用参数执行查询,而不是按照您的方式连接字符串。
这是一个您应该自己了解的简单查询。您可以在Google上搜索教程,但here是一个通用的介绍。