2011-07-02 51 views
0
public void GetUsersDetails(Guid i) 
{ 
    StringBuilder sb = new StringBuilder(); 
    sb.Append("DECLARE @NumberOfThreadsByOneUser smallint;"); 
    sb.Append(" SET=(SELECT COUNT(t.threadID)"); 
    sb.Append(" FROM Threads AS t"); 
    sb.Append(" INNER JOIN Users AS u ON u.UsersID=t.UsersID"); 
    sb.Append(" WHERE [email protected])"); 

    string myConnectionString = AllQuestionsPresented.connectionString; 
    using (SqlConnection conn = new SqlConnection()) 
    { 
     SqlCommand cmd = new SqlCommand(sb.ToString(), conn); 
     cmd.Parameters.Add("UserID", SqlDbType.UniqueIdentifier).Value = i; 
     SqlDataReader dr = cmd.ExecuteReader(); 


dr.Read(); 
    QA = (Int32.TryParse(dr["NumberOfThreadsByOneUser"].ToString(), out result3)) ? int.Parse(dr["Replies"].ToString()) : 0; 
    } 
} 

我写了一条SQL语句,我想得到的是用户提交的线程数。所以我宣布了一个smallint变量。但我不确定我的sql语句的语法。我想从结果中读取。质量保证INT属性应该收到计数..SQL Count()函数。并设置变量

回答

4

使用select而不是set分配基于查询的变量:

sb.Append(" SELECT @NumberOfThreadsByOneUser = (SELECT COUNT(t.threadID)"); 

要使用的输出变量,不要在SQL声明,但通过它:

cmd.Parameters.Add("@NumberOfThreadsByOneUser").ParameterDirection = 
    ParameterDirection.InputOutput; 

然后执行此命令后,你可以找回:

var result = cmd.Parameters("@NumberOfThreadsByOneUser").Value 

或者,使用reader方法,不要在SQL中声明变量,也不要将它作为参数传递。

sb.Append(" SELECT COUNT(t.threadID) as ThreadCount"); 
.... 
sb.Append(" WHERE [email protected]"); // <-- no closing) 

读它喜欢:

var QA = (int) cmd.ExecuteScalar(); 

或者:

var read = cmd.ExecuteReader(); 
read.Read(); // <-- Gotta move to the first row 
var QA = (int) read["ThreadCount"]; // <-- or whatever your column alias is