aksimoN Ответов: 2

Как изменить executescalar(); для получения дополнительных результатов выбора в одной строке


I have a method which returns value from database to a string. Now i have a problem because there is more than one result of the SELECT and I need to change ExecuteScalar(); to something else. I want to have these SELECT results in one string.


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

string GetModule (string aplS) 
            {
                SqlConnection maConn = new SqlConnection("Data Source=xxx;Initial 
                Catalog=xx;User ID=xx;Password=xxx");
                string query = "select distinct mod from MOD_slow where 
                 aplS='"+aplS+"'";
                System.Data.SqlClient.SqlCommand cmd = new 
                System.Data.SqlClient.SqlCommand(query, maConn);
                System.Data.DataTable dt = new System.Data.DataTable();
                macierzConn.Open();                
                var SavedString = (string)cmd.ExecuteScalar();
                SavedString= SavedString.TrimEnd();
                macierzConn.Close();
                return SavedString;                            

            }

Maciej Los

Можете ли вы быть более конкретным и предоставить более подробную информацию?

2 Ответов

Рейтинг:
7

Garth J Lancaster

Ну, 1-е, посмотрите на эту ужасную, опасную для SQL - пожалуйста, не делай этого - пожалуйста, используйте переутверждаются в SQL

SqlCommand cmd = new SqlCommand(
    "select field from table where value = @Value", conn);

    SqlParameter param  = new SqlParameter();
    param.ParameterName = "@Value";
    param.Value         = *********;  // your actual value here 

    cmd.Parameters.Add(param);
    reader = cmd.ExecuteReader();

    while(reader.Read())
    {
        // Do something with the query result here 
        string colValue = reader["Column/Field Name"].ToString();
    }


Во-вторых, вы должны использовать "блок использования" там, где это возможно, и забыть о руководстве
macierzConn.Close();

так :-
using SqlConnection maConn = new SqlConnection("Data Source=xxx;Initial Catalog=xx;User ID=xx;Password=xxx")
{
    using SqlCommand cmd = new SqlCommand(
        "select field from table where value = @Value", conn);
    {
        SqlParameter param  = new SqlParameter();
        param.ParameterName = "@Value";
        param.Value         = *********;  // your actual value here 

        cmd.Parameters.Add(param);
    
        using SqlDataReader reader = cmd.ExecuteReader() 
        {
            while(reader.Read())
            {
                // Do something with the query result here 
                string colValue = reader["Column/Field Name"].ToString();
            }
        } // Using SqlDataReader 
    } // Using SqlCommand 
} // SqlConnection 


Это довольно грубо и требует уборки, но это "более правильный" способ

Вы на самом деле не сказали, что вы имеете в виду под
Цитата:
результаты в одной строке.
может быть, вы используете StringBuilder и добавить в строку, в то время как(читатель.Прочитать() цикл


aksimoN

Я попробовал этот способ, но моя главная проблема заключается в том, что когда я помещаю его в метод и пытаюсь вернуть строку colValue, я получаю :"CS0103 имя 'colValue' не существует в текущем контексте"


string GetModule2(string aplSymbol) //szukanie modułu
            {
                using SqlConnection maConn = new SqlConnection("Data Source=xxx;Initial Catalog=xx;User ID=xx;Password=xxx");
                {
                using SqlCommand cmd = new SqlCommand("select field from table where value = @Value", maConn);
                {
                    SqlParameter param = new SqlParameter();
                    param.ParameterName = "@Value";
                    param.Value = aplSymbol;  // your actual value here 

                    cmd.Parameters.Add(param);

                        using SqlDataReader reader = cmd.ExecuteReader();
                    {
                        while (reader.Read())
                        {
                         string colValue = reader["Column/Field Name"].ToString();
                        }
                    } 
                } 
            } 
            return colValue;
        }

Garth J Lancaster

Я действительно сказал, что это было грубо и требовало немного больше работы, мы не должны делать всю вашу работу за вас ... colValue-это бит, который вам нужно заполнить, так как вы действительно не объяснили "результаты в одной строке".. вы могли бы, например

using SqlCommand cmd = new SqlCommand("select field from table where value = @Value", maConn);                {                    
  SqlParameter param = new SqlParameter();                    
  param.ParameterName = "@Value";                    
  param.Value = aplSymbol;  // your actual value here                     
  cmd.Parameters.Add(param);
                        
  using SqlDataReader reader = cmd.ExecuteReader();                    
  {                        
    StringBuilder colStr = new StringBuilder("");                        
    while (reader.Read())                        
    {                         
      string colValue = reader["Column/Field Name"].ToString();                         
      colStr.Append(colValue);                         
      colStr.Append(",");                        
    }                        
    return colStr.ToString();                    
  }                 
}

чтобы получить разделенный запятыми список значений в виде строки, а затем удалить последний
return colValue;
показано в основном блоке кода.

Однако это зависит от вас, чтобы адекватно определить проблему и то, что вам нужно

Рейтинг:
1

OriginalGriff

Либо используйте ExecuteReader:

using (SqlConnection con = new SqlConnection(strConnect))
    {
    con.Open();
    using (SqlCommand cmd = new SqlCommand("SELECT Age, Description FROM myTable WHERE ID = @ID", con))
        {
        cmd.Parameters.AddWithValue("@ID", myTextBox.Text);
        using (SqlDataReader reader = cmd.ExecuteReader())
            {
            while (reader.Read())
                {
                int age = (int) reader["Age"];
                string desc = (string) reader["Description"];
                Console.WriteLine($"{age}\n{desc}");
                }
            }
        }
    }

Или SqlDataAdapter:
using (SqlConnection con = new SqlConnection(strConnect))
    {
    con.Open();
    using (SqlDataAdapter da = new SqlDataAdapter("SELECT Age, Description FROM myTable WHERE ID = @ID", con))
        {
        da.SelectCommand.Parameters.AddWithValue("@ID", myTextBox.Text);
        DataTable dt = new DataTable();
        da.Fill(dt);
        myDataGridView.DataSource = dt;
        }
    }