帮我修复这个SQL语句?

时间:2009-06-16 16:35:08

标签: c# sql-server

有人能让我知道我的SQL语句有什么问题以及如何改进它吗?

da = new SqlDataAdapter("SELECT * FROM Guests"+" WHERE Students.name='" + 
   byNametextBox.Text + "'", MyConn);

5 个答案:

答案 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是一个通用的介绍。