从where子句中提取count

时间:2015-03-17 03:41:50

标签: c# sql

我有一张电影评论表:

MovieID  UserID Rating

72        64817   5
238       4984    4
167       48176   2
37        19841   1
122       987981  2
48      and so on....
129
143
27
177
47
201
220
12
247

如果我指定了特定的movieID,我知道如何显示评定该电影的所有用户ID及其评级。

我的问题:如果没有任何用户提交评论,我该如何显示这样的消息?如果没有评论,我该如何捕捉这个特征?我尝试了很多东西(在C#中使用GUI):

sql = string.Format("SELECT COUNT(1) AS num 
                     FROM Reviews 
                     WHERE MovieID = '{0}'", textBox1.Text);

            cmd = new SqlCommand();
            cmd.Connection = db;
            cmd.CommandText = sql;

object result = cmd.ExecuteScalar(); 
int numReviews = System.Convert.ToInt32(result);

    if (numReviews == 0)
    {
    MessageBox.Show("No reviews");
    }
        else
        {
          //I display them. Got this part
         }

如果结果应该是一个数字(count(1)),为什么我不能分配一个整数变量并测试它?

当我调试此代码时,出现错误异常:

转换varchar值时转换失败' NewMovieNoReview'数据类型int。

在这一行

 result = cmd.ExecuteScalar(); 

更新:傻错!!打印字符串中的内容后,MovieID = NewMovieNoReview而不是ID!感谢Erik"在调用String.Format()后,检查sql中的内容"! 已解决

1 个答案:

答案 0 :(得分:2)

错误

  

')附近的语法错误。

是SQL抱怨SQL命令的语法。

尝试

SELECT COUNT(1) AS num FROM Reviews WHERE MovieID = {0}

注意:如果MovieID是整数,则{0}附近没有单引号。

  

转换varchar值时转换失败' NewMovieNoReview'数据类型int。

您没有收到int结果,因为执行SQL语句时出错。

注:

您应该使用parameterized query,而不是信任textBox1.Text中的任何输入。否则,普通用户可以进入该文本框;DELETE TABLE Reviews

http://xkcd.com/327/