SQL SELECT с хранимой процедурой и параметрами? - PullRequest
0 голосов
/ 04 декабря 2011

Я писал много веб-сервисов со вставками SQL на основе хранимой процедуры, и я действительно не работал с 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 ]

6 голосов
/ 04 декабря 2011

Здесь вы ошибаетесь:

cmd.ExecuteNonQuery();

Вы выполняете запрос.

Вам нужно ExecuteReader или ExecuteScalar. ExecuteReader используется для набора результатов (несколько строк / столбцов), ExecuteScalar, когда запрос возвращает один результат (он возвращает object, поэтому результат должен быть приведен к правильному типу).

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

Переменная results теперь будет содержать OledbDataReader или значение с результатами SELECT. Вы можете перебрать результаты (для читателя) или скалярное значение (для скаляра).

4 голосов
/ 04 декабря 2011

Поскольку вы используете только одно значение, вы можете использовать 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()); 
        } 
    } 

Если вы хотите вернуть несколько строк, вы можете использовать метод ExecuteReader ().Это возвращает IDataReader, с помощью которого вы можете перечислять результирующий набор строка за строкой.

3 голосов
/ 04 декабря 2011

Вам нужно использовать 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();
    }
}
0 голосов
/ 04 декабря 2011

cmd.executescalar вернет одно значение, например, ваш счет.

Вы будете использовать cmd.executereader при возврате списка записей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...