2011-07-02 9 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文の構文についてはわかりません。私は結果から読んでみたい。 QAの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 

また、読者のアプローチを使用して、変数を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