SQL Запрос не получает все строки в C# приложении - PullRequest
0 голосов
/ 03 мая 2020

В моей базе данных SQL Server 2012 создана хранимая процедура, которая выбирает данные из нескольких таблиц. В C# я использую эту процедуру для отображения данных в представлении данных.

Проблема: при выполнении запроса на сервере SQL я получаю правильный результат, который возвращает 3 строки, но в C# , он возвращает только 2 строки.

Запрос:

SELECT DISTINCT 
    Employee.Employee_No AS 'Badge'
    ,Employee.Employee_Name_Ar AS 'Emp Name'
    ,Employee.Basic_Salary AS 'Basic'
    ,Employee.Current_Salary AS 'Current'
    ,Attendance.Present
    ,Attendance.Leave
    ,Attendance.Othe_Leave AS 'OL'
    ,Pay_Slip.Salary_Amount AS 'Sal. Amt.'
    ,(ISNULL(Pay_Slip.OverTime1_Amount, 0.00) + ISNULL(Pay_Slip.OverTime2_Amount, 0.00)) AS 'O/T Amt.'
    ,(ISNULL(Pay_Slip.Salary_Amount, 0.00) + ISNULL(ISNULL(Pay_Slip.OverTime1_Amount, 0.00) + ISNULL(Pay_Slip.OverTime2_Amount, 0.00), 0.00)) AS 'Sal. & O/T'
    ,Pay_Slip.Trasnport AS 'Allow'
    ,Pay_Slip.CostofLiving AS 'O.Allow'
    ,Pay_Slip.Gross_Salary AS 'T Salary'
    ,Pay_Slip.Insurance1_Amount AS 'ss 7%'
    ,Pay_Slip.Insurance2_Amount AS 'ss 11%'
    ,(ISNULL(Pay_Slip.Insurance1_Amount, 0.00) + ISNULL(Pay_Slip.Insurance2_Amount, 0.00)) AS 'Total s.s'
    ,Pay_Slip.Tax
    ,Pay_Slip.Personal_Loans AS 'Advance'
    ,Pay_Slip.Other_Deductions AS 'Ded.'
    ,Pay_Slip.Net_Salary AS 'Net'
FROM Pay_Slip
LEFT JOIN Employee ON Pay_Slip.Employee_No = Employee.Employee_No
LEFT JOIN Attendance ON Pay_Slip.Employee_No = Attendance.Employee_No
WHERE Pay_Slip.Month = '5'
    AND Pay_Slip.Year = '2020'
    AND Attendance.Month = '5'
    AND Attendance.Year = '2020'

Выполнение этого запроса в SQL Сервер возвращает 3 строки, которые являются промахами сотрудника в мае-2020 (Все они имеют значения в Май-2020).

C# код:

private void dateTimePicker_ReportDate_ValueChanged(object sender, EventArgs e)
{
    try
    {
        DateTime date = dateTimePicker_ReportDate.Value;

        String Month = dateTimePicker_ReportDate.Value.ToString("MM");
        String Year = dateTimePicker_ReportDate.Value.ToString("yyyy");

        String str = "server=localhost;database=EasyManagementSystem;User Id=Jaz;Password=Jaz@2020;Integrated Security=True;";

        String query = "Execute EMP_PAY_ATT_Selection @Month, @Year";

        SqlConnection con = null;
        con = new SqlConnection(str);

        SqlCommand cmd= new SqlCommand(query, con);

        cmd.Parameters.Add("@Month", SqlDbType.Int).Value = Convert.ToInt32(Month);
        cmd.Parameters.Add("@Year", SqlDbType.Int).Value = Convert.ToInt32(Year);

        SqlDataReader sdr;

        con.Open();

        sdr = cmd.ExecuteReader();

        if (sdr.Read())
        {
            DataTable dt = new DataTable();
            dt.Load(sdr);
            dataGridView_Report.DataSource = dt;

            dataGridView_Report.EnableHeadersVisualStyles = false;
            dataGridView_Report.ColumnHeadersDefaultCellStyle.BackColor = Color.LightBlue;
        }
        else
        {
            dataGridView_Report.DataSource = null;
            dataGridView_Report.Rows.Clear();
        }
        con.Close();
    }
    catch (Exception es)
    {
        MessageBox.Show(es.Message);
    }
}

Опять же, при выполнении этого, он возвращает только 2 строки в сетке данных. Пока должно быть 3 строки.

Это таблицы:

enter image description here

enter image description here

1 Ответ

2 голосов
/ 03 мая 2020

Метод DbDataReader.Read переводит считыватель к следующей записи.

Невозможно перемотать считыватель данных. Любые методы, которым вы передаете его, должны будут использовать его из той записи, в которой он находится в данный момент.

Если вы хотите передать считыватель на DataTable.Load(), не Read из него самостоятельно. Если вы просто хотите узнать, содержит ли он записи, используйте HasRows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...