C# 带有sql参数的SQLC命令方法
我有这个方法,我在基类中有这个方法,它可以帮助我从children类中选择任何东西,还可以减少代码重复。问题是当我调用它时,我得到一个错误,它是一个NullReferenceException,当我查找它时,我发现方法中的命令是空的。 这就是所讨论的方法: 这种方式我已经知道如何使用,但另一种我不知道C# 带有sql参数的SQLC命令方法,c#,sqlcommand,mysql-parameter,C#,Sqlcommand,Mysql Parameter,我有这个方法,我在基类中有这个方法,它可以帮助我从children类中选择任何东西,还可以减少代码重复。问题是当我调用它时,我得到一个错误,它是一个NullReferenceException,当我查找它时,我发现方法中的命令是空的。 这就是所讨论的方法: 这种方式我已经知道如何使用,但另一种我不知道 SqlCommand command = new SqlCommand("select * from Customers where idCustomer=@idCustomer", OpenCo
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);
}
这就是我的称呼
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("");
您的OpenConnection方法返回一个连接对象。这可能会导致错误,但没有给出该方法的实现。此外,代码中未定义adpater,如果未初始化,也可能是导致错误的原因 我想就您的代码说几句话: 1您有和不必要的command.ExecuteNonQuery;ExecuteSelectQuery方法中的语句
2 DataAdapter可以直接填充DataTable,您不必使用DataSet。是您的OpenConnection方法返回的连接对象。这可能会导致错误,但没有给出该方法的实现。此外,代码中未定义adpater,如果未初始化,也可能是导致错误的原因 我想就您的代码说几句话: 1您有和不必要的command.ExecuteNonQuery;ExecuteSelectQuery方法中的语句
2 DataAdapter可以直接填充DataTable,您不必使用DataSet。这里是对您的方法的正确重写
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();
}
}
请注意,如果调用Fill时SqlConnection关闭,SqlDataAdapter可以自己打开和关闭连接。下面是对方法的正确重写
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();
}
}
请注意,如果调用Fill时SqlConnection已关闭,则SqlDataAdapter可以自行打开和关闭连接。您发布的代码中没有定义适配器?-命令ExecuteNonQuery;不应存在,请将其删除,SqlCommand实现IDisposable,因此应使用using块。您发布的代码中没有定义适配器?-命令ExecuteNonQuery;如果不存在,请将其删除,SqlCommand实现IDisposable,因此应具有using块。如果您在捕获中已引发异常,该异常将停止执行,那么返回null有什么意义?似乎无法访问该异常,因为该方法首先存在?@Symon从问题中复制,是的,它现在无法访问。它还应该包含SqlException作为InnerException,并且可能使用ApplicationException而不是Exception基类。感谢您的解释。现在,如果我想调用这个方法并为它提供参数,我如何才能做到这一点??就像我准备了一个查询和参数列表,但我不知道怎么做。@user3560798调用它就像你在问题中所做的一样,var resultTable=ExecuteSelectQueryquery,parameters;。如果您在catch中已经抛出了一个异常,它将停止执行,那么让returnnull有什么意义呢?似乎无法访问该异常,因为该方法首先存在?@Symon从问题中复制,是的,它现在无法访问。它还应该包含SqlException作为InnerException,并且可能使用ApplicationException而不是Exception基类。感谢您的解释。现在,如果我想调用这个方法并为它提供参数,我如何才能做到这一点??就像我准备了一个查询和参数列表,但我不知道怎么做。@user3560798调用它就像你在问题中所做的一样,var resultTable=ExecuteSelectQueryquery,parameters;。