简体   繁体   English

从SQL查询设置对象值

[英]Setting Object values from SQL Query

I am trying to iterate through an SQL query and set the objects parameters to particular values. 我试图迭代SQL查询并将对象参数设置为特定值。 The only value that seems to be functioning correctly is the workpack.JobCardIDs, as I can implement a foreach loop to display the results. 似乎正常运行的唯一值是workpack.JobCardIDs,因为我可以实现foreach循环来显示结果。 If I try to set a Label's Text property to a workpack.WorkPackTitle for example, it will display a blank even though the database value is something for every line. 例如,如果我尝试将Label的Text属性设置为workpack.WorkPackTitle,它将显示空白,即使数据库值是每行的内容。

I am fairly new to the OOP so not entirely sure if there is something I am missing that's fundamental. 我对OOP还是比较陌生的,所以不能完全确定我是否遗漏了一些基本的东西。

    public class WorkPack
    {
        public int ID { get; set; }
        public string WorkPackNumber { get; set; }
        public string WorkPackTitle { get; set; }
        public string WorkPackDescription { get; set; }
        public Boolean IFC { get; set; }
        public string SPA { get; set; }
        public string Writer { get; set; }
        public string Organization { get; set; }
        public List<int> JobCardIDs { get; set; }
        public int JobCard { get; set; }
    }

    public static WorkPack PopulateWorkPackObject(WorkPack workpack, int workPackID)
    {
        string ConnectionString = ConfigurationManager.ConnectionStrings["vmdatamanagerConnectionString"].ConnectionString;
        string sqlCall = "I HAVE REMOVED CALL BUT VERIFIED IT FUNCTIONS (SELECT columns FROM workpackdatabase where workpackname = x";

        using (SqlConnection con = new SqlConnection(ConnectionString))
        {
            using (SqlCommand cmd = new SqlCommand(sqlCall, con))
            {
                cmd.Connection.Open();
                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        if (reader.IsDBNull(reader.GetOrdinal("PARAM1")) == false)
                            workpack.WorkPackNumber = (reader.GetString(reader.GetOrdinal("PARAM1")));

                        if (reader.IsDBNull(reader.GetOrdinal("PARAM2")) == false)
                            workpack.WorkPackTitle = reader.GetString(reader.GetOrdinal("PARAM2"));

                        if (reader.IsDBNull(reader.GetOrdinal("PARAM3")) == false)
                            workpack.WorkPackDescription = reader.GetString(reader.GetOrdinal("PARAM3"));

                        if (reader.IsDBNull(reader.GetOrdinal("PARAM4")) == false)
                            workpack.IFC = reader.GetBoolean(reader.GetOrdinal("PARAM4"));

                        if (reader.IsDBNull(reader.GetOrdinal("PARAM5")) == false)
                            workpack.SPA = reader.GetString(reader.GetOrdinal("PARAM5"));

                        if (reader.IsDBNull(reader.GetOrdinal("PARAM6")) == false)
                            workpack.Writer = reader.GetString(reader.GetOrdinal("PARAM6"));

                        if (reader.IsDBNull(reader.GetOrdinal("PARAM7")) == false)
                            workpack.Organization = reader.GetString(reader.GetOrdinal("PARAM7"));

                        if (reader.IsDBNull(reader.GetOrdinal("PARAM8")) == false)
                            jobCardIDs.Add(reader.GetInt32(reader.GetOrdinal("PARAM8")));

                    }
                    workpack.JobCardIDs = jobCardIDs;
                    return workpack;
                }
            }
        }
    }

Looks like you never create a local instance of your jobCardIDs List. 看起来你永远不会创建jobCardIDs列表的本地实例。 You'll want to do this just inside your ExecuteReader block. 您只想在ExecuteReader块中执行此操作。 See below. 见下文。 GL GL

public static WorkPack PopulateWorkPackObject(WorkPack workpack, int workPackID)
{
    string ConnectionString = ConfigurationManager.ConnectionStrings["vmdatamanagerConnectionString"].ConnectionString;
    string sqlCall = "I HAVE REMOVED CALL BUT VERIFIED IT FUNCTIONS (SELECT columns FROM workpackdatabase where workpackname = x";

    using (SqlConnection con = new SqlConnection(ConnectionString))
    {
        using (SqlCommand cmd = new SqlCommand(sqlCall, con))
        {
            cmd.Connection.Open();
            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                List<int> jobCardIDs = new List<int>(); //<--***THIS IS THE LINE YOU NEED TO ADD***
                while (reader.Read())
                {
                    if (reader.IsDBNull(reader.GetOrdinal("PARAM1")) == false)
                        workpack.WorkPackNumber = (reader.GetString(reader.GetOrdinal("PARAM1")));

                    if (reader.IsDBNull(reader.GetOrdinal("PARAM2")) == false)
                        workpack.WorkPackTitle = reader.GetString(reader.GetOrdinal("PARAM2"));

                    if (reader.IsDBNull(reader.GetOrdinal("PARAM3")) == false)
                        workpack.WorkPackDescription = reader.GetString(reader.GetOrdinal("PARAM3"));

                    if (reader.IsDBNull(reader.GetOrdinal("PARAM4")) == false)
                        workpack.IFC = reader.GetBoolean(reader.GetOrdinal("PARAM4"));

                    if (reader.IsDBNull(reader.GetOrdinal("PARAM5")) == false)
                        workpack.SPA = reader.GetString(reader.GetOrdinal("PARAM5"));

                    if (reader.IsDBNull(reader.GetOrdinal("PARAM6")) == false)
                        workpack.Writer = reader.GetString(reader.GetOrdinal("PARAM6"));

                    if (reader.IsDBNull(reader.GetOrdinal("PARAM7")) == false)
                        workpack.Organization = reader.GetString(reader.GetOrdinal("PARAM7"));

                    if (reader.IsDBNull(reader.GetOrdinal("PARAM8")) == false)
                        jobCardIDs.Add(reader.GetInt32(reader.GetOrdinal("PARAM8")));

                }
                workpack.JobCardIDs = jobCardIDs;
                return workpack;
            }
        }
    }
}

The previous answers given by the community did not fix the issue, although I did put that extra snippet it. 社区提供的先前答案并没有解决问题,尽管我确实把它添加了多余的片段。

The issue was when the objects were being created and passed between post backs. 问题是何时创建对象并在回发之间传递。 The object would be relevant on selection of the job card tab but once the page loaded there was no code to rebuild that instance. 该对象与选择作业卡选项卡相关,但一旦加载的页面没有重建该实例的代码。

Adding 添加

      Object foo = new Object();

in the page_Load() and rebuilding fixed the issue. 在page_Load()和重建修复问题。 If anyone has any suggestions on how to keep an instance alive I am all for hearing it. 如果有人对如何让一个实例保持活着有任何建议,我就是全部听到它。 I think ViewState() and also Session[] were applicable methods for doing so. 我认为ViewState()和Session []都是适用的方法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM