Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - C# Scrivere dati su database da excel
Forum - C# / VB.NET - C# Scrivere dati su database da excel - Pagina 4

Pagine: [ 1 2 3 4 5 ] Precedente | Prossimo
Avatar
wuolfit (Normal User)
Pro


Messaggi: 100
Iscritto: 19/07/2011

Segnala al moderatore
Postato alle 23:06
Giovedì, 27/07/2017
Beh l'errore l'ho scritto prima : "Index non compreso nell'intervallo. Richiesto valore non negativo e minore della dimensione della raccolta."
Mentre il codice e'

Codice sorgente - presumibilmente C#

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using System.Collections;
  11. using System.Data.SqlClient;
  12. using System.IO;
  13. using System.Data.OleDb;
  14. using Excel = Microsoft.Office.Interop.Excel;
  15. using System.Runtime.InteropServices;
  16. using System.Data.Common;
  17. using System.Web;
  18. using System.Security;
  19.  
  20.  
  21. namespace WindowsFormsApplication2
  22. {
  23.     public partial class Form1 : Form
  24.     {
  25.         //private string connstr;
  26.         private DataSet custDS;
  27.         private object parsedCustomerID;
  28.         private object txtCustomerID;
  29.  
  30.        
  31.  
  32.         [SerializableAttribute]
  33.         [ComVisibleAttribute(true)]
  34.         public class ArgumentNullException : ArgumentException
  35.         {
  36.             private DataSet custDS;
  37.  
  38.             public ArgumentNullException()
  39.             {
  40.             }
  41.  
  42.            
  43.  
  44.             public ArgumentNullException(string message) : base(message)
  45.             {
  46.             }
  47.  
  48.            
  49.         }
  50.  
  51.  
  52.  
  53.         public Form1()
  54.         {
  55.             InitializeComponent();
  56.         }
  57.  
  58.         public object ConfigurationManager { get; private set; }
  59.         public DataSet Dataset { get; private set; }
  60.  
  61.         private void btnScriviDb_Click(object sender, EventArgs e)
  62.         {
  63.             Excel.Application xlApp;
  64.  
  65.             Excel.Workbook xlWorkBook;
  66.  
  67.             Excel.Worksheet xlWorkSheet;
  68.  
  69.             Excel.Range range;
  70.  
  71.  
  72.  
  73.             string str;
  74.  
  75.             int rCnt;
  76.  
  77.             int cCnt;
  78.  
  79.             int rw = 0;
  80.  
  81.             int cl = 0;
  82.  
  83.  
  84.  
  85.             xlApp = new Excel.Application();
  86.  
  87.  
  88.                                            
  89.          xlWorkBook = xlApp.Workbooks.Open(@"c:\excel.xlsx", 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
  90.  
  91.             xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
  92.  
  93.             range = xlWorkSheet.UsedRange;
  94.  
  95.             rw = range.Rows.Count;
  96.  
  97.             cl = range.Columns.Count;
  98.  
  99.  
  100.             for (rCnt = 1; rCnt <= rw; rCnt++)
  101.  
  102.             {
  103.  
  104.                 for (cCnt = 1; cCnt <= cl; cCnt++)
  105.  
  106.                 {
  107.  
  108.                     str = (string)(range.Cells[rCnt, cCnt] as Excel.Range).Value2;
  109.  
  110.                    
  111.                     string connection = "User ID=nomeutente;Password=password;";
  112.                     connection += "database=BaseDati;server=server;";
  113.                     SqlConnection objSqlConnection = new SqlConnection(connection);
  114.                     // Apre la connessione
  115.                     objSqlConnection.Open();
  116.                     // Crea un DataSet (una cache) per memorizzare i dati da elaborare
  117.                     DataSet objDataSet = new DataSet(str);
  118.                     // Ora bisogna riempire la tabella, creando un
  119.                     // comando SELECT
  120.              
  121.  string cmd = string.Format("INSERT INTO rrPersone (nome,cognome,indirizzo, citta, provincia, cap, telefono) VALUES ('{0}','{1}','{2}', '{4}','{5}','{6}');", dataGridView1.Rows[rCnt].Cells[0].Value, dataGridView1.Rows[rCnt].Cells[1].Value, dataGridView1.Rows[rCnt].Cells[2].Value), dataGridView1.Rows[rCnt].Cells[3].Value, dataGridView1.Rows[rCnt].Cells[4].Value, dataGridView1.Rows[rCnt].Cells[5].Value), dataGridView1.Rows[rCnt].Cells[6].Value);
  122.                SqlCommand objOrderCommand = new SqlCommand(strOrders, objSqlConnection);
  123.                         // e un DataAdapter nel quale mappare la tabella
  124.                         SqlDataAdapter objOrdAdapter = new SqlDataAdapter();
  125.                         SqlDataAdapter adapter = new SqlDataAdapter();
  126.      
  127.                         // connettere il SqlCommand e l'SqlDataAdapter
  128.                         objOrdAdapter.SelectCommand = objOrderCommand;
  129.                         // e riempire il DataSet precedentemente creato
  130.                         objOrdAdapter.Fill(objDataSet);
  131.                         // Crea due DataColumn... si useranno più tardi...
  132.                         //DataColumn objDCParent;
  133.                         // DataColumn objDCChild;
  134.                         DataTable objOrdTable = objDataSet.Tables["rrPersone"];
  135.                        
  136.      
  137.                         DataTableMapping mapping =
  138.                         adapter.TableMappings.Add("Table", "rrRaccolta");
  139.                         mapping.ColumnMappings.Add("idRaccolta", "idNome");
  140.                         mapping.ColumnMappings.Add("idCognome", "idCitta");
  141.                         mapping.ColumnMappings.Add("idProvincia", "idCap");
  142.                         mapping.ColumnMappings.Add("idTelefono");
  143.      
  144.                    
  145.      
  146.                      DataTable table = new DataTable();
  147.                         table.Columns.Add("idRaccolta", typeof(int));  
  148.      
  149.      
  150.                        
  151.      
  152.                         // Imposta le modifiche
  153.                         string strUpDate = "UPDATE Orders SET ShipName = " + "'" + str + "'";
  154.                                strUpDate += " WHERE OrderID = " + str;
  155.                         string objRow = str;
  156.                         // Crea il comando SQL appropriato per l'aggiornamento
  157.                         objOrdAdapter.UpdateCommand = new SqlCommand(strUpDate, objSqlConnection);
  158.                         // Esegue l'aggiornamento
  159.                         //objRow.Insert(objDataSet, "rrRaccolta");
  160.                         objOrdAdapter.Update(objDataSet, "rrRaccolta");
  161.                                 break;
  162.                         // chiude la connessione al database
  163.                         objSqlConnection.Close();
  164.      
  165.                         string strAnswer = Console.ReadLine();
  166.      
  167.      
  168.             }
  169.      
  170.                 };
  171.      
  172.      
  173.      
  174.                 xlWorkBook.Close(true, null, null);
  175.      
  176.                 xlApp.Quit();
  177.      
  178.      
  179.      
  180.                 Marshal.ReleaseComObject(xlWorkSheet);
  181.      
  182.                 Marshal.ReleaseComObject(xlWorkBook);
  183.      
  184.                 Marshal.ReleaseComObject(xlApp);
  185.      
  186.      
  187.      
  188.             }
  189.         }
  190.         }


