sqlcommand c # метод с использованием sql paramather - PullRequest
1 голос
/ 08 марта 2019

У меня есть этот метод, который у меня есть в базовом классе, который помогает мне выбирать что-либо из дочерних классов, а также сокращать повторение кода.Проблема в том, что когда я вызываю его, я получаю сообщение об ошибке NullReferenceException (и при поиске я обнаруживаю, что команда в методе пуста).Это рассматриваемый метод: таким образом, я уже знаю, как использовать, но другой я не знаю

SqlCommand command = new SqlCommand("select * from Customers where idCustomer=@idCustomer", OpenConnection());
command.Parameters.AddWithValue("@idCustomer", Id);
SqlDataReader reader = command.ExecuteReader();
Customer Onecustomer = null;
if (reader.Read())
{
    Onecustomer = ReadCustomer(reader);
}

protected DataTable ExecuteSelectQuery(String query, params SqlParameter[] sqlParameters)
{
    SqlCommand command = new SqlCommand();
    DataTable dataTable;
    DataSet dataSet = new DataSet();

    try
    {
        command.Connection = OpenConnection();
        command.CommandText = query;
        command.Parameters.AddRange(sqlParameters);
        command.ExecuteNonQuery();
        adapter.SelectCommand = command;
        adapter.Fill(dataSet);
        dataTable = dataSet.Tables[0];
    }
    catch (SqlException e)
    {
        return null;
        throw new Exception("Error :" + e.Message);
    }
    finally
    {
        CloseConnection();
    }
    return dataTable;
}

Вот как я называю это

string author = "Alfred Schmidt";
int id = 1;

//  ExecuteEditQuery("UPDATE Books SET Title =@param1 WHERE idBook =@param2", sqlParameters);
//SqlParameter[] sqlParameters = new SqlParameter[1]
//{
//    new SqlParameter ("@param1",author),
//};

SqlParameter[] myparm = new SqlParameter[1];
myparm[0] = new SqlParameter("@Author", SqlDbType.NVarChar, 200);
myparm[0].Value = author;

String query = @"SELECT * FROM Books  WHERE Author =@Author";
DataTable dt = ExecuteSelectQuery(query, myparm);

for (int i = 0; i < dt.Rows.Count; i++)
{
    Console.WriteLine(dt.Rows.ToString());
}
Console.Write("");

1

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Вот правильная переписка вашего метода.

protected DataTable ExecuteSelectQuery(String query, params SqlParameter[] sqlParameters)
{
    using (SqlCommand command = new SqlCommand())    
        try
        {
            command.CommandText = query;
            command.Parameters.AddRange(sqlParameters);
            command.Connection = OpenConnection();

            DataTable dataTable = new DataTable();
            using (SqlDataAdapter adapter = new SqlDataAdapter(command))
                adapter.Fill(dataTable);
            return dataTable;
        }
        catch (SqlException e)
        {
            return null;
            throw new Exception("Error :" + e.Message);
        }
        finally
        {
            CloseConnection();
        }
}

Обратите внимание, что SqlDataAdapter может Open() и Close() соединение само по себе, если SqlConnection равно Closed когда Fill вызывается.

0 голосов
/ 08 марта 2019

Ваш метод OpenConnection () возвращает объект подключения. Это может привести к ошибке, реализация метода не приводится. Кроме того, adpater не определен в коде, возможно, он также может быть причиной ошибки, если он не инициализирован.

И я хочу сказать несколько слов о вашем коде:

1) У вас есть и ненужная команда. ExecuteNonQuery (); оператор в вашем методе ExecuteSelectQuery.

2) DataAdapter может напрямую заполнять DataTable, вам не нужно использовать DataSet.

...