Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有sql参数的SQLC命令方法_C#_Sqlcommand_Mysql Parameter - Fatal编程技术网

C# 带有sql参数的SQLC命令方法

C# 带有sql参数的SQLC命令方法,c#,sqlcommand,mysql-parameter,C#,Sqlcommand,Mysql Parameter,我有这个方法,我在基类中有这个方法,它可以帮助我从children类中选择任何东西,还可以减少代码重复。问题是当我调用它时,我得到一个错误,它是一个NullReferenceException,当我查找它时,我发现方法中的命令是空的。 这就是所讨论的方法: 这种方式我已经知道如何使用,但另一种我不知道 SqlCommand command = new SqlCommand("select * from Customers where idCustomer=@idCustomer", OpenCo

我有这个方法,我在基类中有这个方法,它可以帮助我从children类中选择任何东西,还可以减少代码重复。问题是当我调用它时,我得到一个错误,它是一个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);
}
这就是我的称呼

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;。