ExecuteReader:Connection属性尚未初始化错误问题

时间:2017-01-21 07:57:08

标签: c# asp.net sql-server

执行以下代码时,我收到错误

  

ExecuteReader:尚未初始化Connection属性。

[WebMethod]
public static bool GetCurrentToBin(string ToBin)
{
    SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["SqlConn"].ToString());
    conn.Open();
    CommandFunction CF = new CommandFunction();

    SqlDataReader dr;
    dr = CF.ExecuteReader("exec sp_P_WMS_Stock_Adj_Validation_Proc '" + ToBin + "'");
    dr.Read();
    if (dr.HasRows)
    {
        conn.Close();
        return true;
    }
    return false;
}

1 个答案:

答案 0 :(得分:2)

您可以像下面那样重构您的代码,我认为您会得到您想要的。问题是你没有在CommandFunction对象的任何地方指定将要使用的sql连接。我不知道这个对象,但我认为这是问题所在。下面的解决方案使用类SqlCommand

using System.Configuration;

[WebMethod]
public static string GetCurrentToBin(string ToBin)
{
    var connectionString = ConfigurationManager.ConnectionStrings["SqlConn"].ToString();
    using(var conn = new SqlConnection(connectionString))
    {
        const string queryString = "exec sp_P_WMS_Stock_Adj_Validation_Proc @Bin";

        var sqlCommand = new SqlCommand(queryString , conn);
        sqlCommand.Parameters.AddWithValue("@Bin",ToBin);

        conn.Open();
        var reader = sqlCommand.ExecuteReader();

        if(reader.Read() && !reader.IsDBNull(0))
        {
            return reader.GetString(0);
        }
        return null;
    }
}

从上面的代码中你可以做两件事:

  • 我们没有显式关闭sql连接。我们不是明确地关闭连接,而是让using语句为我们这样做。因此,只要您想要创建新的SQL连接,请将其包装在using语句中,并且您不需要再次记住关闭连接。
  • 仅使用参数化查询。如果不这样做,您可以将应用程序打开到sql injections