Как сделать DataReader для глобального использования - PullRequest
0 голосов

У меня есть этот код в моем классе SQL Connect.

public class SqlConnect
{
    public string connectionString = ConfigurationManager.ConnectionStrings["cn"].ConnectionString;
    private SqlConnection con;
    public SqlCommand cmd;
    private SqlDataAdapter sda;
    private DataTable dt;
    private SqlDataReader sdr;

    public SqlConnect()
    {
        con = new SqlConnection(connectionString);
        con.Open();
    }
    public void SqlQuery(string queryTxt)
    {
        cmd = new SqlCommand(queryTxt, con);
    }
    public DataTable QueryEx()
    {
        sda = new SqlDataAdapter(cmd);
        dt = new DataTable();
        sda.Fill(dt);
        con.Close();
        return dt;

    }
    public void NonQueryEx()
    {
        cmd.ExecuteNonQuery();
        con.Close();
    }
    public void Reader()
    {           
       sdr = cmd.ExecuteReader();
        while(sdr.Read())
        {
            for (int i = 0; i < sdr.FieldCount; i++) ;

        }
        return;
    }

Теперь у меня в кнопке есть этот код. У меня ошибка, из-за которой я не могу преобразовать Void в Object.

        con = new SqlConnect();
        con.SqlQuery("Select Department from Salary");
        cboDept.Items.Add(con.Reader());

У меня вопрос, как я могу выполнить этот запуск? когда я использую публикуемый c datatable QueryEx , я могу только получить имя столбца в поле со списком (только имя столбца). Я ищу здесь, но я не могу найти никакого решения. Как заставить этот код работать?

1 Ответ

0 голосов
/ 03 мая 2020

Вы ищете свойства DisplayMember и ValueMember.

Кроме того, обычно плохая практика - пытаться управлять своим соединением, как это, поскольку это может привести к утечке соединений. В среде WinForms это не так опасно, как в веб-среде, но об этом нужно знать, особенно если у вас много клиентов WinForms, обращающихся к одной и той же базе данных. Если у вас есть исключение, которое выдается в вашем методе NonQueryEx из приведенного выше кода и перехватывается на более высоком уровне, ваш SqlConnection останется открытым.

См .: https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-connection-pooling?redirectedfrom=MSDN

Способ, которым вы хотите выполнять вызовы из вашей базы данных, заключается в том, чтобы обернуть вашу конструкцию объекта SqlConnection в блок using:

Пример:

using (var cn = new SqlConnection(connectionString))
{
   var cmd = new SqlCommand(...);
   cmd.ExecuteNonQuery();
}

Если вы хотите использовать слой абстракции, чтобы уберечь себя от печати, поместите ваш вызов в блок using внутри этого слоя. Это ошибка № 1, которую я вижу с кодом ADO. Net на новых клиентах (иными словами, это невероятно распространенная ошибка, и пусть эта критика вас не обескураживает). ADO. Net управляет связями за кулисами. Открытие и закрытие соединения фактически не завершает соединение с базой данных, оно освобождает его в пул, поэтому следующий вызов .Open или .Close может повторно использовать это же соединение. Удерживание его дольше необходимого означает, что может потребоваться создание новых соединений. Аналогично, нет никакой гарантии, что ваши экземпляры SqlConnect () будут очищены с помощью. Net, поэтому, если у вас есть повторяющееся исключение, перехваченное на более высоком уровне, это может привести к тому, что несколько соединений ожидают освобождения, пока ваш SqlConnect Класс мусора.

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