Ultima modifica effettuata da wuolfit il 27/07/2017 alle 23:20
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 23:31
Giovedì, 27/07/2017
Ti avevo chiesto

"indica la riga con l'errore"

ma continui a ripetere solo l'errore ... non mi pare di esprimermi in turco ...

Comunque, tutto il codice è - passami il francesismo - un gran casino, che non ha la minima possibilità di funzionare.
Basta pensare alla Open del DB fatta ad ogni riga/colonna (?), al miscuglio di UPDATE, INSERT, command non usati, tabelle, campi e chi più ne ha più ne metta tutto mischiato in maniera accurata ...

Allontanati dalla tastiera ...


Ultima modifica effettuata da nessuno il 27/07/2017 alle 23:40


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 2:08
Venerdì, 28/07/2017
Codice sorgente - presumibilmente C# / VB.NET

  1. string cmd = string.Format("INSERT INTO rrPersone (nome,cognome,indirizzo, citta, provincia, cap, telefono) VALUES ('{0}','{1}','{2}', '{4}','{5}','{6}');", dataGridView1.Rows[rCnt].Cells[0].Value, dataGridView1.Rows[rCnt].Cells[1].Value, dataGridView1.Rows[rCnt].Cells[2].Value), dataGridView1.Rows[rCnt].Cells[3].Value, dataGridView1.Rows[rCnt].Cells[4].Value, dataGridView1.Rows[rCnt].Cells[5].Value), dataGridView1.Rows[rCnt].Cells[6].Value);



Hai mai sentito parlare di sql injection?

