SQL SELECT与存储过程和参数?

时间:2011-12-04 19:00:08

标签: c# sql web-services sql-server-2008 web

我一直在编写大量基于存储过程的SQL插入的Web服务,而且我还没有真正使用任何SELECTS。

我想到的SELECT非常简单。

SELECT COUNT(AD_SID) As ReturnCount FROM AD_Authorization
WHERE AD_SID = @userSID

但是,根据我当前的INSERT代码,我无法弄清楚如何将其变为SELECT并返回ReturnCount的值...你能帮忙吗?这是我的INSERT代码:

string ConnString = "Data Source=Removed";
string SqlString = "spInsertProgress";

using (OleDbConnection conn = new OleDbConnection(ConnString))
{
   using (OleDbCommand cmd = new OleDbCommand(SqlString, conn))
   {
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.Parameters.AddWithValue("attachment_guid", smGuid.ToString());
      cmd.Parameters.AddWithValue("attachment_percentcomplete", fileProgress);
      conn.Open();
      cmd.ExecuteNonQuery();
      conn.Close();
   }
}

4 个答案:

答案 0 :(得分:6)

这是你出错的地方:

cmd.ExecuteNonQuery();

正在执行查询。

您需要ExecuteReaderExecuteScalarExecuteReader用于结果集(多行/列),ExecuteScalar当查询返回单个结果时(它返回object),因此需要将结果强制转换为正确的类型)。

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

results变量现在将包含OledbDataReader或包含SELECT结果的值。您可以迭代结果(对于读者)或标量值(对于标量)。

答案 1 :(得分:4)

由于您只使用单个值,因此可以使用cmd.ExecuteScalar();

完整的例子如下:

    string ConnString = "Data Source=Removed"; 
    string userSid = "SomeSid";
    string SqlString = "SELECT COUNT(AD_SID) As ReturnCount FROM AD_Authorization WHERE AD_SID = @userSID;"; 
    int returnCount = 0;
    using (OleDbConnection conn = new OleDbConnection(ConnString)) 
    { 
        using (OleDbCommand cmd = new OleDbCommand(SqlString, conn)) 
        { 
            cmd.CommandType = CommandType.Text; 
            cmd.Parameters.AddWithValue("@userSID", userSid); 
            conn.Open(); 
            returnCount = Convert.ToInt32(cmd.ExecuteScalar()); 
        } 
    } 

如果要返回MULTIPLE行,可以使用ExecuteReader()方法。这将返回一个IDataReader,您可以通过它逐行枚举结果集。

答案 2 :(得分:3)

您需要使用ExecuteScalar代替ExecuteNonQuery

String query = "SELECT COUNT(AD_SID) As ReturnCount FROM AD_Authorization WHERE AD_SID = @userSID ";
using (OleDbConnection conn = new OleDbConnection(ConnString)) {
    using (OleDbCommand cmd = new OleDbCommand(query, conn))
    {
        cmd.Parameters.AddWithValue("userSID", userSID.ToString());
        conn.Open();
        int returnCount = (Int32) cmd.ExecuteScalar();
        conn.Close();
    }
}

答案 3 :(得分:0)

cmd.executescalar将返回单个值,例如您的计数。

当您返回记录列表时,您将使用cmd.executereader