Конвертировать из ExecuteScalar в ExecuteReader - PullRequest
0 голосов
/ 21 марта 2019

У меня есть этот код, который может печатать только первую строку того, что находится в DataGrid, мне нужно "напечатать" каждую строку , которая находится в этом DataGrid

private void btnPrint_Click(object sender, RoutedEventArgs e)
    {

     try
        {
            //NON FUNZIONA ANCORA COME VORREI PERCHE INNANZITUTTO PRENDE IN CONSIDERAZIONE SOLO I DATI DELLA PRIMA RIGA(LO FA SOLO PERCHE L'HO INGANNATO) 
            //SE NO NON FAREBBE NEANCHE CIO' INOLTRE SE ESISTONO DUE ISTANZE DELLO STESSO ITEM PRENDENDO IN CONSIDERAZIONE SOLO LA PRIMA LA SECONDA PER LUI NON ESISTE.

            if (!Directory.Exists(@"D:/Reports"))//controllo l'esistenza della directory di destinazione dei file generati
            {
                Directory.CreateDirectory(@"D:/Reports");//se non esiste la crea
            }

            string datoR, datoI, datoN;

            //stamp id
            SqlCommand Cmd = new SqlCommand("SELECT tabStoricoDetail.id FROM tabStoreExec JOIN tabStoricoDetail ON tabStoreExec.idSE=tabStoricoDetail.id WHERE tabStoricoDetail.NomeItem LIKE '" + this.txtSrcVR.Text + "'", sqliteCon);

            Cmd.Connection.Open();
            datoI = Cmd.ExecuteScalar().ToString();//cio che mi permette di stampare almeno un valore


            var filename = string.Concat("Filename", DateTime.Now.ToString("ddMMyyHHmmss"), ".txt");//THIS STRING ALLOW TO BUILD FILES EVERY TIME THE USER CHANGE ITEM AND WANTO TO PRINT IT
            TextWriter tw = new StreamWriter("D:/Reports/" + filename, true);//per scrivere id pt1
            tw.WriteLine(datoI);//per scrivere id pt2
            tw.Close();//per scrivere id pt3
            Cmd.Connection.Close();


            //stampa nome
            SqlCommand Cmd1 = new SqlCommand("SELECT tabStoricoDetail.NomeItem FROM tabStoreExec JOIN tabStoricoDetail ON tabStoreExec.idSE=tabStoricoDetail.id WHERE tabStoricoDetail.NomeItem LIKE '" + this.txtSrcVR.Text + "'", sqliteCon);

            Cmd1.Connection.Open();
            datoN = Cmd1.ExecuteScalar().ToString();//cio che mi permette di stampare almeno un valore


            TextWriter tw1 = new StreamWriter("D:/Reports/" + filename, true);//per scrivere id pt1

            tw1.WriteLine(datoN);//per scrivere nome pt2
            tw1.Close();//per scrivere nome pt3
            Cmd1.Connection.Close();


            //stampa result
            SqlCommand Cmd2 = new SqlCommand("SELECT " +
                 "tabStoricoDetail.ResItemDet " +
                 "FROM tabStoreExec " +
                 "JOIN tabStoricoDetail " +
                 "ON tabStoreExec.idSE=tabStoricoDetail.id WHERE tabStoricoDetail.NomeItem LIKE '" + this.txtSrcVR.Text + "'", sqliteCon);
            Cmd2.Connection.Open();
            datoR = Cmd2.ExecuteScalar().ToString();//cio che mi permette di stampare almeno un valore

            TextWriter tw2 = new StreamWriter("D:/Reports/" + filename, true);//per scrivere id pt1

            tw2.WriteLine(datoR);//per scrivere il result pt2
            tw2.Close();//per scrivere il result pt3
            Cmd2.Connection.Close();



            MessageBox.Show("File Created Successfully");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        sqliteCon.Close();
    }

Я только хочу преобразовать ExecuteScalar s в ExecuteReader s, но я не могу понять, как использовать ExecuteReader s вместо ExecuteScalar s, не нарушая все. Конечная цель состоит в том, чтобы напечатать все в DataGrid в файл .txt Пожалуйста помоги Вот куда я прибыл

sqliteCon.Open();

            var filename = string.Concat("Filename", DateTime.Now.ToString("ddMMyyHHmmss"), ".txt");//THIS STRING ALLOW TO BUILD FILES EVERY TIME THE USER CHANGE ITEM AND WANTO TO PRINT IT

            string datoR, datoN;



            //DONE: Keep SQL readable
                string Cmd =
                @"SELECT tabStoricoDetail.id
                FROM tabStoreExec JOIN 
                tabStoricoDetail ON tabStoreExec.idSE = tabStoricoDetail.id 
                WHERE tabStoricoDetail.NomeItem LIKE @prmNome";

            //DONE: wrap IDisposable into using
            using (SqlCommand Cmd = new SqlCommand(Cmd, sqliteCon))
            {
                Cmd.Parameters.AddWithValue("@prmNome", this.txtSrcVR.Text);


                using (var reader = Cmd.ExecuteReader())
                {
                    //DONE: do not concat strings but use Path.Combine
                    string file = Path.Combine(@"D:\Reports", filename);

                    using (TextWriter tw = new StreamWriter(file, true))
                    {
                        while (reader.Read())
                        {
                            //DONE: Convert.To is a safier (culture independent) approach then .ToString()
                            string datoI = Convert.ToString(reader[0]);

                            tw.WriteLine(datoI);
                        }
                    }
                }

            }

1 Ответ

2 голосов
/ 21 марта 2019

Вы должны реализовать цикл поверх записей

 // Open reader
 using (var reader = Cmd.ExecuteReader()) {
   // Read while cursor has records to fetch 
   while (reader.Read()) {
     // current record read
     string datoI = Convert.ToString(reader[0]);
     // which we append to file
     tw1.WriteLine(datoI);  
   }
 }  

Дополнительный код:

 sqliteCon.Open();

 ...

 //DONE: Keep SQL readable
 string query = 
    @"SELECT tabStoricoDetail.id
        FROM tabStoreExec JOIN 
             tabStoricoDetail ON tabStoreExec.idSE = tabStoricoDetail.id 
       WHERE tabStoricoDetail.NomeItem LIKE @prmNome";

 //DONE: wrap IDisposable into using
 using (SqlCommand command = new SqlCommand(query, sqliteCon)) {
   //DONE: paramterize the query, do not hardcode it
   //TODO: .Add(value, rdbmsType); is a better approach then .AddWithValue(value);
   command.Parameters.AddWithValue("@prmNome", this.txtSrcVR.Text);

   using (var reader = command.ExecuteReader()) {
     //DONE: do not concat strings but use Path.Combine
     string file = Path.Combine(@"D:\Reports", filename);  

     using (TextWriter writer = new StreamWriter(file, true)) {   
       while (reader.Read()) {
         //DONE: Convert.To is a safier (culture independent) approach then .ToString()
         string record = Convert.ToString(reader[0]);

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