Не удается отобразить все записи в программе просмотра отчетов

#c# #wpf #reportviewer

#c# #wpf #reportviewer

Вопрос:

[редактировать: я добавил визуализатор данных] У меня есть регистрация преподавателя, где записи вводятся с помощью кнопки вставки в базе данных SQL как таковой

 private void insertdata(object sender, RoutedEventArgs e)
        {
            try
            {
                string name = name_field.Text;
                string email = email_field.Text;

                string id = id_field.Text;
                string gender;
                if (male.IsChecked == true)
                {
                    gender = "M";
                }
                else
                    gender = "F";


                if (String.IsNullOrEmpty(dob.Text))
                {
                    string fe = "01/01/1900 12:00:00 AM";
                    dt = Convert.ToDateTime(fe);
                }
                else
                {
                    dt = Convert.ToDateTime(dob.Text);

                }



                var rich1 = new TextRange(this.history.Document.ContentStart, this.history.Document.ContentEnd);

                string teach_history = rich1.Text;

                var rich2 = new TextRange(this.achievement.Document.ContentStart, this.achievement.Document.ContentEnd);

                string teach_achievement = rich2.Text;

                connect();
                con.Open();


                string saved = "insert into teacher_details ([Teacher ID],Name,Gender,Email,[Date of Birth],Employment History,Achievements)values('"   id   "', '"   name   "','"   gender   "','"   email   "','"   dt   "','"   teach_history   "','"   teach_achievement   "')";

                SqlCommand cmd = new SqlCommand(saved, con);

                cmd.ExecuteReader();

                con.Close();

                MessageBox.Show("record is added");
              
            }
            catch(Exception ex)
            {
                MessageBox.Show("error occured "   ex);
            }
  

В качестве полей у меня есть идентификатор, пол, имя, электронная почта, история, достижения, дата рождения. Я создал класс для этого следующим образом:

     class Teacherdetail
    {
        public string id { get; set; }
        public string name { get; set; }
        public string email { get; set; }
        public string gender { get; set; }
        public string history { get; set; }
        public string acheive { get; set; }
        public DateTime dob { get; set; }
    }
  

в моем отчете rdlc я использовал object в качестве своего набора данных и выбрал Teacherdetail. Затем я составил таблицу следующим образом:
teacherreport.rdlc

затем у меня есть кнопка просмотра отчета, где я вызываю сведения в reportviewer, который называется teacherreport

 ReportDataSource reportDataSource = new ReportDataSource();
            connect();
            con.Open();

            SqlDataAdapter adp = new SqlDataAdapter("select [Teacher ID],Name,Gender,email,[Date of Birth],[Employment History],Achievements from teacher_details", con);

            DataTable newtab = new DataTable();
            adp.Fill(newtab);
            reportDataSource.Name = "DataSet1";



            reportDataSource.Value = newtab;

            teacherreport.LocalReport.ReportPath = "C:\Users\Preeti Rawat\Documents\Visual Studio 2012\Projects\STDNT\STDNT\teacherreport.rdlc"; 



            teacherreport.LocalReport.DataSources.Add(reportDataSource);

            teacherreport.LocalReport.Refresh();
            teacherreport.RefreshReport();
  

введите описание изображения здесь

Моя проблема в том, что идентификатор, история, имя и достижение отсутствуют.

Когда я отлаживаю программу, в моем визуализаторе данных отображается, что информация проходит через. введите описание изображения здесь но он по-прежнему не отображается в программе. В чем может быть проблема и как я могу ее исправить? Спасибо ^^

Комментарии:

1. Вы написали все это, а затем посмотрели на конечный результат. Однако в процессе вашего процесса возникает проблема. Вы должны были написать вставку, а затем проверить, что она работает. Тогда вы бы поняли, что у вас проблема со вставкой.

2. Построение строки sql с такими переменными — плохая идея. Внедрение Google sql. Я рекомендую вам заглянуть в dapper. Это набор методов расширения, которые делают работу с ado более простой и менее подверженной ошибкам.

3. Запрос вставки работает. Я даже использовал datagrid, и в нем отображаются все детали.

4. Executereader считывает данные.

Ответ №1:

Для вашего конкретного вопроса в вашем insertdata вы вызываете ExecuteReader , чтобы вставить новую запись, и это неправильно. Вам нужно вызвать ExecuteNonQuery to INSERT, UPDATE, DELETE actions.

Кроме того, в :

 string saved = "insert into teacher_details ([Teacher ID],Name,Gender,Email,[Date of Birth],Employment History,Achievements)values('"   id   "', '"   name   "','"   gender   "','"   email   "','"   dt   "','"   teach_history   "','"   teach_achievement   "')";
  

это должно вернуть ошибку SQL, поскольку Employment History не содержится в скобках [] .

Вот исправленная версия вашего метода. (Я пытался сохранить ту же работу).

 var name = name_field.Text;
var name = name_field.Text;
var email = email_field.Text;
var id = id_field.Text;
var gender = male.IsChecked ? "M" : "F";
var dt = DateTime.TryParse(dob.Text, out DateTime result) ? result : new DateTime(1900,1,1); 
var teach_history = new TextRange(this.history.Document.ContentStart, this.history.Document.ContentEnd).Text;
var teach_achievement = new TextRange(this.achievement.Document.ContentStart, this.achievement.Document.ContentEnd).Text;


const string query = "INSERT INTO teacher_details([Teacher ID],Name,Gender,Email,[Date of Birth],[Employment History],Achievements) VALUES ('{0}','{1}','{2}','{3}','{4}','{5}','{6}'); ";      

var saved = string.Format(query, id, name, gender, email, dt.ToString("yyyy-MM-ddThh:mm:ss"), teach_history, teach_achievement)

connect();
con.Open();

using(var cmd = new SqlCommand(saved, con))
{
    cmd.ExcuteNonQuery();
}

con.Close();

MessageBox.Show("record is added");
  

вы должны использовать using блоки на SqlConnection или удалить свое соединение вручную. Кроме того, я предлагаю вам начать использовать Entity Framework вместо этого для операций с базой данных.

Для части отчета вам нужно сделать это :

 var table = new DataTable();

const string query = "SELECT [Teacher ID],Name,Gender,email,[Date of Birth],[Employment History],Achievements from teacher_details";

connect();
con.Open();

var adapter = new SqlDataAdapter(query, con);
    adapter.Fill(table);

var reportDataSource = new ReportDataSource("Dataset1", table);

teacherreport.LocalReport.ReportPath = "C:\Users\Preeti Rawat\Documents\Visual Studio 2012\Projects\STDNT\STDNT\teacherreport.rdlc"; 

teacherreport.LocalReport.DataSources.Clear();  

teacherreport.LocalReport.DataSources.Add(reportDataSource);  

teacherreport.LocalReport.Refresh();

teacherreport.RefreshReport(); 
  

Комментарии:

1. Я получаю сообщение об ошибке, что у ExecuteNonQuery нет определения. Кроме того, у меня даже есть таблица данных, и все мои данные отображаются там даже с помощью ExecuteReader

2. @preeti ExecuteNonquery должно быть ExecuteNonQuery . При чтении данных используйте SqlDataAdapter для заполнения данных в таблице.

3. Я пытался. и хотя код работает, я все еще не получаю все детали моего отчета :/

4. Я попробовал это. Это не работает: / теперь не отображаются данные и имя столбца

5. пока отчет есть. Отсутствуют те же столбцы :/

Ответ №2:

Причина, по которой это не работало, заключалась в том, что имена классов отличались от имени поля таблицы. Они должны быть одинаковыми. Итак, я изменил имена столбцов моей таблицы базы данных, чтобы она выглядела следующим образом:

Идентификатор преподавателя, имя, пол, электронная почта, дата рождения, История занятости, достижения

и мой класс выглядит так:

         public int Teacher_ID { get; set; }
        public string Name { get; set; }
        public string Gender { get; set; }
        public string email { get; set; }
        public DateTime Date_of_Birth { get; set; }
        public string Employment_History { get; set; }
        public string Achievements { get; set; }