3

所以我正在使用 odbc 从数据库中检索数据。导致问题的我的一个领域是自动编号。在我使用“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((projects p INNER JOIN assigns a ON p.projID = a.projname)”+“INNER JOIN empos e ON a.employeeID= e.ID)”

两个括号——我的意思是括号内的括号。如果我想加入第 4 或第 5 桌,我必须将它放在主支架之外的支架内吗?一个例子将不胜感激!

4

3 回答 3

2

如果 a.employeeID 是一个数字,那么您的问题是引号和数字与字符串的连接。

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

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

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

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

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

对于您问题的第二部分,JOIN用于将两个表中的数据放在一起,当您有多个 JOIN 时,括号有助于了解表中的分组是如何执行的。首先,来自projects和的数据assigns按照 INNER JOIN 的规则组合在一起,然后按照第二次连接的规则将结果集与表中的数据连接起来employee

于 2013-08-06T23:11:43.873 回答
1

在您的第二个查询中,而不是使用convert.toint64( empid )try using empid.ToString()

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

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

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

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();
于 2013-08-06T23:10:57.810 回答
1

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

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

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

于 2013-08-06T23:12:39.937 回答