Не работает оператор AS при выводе в excel из таблицы mysql

private static void ReleaseObject(object obj)
    {
        try
        {
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
            obj = null;
        }
        catch (Exception ex)
        {
            obj = null;
            MessageBox.Show("Exception Occured while releasing object " + ex.ToString());
        }
        finally
        {
            GC.Collect();
        }
    }

    public static void CreateReport(string cmd, string finame, string _finame, string folderstr, string conn, bool OpenAftCreate)
    {
        FileInfo fi = new FileInfo(folderstr);
        if (fi.Exists)
        {
            DialogResult result = MessageBox.Show(
              "Файл уже существует. Заменить?",
              "Сообщение",
              MessageBoxButtons.YesNo,
              MessageBoxIcon.Information,
               MessageBoxDefaultButton.Button1,
              MessageBoxOptions.DefaultDesktopOnly);
            //System.Diagnostics.Process.Start(FolderStr);
            if (result == DialogResult.Yes)
            {
                fi.Delete();
            }
            else { return; }
        }

        MySqlConnection cnn;
        string sql = null;
        string data = null;
        int i = 0;
        int j = 0;
        string path = Environment.CurrentDirectory;
        //ErrDataMsg("", path);
        Excel.Application xlApp;
        Excel.Workbook xlWorkBook;
        Excel.Worksheet xlWorkSheet;
        object misValue = System.Reflection.Missing.Value;

        xlApp = new Excel.Application();
        xlWorkBook = xlApp.Workbooks.Add(misValue);
        xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

        cnn = new MySqlConnection(conn);
        cnn.Open();
        sql = cmd;
        MySqlDataAdapter dscmd = new MySqlDataAdapter(sql, cnn);
        DataSet ds = new DataSet();
        dscmd.Fill(ds);

        for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
        {
            for (j = 0; j <= ds.Tables[0].Columns.Count - 1; j++)
            {
                data = ds.Tables[0].Rows[i].ItemArray[j].ToString();
                xlWorkSheet.Cells[i + 1, j + 1] = data;
            }
        }
        try
        {
            xlWorkBook.SaveAs(finame, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
        }
        catch { ErrDataMsg("Ошибка", "Не удалось получить доступ к файлу"); };
        xlWorkBook.Close(true, misValue, misValue);
        xlApp.Quit();

        ReleaseObject(xlWorkSheet);
        ReleaseObject(xlWorkBook);
        ReleaseObject(xlApp);

        MessageBox.Show("Объект успешно создан в папке документы");
        if (OpenAftCreate)
        {
            System.Diagnostics.Process.Start("C:\\Users\\" + Environment.UserName + "\\Documents\\" + _finame);
        }
    }
string pqsum = "select FullName as ФИО, Pnum as Номер, zp as ЗП, _month as Месяц from Payts;";
private void MonRep_Click(object sender, EventArgs e)
    {
        CreateReport(pqsum, @"ИТОГИ", s_finame, sFolderStr, conn, OpenAftCreate.Checked);
    }

У меня есть идея как это сделать, для этого нужно будет как-бы "слепить" запросом 2 таблицы, в одной из которых будут хранится имена столбцов, а в другой сами данные, но я не знаю как такое сделать и можно ли вообще. На скрине видно, что имен у столбцов нет.введите сюда описание изображения


Ответы (1 шт):

Автор решения: teran

можно пойти как минимум двумя путями. первый, наверное, более корректный будет отдельным запросом выбрать и вписать в тело таблицы заголовки. второй - вы можете использовать оператор UNION и выбрать первой строкой заголовки таблицы (тут вообще вопрос, обязательно ли строка заголовков, выбранная первым select будет идти первой в результирующем наборе. в целом подозреваю, это не гарантируется).
Второй нюанс - заголовки это строки, поэтому все поля во втором селекте данных также придется приводить к строковым типам данных.

SELECT 'name' AS name
      ,'phone' as phone
      ,'int_value' as someIntField
UNION
SELECT name, phone, cast(int_col as varchar)
→ Ссылка