使用参数和放置变量然后转换它有什么区别

时间:2013-08-06 23:07:01

标签: c# asp.net odbc

所以我正在使用odbc从数据库中检索数据。导致问题的我的一个字段是AutoNumber。在我使用的查询中,'“convert.toint64(empid)”',我收到数据类型错配的错误。但是当我使用参数时,它工作得很好。有人能告诉我有什么区别。据我所知,AutoNumber是一个长整数,long int是64,对吗?

这是我的两个问题:

        string cmdText = "SELECT p.projID, p.projName, a.wageperday " +
             "FROM ((projects p INNER JOIN assigns a ON p.projID = a.projname) " +
             "INNER JOIN empos e ON a.employeeID= e.ID) " +
             "WHERE a.employeeID = ?";
        OdbcCommand assignslist = new OdbcCommand(cmdText, _connection);
        assignslist.Parameters.AddWithValue("@empID", empid);
        OdbcDataReader readassigns = assignslist.ExecuteReader();
        GridView1.DataSource = readassigns;
        GridView1.DataBind(); 

(这个工作正常)

        string cmdText = "SELECT p.projID, p.projName, a.wageperday " +
             "FROM ((projects p INNER JOIN assigns a ON p.projID = a.projname) " +
             "INNER JOIN empos e ON a.employeeID= e.ID) " +
             "WHERE a.employeeID = '" + convert.toint64( empid ) + "';
        OdbcCommand assignslist = new OdbcCommand(cmdText, _connection);
        OdbcDataReader readassigns = assignslist.ExecuteReader();
        GridView1.DataSource = readassigns;
        GridView1.DataBind(); 

对于这个,即使我删除了转换,我也会收到错误,我收到错误。

还有一个问题,我完全不理解INNER JOIN,上面的代码来自这里帮助我的用户。我不明白为什么他用“FROM((项目p INNER JOIN指定一个ON p.projID = a.projname)”+                  “INNER JOIN empos e on a.employeeID = e.ID”“

两个支架 - 我指的是支架内的支架。如果我想加入第4或第5桌,我是否必须将它放在主支架旁边的支架内?一个例子将非常感谢!

3 个答案:

答案 0 :(得分:2)

如果a.employeeID是一个数字,则问题是引号以及数字与字符串的串联。

"WHERE a.employeeID = " + convert.toint64(empid).ToString()

但这没有任何意义,因为你有一个字符串可以构建,你可以简单地写

"WHERE a.employeeID = " + empid.ToString();

但总是使用参数化查询。这是正确的方法。

参数化查询允许框架代码以正确的格式传递参数,您不必担心引用值,日期格式和小数分隔符。 (最后但并非最不重要的是,你避免了Sql Injection的任何可能性)

对于问题的第二部分,JOIN用于从两个表中输入togheter数据,当您有多个JOIN时,parenthesys有助于理解表中的分组是如何执行的。首先,来自projectsassigns的数据按照INNER JOIN的规则组合在一起,然后生成的数据集与employee表中的数据一起遵循第二个规则加入。

答案 1 :(得分:1)

在您的第二个查询中,请尝试使用convert.toint64( empid )

,而不是使用empid.ToString()
"WHERE a.employeeID = " + empid.ToString();

您收到的错误是由于您尝试将字符串与整数连接起来的事实。

关于您正在使用的INNER JOIN,括号的使用取决于您使用的数据库。在大多数情况下,您根本不需要括号,可以毫无问题地删除它们,因此您可以将查询重写为:

string cmdText = "SELECT p.projID, p.projName, a.wageperday " +
    "FROM projects p " +
    "INNER JOIN assigns a ON p.projID = a.projname " +
    "INNER JOIN empos e ON a.employeeID = e.ID " +
    "WHERE a.employeeID = " empid.ToString();

答案 2 :(得分:1)

您正在尝试添加字符串和整数,这是不允许的。您必须先将数字转换为字符串,如下所示:

"WHERE a.employeeID = '" + empid.ToString() + "';

但是,使用参数是出于其他原因(最好的习惯,避免SQL注入攻击等)的更好方法。