Per quanto mi riguarda quel codice è una ciofeca e personalmente non perderei tempo a correggerlo: butterei via tutto e lo rifarei meglio tento a mente tre cose:
- i database relazionali vanno usati come tale, o almeno con criterio. Dati strettamente legati fra loro come il nome e il cognome di una persona devono essere colonne di una stessa tabella
- le connessioni non si chiudono e riaprono
- devi evitare sql injection e usare i metodi del driver per generare un comando che sarà ripetuto x volte cambiando ogni volta SOLO il valore dei parametri (maggiore semplicità, maggiori prestazioni, maggiore leggibilità, maggiore sicurezza)

Ultima modifica effettuata da TheDarkJuster il 28/07/2017 alle 2:14
PM Quote
Avatar
wuolfit (Normal User)
Pro


Messaggi: 100
Iscritto: 19/07/2011

Segnala al moderatore
Postato alle 8:39
Venerdì, 28/07/2017
TheDarkJuster come dicevo nel primo post che ho scritto : "Sono alle prime armi" quindi che il codice possa essere una ciofeca per usare i tuoi termini, me lo aspettavo, se scrivo qua è perché cerco un aiuto, che non è per forza avere la pappa pronta, ma può anche essere : "usa questo metodo" e poi mi arrangio io (se trovo la documentazione)!!!! Comunque Nessuno la riga è la 121 quella dove si trova insert sql

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 9:05
Venerdì, 28/07/2017
L'errore specifico è in rCnt che va oltre il numero di righe consentito

Ma non credere che aggiustandolo il programma funzioni perché ci sono mille problemi e andrebbe rifatto

Non ti si può suggerire nessun metodo ma solo di studiare Ado.Net da un libro da zero


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 9:50
Venerdì, 28/07/2017
Testo quotato

Postato originariamente da nessuno:

L'errore specifico è in rCnt che va oltre il numero di righe consentito

Ma non credere che aggiustandolo il programma funzioni perché ci sono mille problemi e andrebbe rifatto

Non ti si può suggerire nessun metodo ma solo di studiare Ado.Net da un libro da zero



Il mio codice è scritto bene e funziona al 100% su questo non ci piove.
Non scrivo codice tanto per scriverlo.

Gli errori possono essere diversi e non parlo solo di come è strutturata la query ma anche come
hai strutturato le tabelle sul database.

un esempio e passare un valore int al posto di string.

l'errore che hai mostrato dice chiaramente quello detto da nessuno.
che và oltre il limite perchè?

te lo dico io il perché...


Codice sorgente - presumibilmente C# / VB.NET

  1. for (rCnt = 1; rCnt <= rw; rCnt++)
  2.  
  3.             {




Perché fai partire rCnt da 1 invece che di 0.
già questo è il primo errore.

Ci sono poi svariati modi per fare ciò che stai facendo.
Un Enumeratore, una lista basata su una struttura, sfruttare il Linq, etc.

Ma se sei alle prime armi è inutile porre discorsi dove non capiresti nemmeno come muoverti.
Ma ti consiglio nuovamente di ascoltare ciò che abbiamo da darti.

Rifai tutto da 0, e cerca di dare un criterio a ciò che scrivi.
Commentando magari ogni riga o funzione, e mostrare codice più ordinato.

Poi usa il Debugger, Hanno inventato un sistema così bello ma che nessuno usa...

@TheDarkJuster

Perché dici ciò?
E piu leggebile cm = "Insert into blabla (a,b,c)" +  dataGridView1.Rows[rCnt].Cells[0].Value ecc ecc?
Non credo...

Cmq elimina quel macello e prova a dare un semplice MessageBox
Di

dataGridView1.Rows[0].Cells[0].Value

Vedi che ti funziona e ti accorgerai che sbagli nell'indice.
Ma soprattutto prima di puntare il dito controlla
Che lo sbaglio dipenda da te.

PS:
Accanto a Value aggiungi ToString altrimenti avrai un altro
Errore.

dataGridView1.Rows[0].Cells[0].Value.ToString()

Ultima modifica effettuata da Thejuster il 28/07/2017 alle 10:27


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 18:30
Venerdì, 28/07/2017
È più leggibile se non ti crei le query come concatenazione di stringa, ma usi i componenti preposti. In PHP esiste pdo che comunque è molto semplice ed efficace nel riutilizzare i comandi (statement)

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 18:36
Venerdì, 28/07/2017
Per le query si usano i Parameters per evitare problemi di conversione di formato e di sicurezza (attacchi sql injection).

Non si usano stringhe formate in quel modo.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Pagine: [ 1 2 3 4 5 ] Precedente | Prossimo