非静态字段,方法或属性(变量声明)需要对象引用

时间:2014-01-07 22:10:19

标签: c# variables sqlconnection

我正在尝试向查询添加一个参数,这样做会给我上面的错误。我有变量public我声明在外面或我的方法。我尝试将其设置为静态,因为我已阅读其他帖子但它然后它给了我其他所引用的错误。方法我在公共静态列表方法中工作。

采取的步骤: 尝试在我的方法中声明一个变量t将变量传递给。 在线研究 经过测试的在线研究。

这是我声明的变量:

public int CarrierID { get; set; }

这是我尝试添加参数的方法,以及它在CarrierID cmd.Parameters.AddWithValue(“CarrierID”, CarrierID )中给出错误的位置。 :

SqlConnection dbConn = new 
   SqlConnection(ConfigurationManager.ConnectionStrings
   ["Connection"].ConnectionString);

   SqlCommand cmd = new SqlCommand();
   cmd.CommandText = sqlString.ToString();
   cmd.Parameters.AddWithValue("CarrierID", CarrierID);

   SqlDataReader reader = null;

   try
   {
      reader = DBHelper.executeQuery(dbConn, sqlString.ToString(), null);
      if (reader != null)
      {
          while (reader.Read())
          {
              EmpData ed = new EmpData();
              ed.CarrierID = (int)reader["CarrierID"];
              list.Add(ed);
           }

empData类:

class EmpData
{
    public int EmployeeID { get; set; }
    public string FName { get; set; }
    public string LName { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public string Email { get; set; }
    public static int CarrierID { get; set; }
    public string CellNumber { get; set; }
    public bool IsActive { get; set; }
    public string CarrierName { get; set; }


    public static List<EmpData> getData()
    {

        List<EmpData> list = new List<EmpData>();

        StringBuilder sqlString = new StringBuilder();
        sqlString.Append("SELECT e.*, c.Carrier ");
        sqlString.Append("FROM Employee e, CellCarrier c ");
        sqlString.Append(" WHERE e.CarrierID = @CarrierID ");
        sqlString.Append("  AND e.CarrierID = c.CarrierID");

        SqlConnection dbConn = new SqlConnection(ConfigurationManager.ConnectionStrings["Connection"].ConnectionString);

        SqlCommand cmd = new SqlCommand();
        cmd.CommandText = sqlString.ToString();
        cmd.Parameters.AddWithValue("CarrierID", CarrierID);

        SqlDataReader reader = null;

        try
        {
            reader = DBHelper.executeQuery(dbConn, sqlString.ToString(), null);
            if (reader != null)
            {
                while (reader.Read())
                {
                    EmpData ed = new EmpData();
                    ed.EmployeeID = (int)reader["EmployeeID"];
                    ed.FName = reader["FirstName"].ToString();
                    ed.LName = reader["LastName"].ToString();
                    ed.UserName = reader["UserName"].ToString();
                    ed.Password = reader["Password"].ToString();
                    ed.Email = reader["Email"].ToString();
                    ed.CarrierID = (int)reader["CarrierID"];
                    ed.CellNumber = reader["CellNumber"].ToString();
                    ed.IsActive = (bool)reader["IsActive"];
                    ed.CarrierName = reader["Carrier"].ToString();
                    list.Add(ed);
                }
                reader.Close();
                reader.Dispose();
                dbConn.Close();
                dbConn.Dispose();
            }
            else
                throw new Exception("No records returned");
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            if (dbConn != null)
            {
                try { dbConn.Close(); dbConn.Dispose(); }
                catch { }
            }
            if (reader != null)
            {
                try { reader.Close(); reader.Dispose(); }
                catch { }
            }
        }
        return list;
    }
}

4 个答案:

答案 0 :(得分:7)

您的方法是static ..您的变量不是。

您需要将变量标记为static,以便在static方法中使用它:

public static int CarrierID { get; set; }
//     ^^^^^^ this

您拥有的另一个选项是从此代码所在的方法中删除static修饰符,并在使用它之前实例化它所在的类。

编辑:

编辑后..我认为你应该改变你的方法:

public static List<EmpData> GetData(int carrierId) {
    // code here..

    cmd.Parameters.AddWithValue("CarrierID", carrierId);

    // code here..
}

然后,每当你打电话时......传递你需要的CarrierID

EmpData.GetData(5);

我假设您已经拥有所需的CarrierID并且在调用此方法之前设置..(因此您可以将其传入)。我还大写了该方法的第一个字符..因为这更符合C#风格。

答案 1 :(得分:1)

阿。谢谢你加入全班。您尝试将CarrierID用于两个目的 - 一次为查询设定种子,一次为EmpData实例存储CarrierID。它不可能两者兼而有之。我认为你想要做的事情最好用一个参数完成:

public static List<EmpData> getData(int carrierID)
                                    ^^^^^^^^^^^^^
{

    List<EmpData> list = new List<EmpData>();

    StringBuilder sqlString = new StringBuilder();
    sqlString.Append("SELECT e.*, c.Carrier ");
    sqlString.Append("FROM Employee e, CellCarrier c ");
    sqlString.Append(" WHERE e.CarrierID = @CarrierID ");
    sqlString.Append("  AND e.CarrierID = c.CarrierID");

    SqlConnection dbConn = new SqlConnection(ConfigurationManager.ConnectionStrings["Connection"].ConnectionString);

    SqlCommand cmd = new SqlCommand();
    cmd.CommandText = sqlString.ToString();
    cmd.Parameters.AddWithValue("CarrierID", carrierID);
                                             ^^^^^^^^^

答案 2 :(得分:0)

问题是它是一个实例变量,你就像静态变量一样使用它。所以有三个选项,第一个是使它成为一个静态变量(请记住,如果是这种情况,所有实例都具有相同的值)。选项选项是从一个实例访问它,所以说它属于一个名为Carrier的类,那么你需要类似的东西;

    Carrier c = new Carrier();
    // anywhere within the same scope as the line above
    cmd.Parameters.AddWithValue("CarrierID", c.CarrierID);

最后,您可以这样做,因此该方法是一个实例方法,在这种情况下,访问实例变量时不会出现此错误。

答案 3 :(得分:-5)

参数应以@符号开头。

试 cmd.Parameters.AddWithValue(“@ CarrierID”,CarrierID);