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

本文关键字:一个 转换 什么 然后 区别 参数 变量 | 更新日期: 2023-09-27 18:26:49

所以我使用odbc从数据库中检索数据。导致问题的一个字段是"自动编号"。在我的查询中,当我使用"convert.toint64(empid)"时,我会得到一个数据类型不匹配的错误。但当我使用parameter时,它运行得很好。有人能告诉我有什么不同吗。据我所知,AutoNumber是一个长整数,长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 employeeID=e.ID)"

两个括号——我指的是括号里的一个括号。如果我想加入第四张或第五张桌子,我必须把它放在主支架之外的支架里吗?举个例子不胜感激!

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

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

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

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

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

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

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

对于问题的第二部分,JOIN用于放置两个表中的数据,当您有多个JOIN时,括号有助于了解如何执行表中的分组。首先,根据INNER JOIN的规则将来自projectsassigns的数据分组在一起,然后根据第二次联接的规则将所得数据集与来自employee表的数据联接。

在第二个查询中,不要使用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();

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

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

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

相关文章: