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

C# 使用一个参数和仅仅放置一个变量然后转换它有什么区别,c#,asp.net,odbc,C#,Asp.net,Odbc,所以我使用odbc从数据库中检索数据。导致问题的字段之一是“自动编号”。在我使用“convert.toint64(empid)”的查询中,我得到一个数据类型missmatch的错误。但当我使用参数时,它工作得非常好。有人能告诉我有什么不同吗。据我所知,AutoNumber是一个长整数,long int是64,对吗 以下是我的两个问题: string cmdText = "SELECT p.projID, p.projName, a.wageperday " +

所以我使用odbc从数据库中检索数据。导致问题的字段之一是“自动编号”。在我使用“convert.toint64(empid)”的查询中,我得到一个数据类型missmatch的错误。但当我使用参数时,它工作得非常好。有人能告诉我有什么不同吗。据我所知,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(); 
(这个很好用)

对于这一个,我得到一个错误,即使我删除了转换,我得到一个错误

还有一个问题,我不完全理解InternalJoin,上面的代码来自一位帮助我的用户。我不明白他为什么使用“FROM((projects p internal JOIN赋值a ON p.projID=a.projname)”+ “在a.employeeID=e.ID上的内部连接empos e)”


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

在第二个查询中,不要使用
convert.toint64(empid)
尝试使用
empid.ToString()

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

对于您正在使用的
内部联接
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();

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

"WHERE a.employeeID = " + convert.toint64(empid).ToString()
但这毫无意义,因为您需要构建一个字符串,所以您可以简单地编写

"WHERE a.employeeID = " + empid.ToString();
但是,请始终使用参数化查询。这是正确的方法

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


对于问题的第二部分,用于将两个表中的数据放在一起,当有多个连接时,括号有助于理解如何执行表中的分组。首先,来自
项目
分配
的数据按照内部联接的规则分组在一起,然后生成的数据集按照第二个联接的规则与来自
员工
表的数据联接。

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

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

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

再次感谢Steve!你能帮我了解一下内部连接吗?答案中的链接应该是学习连接的一个很好的起点。非常感谢。这是有道理的!
"WHERE a.employeeID = " + empid.ToString();
"WHERE a.employeeID = '" + empid.ToString() + "';