Подключение к базе данных в отдельном методе моего SqlCommand

У меня есть форма, которая проверяет, есть ли значения в базе данных, прежде чем добавлять их. Каждое поле находится в отдельной таблице, и чтобы сохранить все в чистоте, у меня есть checkExists метод для каждого поля. Есть ли способ иметь отдельный метод, который подключается к базе данных, чтобы мне не пришлось подключаться в каждом методе поля?

Я хотел бы сделать что-то вроде этого, чтобы мой код был менее грязным:

public void SetConnection()
{
    SqlConnection myConnection = 
        new SqlConnection("user id=[username];" +
        "password=[password];" +
        "server=[server];" +
        "database=[db_name];");

    try
    {
        myConnection.Open();
    }
    catch(Exception e)
    {
        Console.WriteLine("Unable to Connect");
    } 
}

public Boolean CheckData_Company(string[] items)
{
    Class_DB set_conn = new Class_DB();

    try
    {
        set_conn.SetConnection();
    }
    catch(Exception e)
    {
         Console.WriteLine(e.ToString());
    }

    //check that item does not already exist
    string query_string = "SELECT * FROM CR_Company WHERE ([CompanyName] = @companyName";

    SqlCommand check_Company = new SqlCommand(query_string, set_conn);
    check_Company.Parameters.AddWithValue("@CompanyName", items[0]);
    int CompanyExist = (int)check_Company.ExecuteScalar();

    if(CompanyExist > 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

Но я получаю

локальная переменная set_conn
Аргумент 2: невозможно преобразовать из Class_DB в System.Data.SqlClient.SqlConnection

Я понимаю ошибку, так что я могу сделать, чтобы вернуть правильное значение, или я должен установить соединение в моем CheckData_Comany() метод?

1 ответ

Решение

Ваш метод SetConnection должен возвращаться SqlConnection назад как:

public SqlConnection SetConnection()
{

    SqlConnection myConnection = new SqlConnection("user id=[username];" +
                                            "password=[password];" +
                                            "server=[server];" +
                                            "database=[db_name];");
    try
    {
        myConnection.Open();
    }
    catch(Exception e)
    {
        Console.WriteLine("Unable to Connect");
    }

    return myConnection;

}

и тогда вы можете получить что-то вроде:

SqlConnection connection = set_conn.SetConnection();

а затем передать его в SqlCommand конструктор как параметр:

SqlCommand check_Company = new SqlCommand(query_string, connection);

Ваша полная реализация метода станет:

public Boolean CheckData_Company(string[] items)
{
    bool Exists = false;
    Class_DB set_conn = new Class_DB();
    SqlConnection connection = null;
    try
    {
        connection = set_conn.SetConnection();

        //check that item does not already exist
        string query_string = "SELECT * FROM CR_Company WHERE ([CompanyName] = @companyName";
        SqlCommand check_Company = new SqlCommand(query_string, set_conn);
        check_Company.Parameters.AddWithValue("@CompanyName", items[0]);
        int CompanyExist = (int)check_Company.ExecuteScalar();

        if(CompanyExist > 0)
            Exists =  true;


     }
     catch(Exception e)
     {
        Console.WriteLine(e.ToString());
     }
     finally
     {
        connection.Close();
     }

    return Exists;
 }

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

Другие вопросы по тегам