使用sql paramather的sqlcommand c#方法

问题描述 投票:1回答:2

我有这个方法,我在基类中帮助我从子类中选择任何东西,并减少代码重复。问题是,当我调用它时,我得到一个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

c# sqlcommand mysql-parameter
2个回答
0
投票

您的OpenConnection()方法是否返回连接对象。它可能会出错,没有给出方法的实现。此外,代码中未定义adpater,如果未初始化,也可能是错误原因。

我想说几句关于你的代码:

1)你有和不必要的command.ExecuteNonQuery();您的ExecuteSelectQuery方法中的语句。

2)DataAdapter可以直接填充DataTable,您不必使用DataSet。


0
投票

这是对您的方法的正确重写。

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()连接本身,如果SqlConnectionClosed被称为Fill

© www.soinside.com 2019 - 2024. All rights reserved.