none
我刚学C#,在这个三层里调用有点晕,麻烦老师们给看一下。 RRS feed

  • 问题

  • 我想从数据库读取数据到XAML界面里,我刚学基础,我有点迷糊。麻烦老师们给看看错在哪。

    XAML:

    private void Window_Loaded(object sender, RoutedEventArgs e) { PersonnelDAL pdal = new PersonnelDAL(); cbo_PersonnelDepartment.ItemsSource = pdal.GetDepartment(); }

    DAL:

            public void GetDepartment()
            {
    
                SqlHelper.ExecuteReader("select * from department");
            }

    SqlHelper:

            public static object ExecuteReader(string sql, params SqlParameter[] parameters)
            {
                using (SqlConnection conn = new SqlConnection(SqlHelper.ConnectionString))
                {
                    conn.Open();
                    using (SqlCommand cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = sql;
                        using (SqlDataReader sdr = cmd.ExecuteReader())
                        {
                            while (sdr.Read())
                            {
                                cmd.Parameters.AddRange(parameters);
                            }
                            
                        }
                        return parameters;
                    }
                    
                }
                
            }


    C#初学者!~~~

    2014年8月4日 0:43

答案

  • 你好。

    首先跟你确认一下,cbo_PersonnelDepartment 是ComboBox类型吧?

    问题出在DAL的GetDepartment()方法上,这个方法你并没有返回值,所以cbo_PersonnelDepartment.ItemsSource并未被赋值。

    应该把方法返回值修改为List<T>或类似的列表类型,这就需要把数据库查询后的DataTable或者DataSet的数据装入你的List<T>中。

    另外你的SqlHelper的ExecuteReader方法也有问题,返回值不该是parameters,因为它是拼接sql语句的参数而已。

    这里给你提供几个关于SQL操作的文章吧:

    C#操作SQL Server数据库

    Retrieving Data Using a DataReader

    希望对你有帮助!


    希望我的答案能帮助更多的人。

    • 已标记为答案 呆oO 2014年8月4日 1:27
    2014年8月4日 1:01
  • 有一个小问题,ExecuteReader方法返回的Department变量是List<string>类型的值,那么这个方法的返回值可以改成List<string>。对应的GetDepartment方法就不需要对ExecuteReader的返回值强制转型,而是直接使用就可以了。

    希望我的答案能帮助更多的人。

    • 已标记为答案 呆oO 2014年8月4日 4:15
    2014年8月4日 1:56

全部回复

  • 你好。

    首先跟你确认一下,cbo_PersonnelDepartment 是ComboBox类型吧?

    问题出在DAL的GetDepartment()方法上,这个方法你并没有返回值,所以cbo_PersonnelDepartment.ItemsSource并未被赋值。

    应该把方法返回值修改为List<T>或类似的列表类型,这就需要把数据库查询后的DataTable或者DataSet的数据装入你的List<T>中。

    另外你的SqlHelper的ExecuteReader方法也有问题,返回值不该是parameters,因为它是拼接sql语句的参数而已。

    这里给你提供几个关于SQL操作的文章吧:

    C#操作SQL Server数据库

    Retrieving Data Using a DataReader

    希望对你有帮助!


    希望我的答案能帮助更多的人。

    • 已标记为答案 呆oO 2014年8月4日 1:27
    2014年8月4日 1:01
  • 是不是ExecuteReader方法返回一个DataTable,然后将DataTable装入List<T>中,然后再赋值给cbo_PersonnelDepartment.ItemsSource??

    C#初学者!~~~

    2014年8月4日 1:04
  • Great!

    就是这个意思。


    希望我的答案能帮助更多的人。

    2014年8月4日 1:14
  • 补习List<T>去,一点也不明白。。

    C#初学者!~~~

    2014年8月4日 1:16
  • 直接用后面的可变数组不行吗?


    C#初学者!~~~

    2014年8月4日 1:16
  • DataTable转List<T>会比转数组容易。而且List可以提供很多数组没有的属性,这些属性在ComboBox的操作中会用到。

    希望我的答案能帮助更多的人。

    2014年8月4日 1:25
  • 好的,谢谢你,先去补习。

    C#初学者!~~~

    2014年8月4日 1:27
  • 最终按你的意思实现了,特别开心啊,这就是编程乐趣所在。

    麻烦你看一下有没有需要改进的地方,谢谢;

    XAML:

            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                PersonnelDAL pdal = new PersonnelDAL();
                cbo_PersonnelDepartment.ItemsSource = pdal.GetDepartment();
    }

    DAL:

            public List<string>  GetDepartment()
            {
                List<string> Department = new List<string>();
               Department = (List<string>)SqlHelper.ExecuteReader("select * from department");
               return Department;
    
            }

    SqlHelper:

            public static object ExecuteReader(string sql)
            {
                List<string> Department = new List<string>();
                using (SqlConnection conn = new SqlConnection(SqlHelper.ConnectionString))
                {
                    conn.Open();
                    using (SqlCommand cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = sql;
                        DataTable dt = new DataTable();
                        using (SqlDataReader sdr = cmd.ExecuteReader())
                        {
                            while (sdr.Read())
                            {
                                Department.Add(sdr.GetString(1));
                            }
                            
                        }
                        return Department;
                    }
                    
                }
                
            }


    C#初学者!~~~

    2014年8月4日 1:50
  • 有一个小问题,ExecuteReader方法返回的Department变量是List<string>类型的值,那么这个方法的返回值可以改成List<string>。对应的GetDepartment方法就不需要对ExecuteReader的返回值强制转型,而是直接使用就可以了。

    希望我的答案能帮助更多的人。

    • 已标记为答案 呆oO 2014年8月4日 4:15
    2014年8月4日 1:56
  •  #region 获取报修记录
            /// <summary>
            /// 根据 ID 得到 List<RepairLogModel>
            /// </summary>
            /// <param name="ID">ID</param>
            /// <return>List<RepairLogModel><return>
            public List<Model.RepairLogModel> GetRepairLogModels(int RecordID)
            {
                try
                {
                    List<Model.RepairLogModel> info = new List<Model.RepairLogModel>();
                    string sql = "select [ID],[RecordID],[ITSname],[Operate],[Remark],[CreateDate] from [RepairLog] where [RecordID]=@RecordID order by [CreateDate] asc";
                    SqlDataReader reader = SqlHelper.ExecuteReader(SqlHelper.CONN_STRING, System.Data.CommandType.Text, sql, new SqlParameter("@RecordID", RecordID));
                    while (reader.Read())
                    {
                        Model.RepairLogModel item = new Model.RepairLogModel();
                        item.ID = reader.IsDBNull(0) ? 0 : (int)reader[0];
                        item.RecordID = reader.IsDBNull(1) ? 0 : (int)reader[1];
                        item.ITSname = reader.IsDBNull(2) ? "" : (string)reader[2];
                        item.Operate = reader.IsDBNull(3) ? "" : (string)reader[3];
                        item.Remark = reader.IsDBNull(4) ? "" : (string)reader[4];
                        item.CreateDate = reader.IsDBNull(5) ? DateTime.Now : Convert.ToDateTime(reader[5]);
                        info.Add(item);
                    }
                    reader.Close();
                    return info;
                }
                catch
                {
                    return null;
                }
            }
            #endregion
    我的DAL是这样写的,Model是实体类库
    2014年8月4日 1:58