【问题标题】:Retrieving class property when reading from database从数据库读取时检索类属性
【发布时间】:2015-04-22 15:54:01
【问题描述】:

我有以下几点:

 using (SqlCommand cmd2 = new SqlCommand("", dbCon))
                {
                    cmd2.CommandText = @"
                        SELECT [PCMF04_PCBPocketName_N]
                        ,[PCMF01_PcbConnectorName_N]
                        ,[PCMF03_PCBHeaderName_N]
                        ,[PCMF04_KeyIndex_C]
                        ,[PCMF04_SortOrder_R]
                        FROM [ArdSqlDev].[dbo].[WPCMF04_PCBPocket]
                        WHERE 
                            PCMF03_PCBHeaderName_N = @PCMF03_PCBHeaderName_N
                         Order By 
                            PCMF04_PCBPocketName_N";

                    cmd2.Parameters.Add("@PCMF03_PCBHeaderName_N", SqlDbType.NVarChar).Value = header.HeaderName;

                    using (SqlDataReader dr = cmd2.ExecuteReader())
                    {

                        while (dr.Read())
                        {
                            var pocket = new PcbPocket(dr.GetString(0));
                            pocket.PocketName = dr.GetString(0);
                            pocket.PcbConnector.ConnectorName = dr.GetString(1);
                            pocket.KeyIndex = dr.GetString(3);
                            pocket.SortOrder = dr.GetInt32(4);
                            header._PcbHeaderPockets.Add(pocket);
                        }

                        return header;
                    }
                }

我在网上遇到错误:

pocket.PcbConnector.ConnectorName = dr.GetString(1);

错误:

无法将错误 2 属性或索引器“PcbConnector.ConnectorName”分配给 -- 它是只读的

袖珍课

  public partial class PcbPocket : IEquatable<PcbPocket>, IComparable<PcbPocket>, IComparable
        {
        public PcbPocket(string PocketName)
        {
            _PocketName = PocketName;            
        }

        private string _PocketName = string.Empty;
        public string PocketName
        {
            get { return _PocketName; }
            set { _PocketName = value; }
        }

        private string _KeyIndex = string.Empty;
        public string KeyIndex
        {
            get { return _KeyIndex; }
            set { _KeyIndex = value; }
        }

        private int _SortOrder = 0;
        public int SortOrder
        {
            get { return _SortOrder; }
            set { _SortOrder = value; }
        }

        private PcbConnector _PcbConnector = null;
        public PcbConnector PcbConnector
        {
            get { return _PcbConnector; }
            set { _PcbConnector = value; }
        }

连接器类

公共部分类 PcbConnector : IEquatable, IComparable, IComparable {

    private Collections.PcbConnectorPinList _PcbConnectorPins = new Collections.PcbConnectorPinList();
    public Collections.PcbConnectorPinList PcbConnectorPins
    {
        get
        {
            return _PcbConnectorPins;
        }
        set
        {
            _PcbConnectorPins = value;
        }
    }

    public PcbConnector(string connectorName)
    {
        _ConnectorName = connectorName;       
    }

    public PcbConnector(PcbConnector pcbConnector)
    {
        _ConnectorName = pcbConnector.ConnectorName;
        _Height = pcbConnector.Height;
        _Width = pcbConnector.Width;
        _Active = pcbConnector.Active;          
        _Supplier = pcbConnector.Supplier;
    }


    private string _ConnectorName = string.Empty;
    public string ConnectorName
    {
        get { return _ConnectorName; }
    }

    private string _Supplier = string.Empty;
    public string Supplier
    {
        get { return _Supplier; }
        set { _Supplier = value; }
    }


    private float _Height = 0;
    public float Height
    {
        get { return _Height; }
        set { _Height = value; }
    }

    private float _Width = 0;
    public float Width
    {
        get { return _Width; }
        set { _Width = value; }
    }

    private bool _Active = true;
    public bool Active
    {
        get { return _Active; }
        set { _Active = value; }
    }

PcbPocket 和 PbcConnector 是类。 ConnectorName 是 PbcConnector 类的属性。如果我忽略这一行,该值将为空,这不是保存在数据库中的内容,并且会给我一个对象引用未设置错误。有没有办法可以检索我的 ConnectorName 值以显示在我的 datagridview 中(在不同的文件/表单中)?

【问题讨论】:

  • 这将有助于显示PcbPocket 类以及PcbPocket.PcbConnector 是哪个类。
  • PcbPocket.PcbConnector.ConnectorNameReadOnlyget-only 属性:即没有附加 setPcbPocketPcbPocket.PcbConnector 可能有一个构造函数可以满足您的需求。或者可能是PcbPocket.PcbConnector.SetConnectorName 等。
  • 你也像你说的那样创建一个新的 PcbConnector 实例,它是一个类
  • @Jonesy 编辑了我的问题以添加我的课程。
  • 我不想这么说,但问题很明显。您是否先尝试在 Google 上搜索错误消息?

标签: c# sql datagridview


【解决方案1】:

您的 PcbConnector 上没有设置器:

private string _ConnectorName = string.Empty;
public string ConnectorName
{
    get { return _ConnectorName; }
}

你想要的:

private string _ConnectorName = string.Empty;
public string ConnectorName
{
    get { return _ConnectorName; }
    set { _ConnectorName = value; }
}

话虽如此,您应该注意属性可以自动实现,如果您不关心它们的默认值。例如,您有:

private int _SortOrder = 0;
public int SortOrder
{
    get { return _SortOrder; }
    set { _SortOrder = value; }
}

这和

一样
public int SortOrder { get; set; }

int 的默认值为 0

【讨论】:

    【解决方案2】:

    看看PcbConnector 类。改成这样

    class PcbConnector
    {
        // Now
        public string ConnectorName {get; private set;}
    
        // Update this to
        public string ConnectorName {get; set;} // makes the set public
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      • 2019-08-29
      相关资源
      最近更新 更多