Member 13522501 Ответов: 3

Ошибка при вычислении количества строк (для таблицы)


привет

я пишу веб-сервис.
в файле cs я пишу нижеприведенные строки. после запуска он возвращает 1.
но в моей таблице есть много строк.


SqlConnection con = new SqlConnection("Data Source=mypc;Initial Catalog=myDB;User ID=admin;Password=admin123");
    SqlCommand cmd;
    SqlDataReader dr;
    DatatableToJson dts = new DatatableToJson();
    long id = 0;
    string Table_Name = "";


    [WebMethod]
    public void OnlineUsers_Counts()
    {
        DataTable dt = new DataTable();
        SqlCommand myCMD = new SqlCommand();
        myCMD.CommandText = "select count(*) from OnlineUsers  ";  
        
        con.Close();
        con.Open();

        myCMD.Connection = con;
        dr = myCMD.ExecuteReader();

        dt.Clear();
        dt.Load(dr);
                
        if (dt.Rows.Count > 0)
        {
            Context.Response.Write(dt.Rows.Count.ToString());
        }


спасибо

Что я уже пробовал:

я ничего не мог сделать для решения этих проблем.


помощь

3 Ответов

Рейтинг:
1

OriginalGriff

Хм. Вы получаете 1, не так ли?

Это потому что

SELECT COUNT(*) FROM MyTable
Возвращает одну строку с одним полем in, которое содержит количество строк в исходной таблице...

Я бы использовал ExecuteScalar, который возвращает одно значение - количество строк - вместо ExecuteReader.


Рейтинг:
1

MadMyche

select count(*) from OnlineUsers
Метод ExecuteReader() будет извлекать эти данные в виде таблицы. Там будет одна строка с одним полем.

Что вы можете сделать, так это изменить метод; используйте ExecuteScalar(); Необходимый код также на несколько строк короче.
        int RowCount = myCMD.ExecuteScalar();
        Context.Response.Write(RowCount);
//      dr = myCMD.ExecuteReader();
//
//      dt.Clear();
//      dt.Load(dr);
                
//      if (dt.Rows.Count > 0)
//      {
//            Context.Response.Write(dt.Rows.Count.ToString());
//       }


Рейтинг:
0

Vincent Maverick Durano

Если я могу добавить к предоставленному решению, я настоятельно рекомендую вам сделать следующее:

(1) всегда помещайте конфигурацию уровня приложения, такую как строка подключения, в свой web.config файл, чтобы вам не пришлось перекомпилировать и повторно развертывать свой код при изменении строки подключения.

(2) оберните объекты, которые потребляют ресурсы, такие как SqlConenction и SqlCommand в блок using таким образом, объекты будут автоматически утилизированы после их использования. Вот краткий пример:

[WebMethod]
public void OnlineUsers_Counts()
{
	int rowCount = 0;
        using(SqlConnection connection = new SqlConnection("YOUR CONNECTION STRING HERE")){
           using(SqlCommand cmd = new SqlCommand("SELECT count(*) FROM OnlineUsers" , connection)){
               	 cmd.CommandType = CommandType.Text;
                 rowCount = cmd.ExecuteScalar();
        	
        }
        
	Context.Response.Write(rowCount);
}