0

我在访问数据库中有一个表,其中包含 Q1-Easy Q1-Med 和 Q1-Hard 列。对于选定的用户名,我需要计算包含真值的列数。

这个 SQL 语句会起作用吗?还是有更优雅的方式来做到这一点?

string Q1Query = "SELECT COUNT from tbl_Results WHERE ([Q1-Easy] OR [Q1-Med] OR [Q1-Hard] && [Username]) = + selectedUsername + "'";

我只知道 SQL 的基础知识,我正在使用 C# .NET

4

4 回答 4

1

您的查询并不太离题。你想要的是

string Q1Query = "SELECT COUNT(*) from tbl_Results WHERE ([Q1-Easy] = 'Y' OR [Q1-Med] = 'Y' OR [Q1-Hard] = 'Y') && [Username] = '" + selectedUsername + "'";

(假设您的“真实价值”是“Y”。)

话虽如此,将您的 SQL 嵌入 C# 并通过字符串连接构建它是一个坏主意。它允许恶意输入的可能性,例如selectedUsername包含值"Bobby'; DROP TABLE Students"。更好的做法是参数化查询并让数据库代码放入用户名,或者更好的是,将整个查询放入存储过程中。

为避免 SQL 注入漏洞,您需要将查询更改为以下内容:

string Q1Query = "SELECT COUNT(*) from tbl_Results WHERE ([Q1-Easy] = 'Y' OR [Q1-Med] = 'Y' OR [Q1-Hard] = 'Y') && [Username] = '@username'";

(注意删除了用户名的串联。)

然后你实际上会用这样的东西运行它:

SqlCommand cmd = new SqlCommand(Q1Query);
cmd.Parameters.Add("@username", selectedUsername);
SqlDataReader reader = cmd.ExecuteReader();
于 2013-05-24T13:58:35.273 回答
1

好的,如果您想计算真实列的数量,您将需要以下内容。请注意,我假设“Y”值表示 true……如果您使用的是位列,则必须稍作更改。我还假设您使用的是 SQL Server,如果不是这种情况,则此语法可能不适合您。

   SELECT 
      CASE Q1-Easy WHEN 'Y' THEN 1 ELSE 0 END + 
      CASE Q1-Med  WHEN 'Y' THEN 1 ELSE 0 END + 
      CASE Q1-Hard WHEN 'Y' THEN 1 ELSE 0 END AS TrueCount
   FROM tbl_Results
   WHERE ([Username] = @username)

对于 MS Access,它将类似于以下内容(未经测试)...

   SELECT 
      IIF([Q1-Easy] = 'Y', 1, 0) + 
      IIF([Q1-Med] = 'Y', 1, 0) +
      IIF([Q1-Hard] = 'Y', 1, 0) AS TrueCount
   FROM tbl_Results
   WHERE ([Username] = @username)
于 2013-05-24T14:29:30.107 回答
0

与您的几乎相同,只是进行了次要但重要的更正:

string Q1Query = "SELECT [UserName], COUNT(*) as ToTalTrueQuestions 
FROM tbl_Results WHERE ([Q1-Easy] OR [Q1-Med] OR [Q1-Hard]) 
AND [Username] = '" +    selectedUsername + "'";

区别首先是我包含与计数相关联的用户名,其次计数有别名,第三您使用括号是错误的我将右括号“ )”放在 [Q1-Hard] 之后而不是 [Username] 之后,第四个我用ANDwhich 是 SQL 而不是&&which 是 C#,最后在 之后有一个单引号"=""= '"应该是正确的。

于 2013-05-24T14:05:39.563 回答
0

查询中的括号错误。这是您想要的形式:

SELECT COUNT(*)
from tbl_Results
WHERE ([Q1-Easy] = 'TRUE' OR [Q1-Med] = 'TRUE' OR [Q1-Hard] = 'TRUE') AND
      ([Username] = + selectedUsername)

我不确定您的数据中如何表示“真实”,因此值可能会有所不同。

于 2013-05-24T13:59:50.287 回答