| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  15-05-2009, 01:37 | #1 | 
| Junior Member Iscritto dal: Mar 2008 
					Messaggi: 12
				 | 
				
				Problema su come esportare dati dal c# a file excel.
			 
		Salve a tutti gente, avrei un problema. In pratica non riesco a capire perchè non si riesce a copiare un determinata porzione di testo di una certa dimensione, cioè se da prog. tento di scrivere su file excel (ad es. come faccio dal mio programma copiare una trama di un film abb. lunga), mi da un'eccezione, impossibile incollare il testo oppure accorciare i dati; questo è molto strano perchè se faccio una copia manuale della trama, ovviamente me la copia, perchè allora da codice mi lancia questa eccezione? qualche soluzione? Inoltre, ho provato a spezzare in tanti pezzi utilizzando delle substring() da mettere su più colonne, in modo da evitare l'eccezione descritta prima, ma ho qualche problema nel dividere in tante parti la trama (problemi di diviosne corretta del testo, parole che si ripeto tra una substring() e l'altra), qualche soluzione anche per questo problema? Grazie per la vostra attenzione. Ciaooo Questo è il codice (di base) per inserire i dati nel file excel.... non farci caso a eventuali errori di sintassi! conn2 = new OleDbConnection(); conn2.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FilePath + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES\""; conn2.Open(); cmd2 = new OleDbCommand(); cmd2.Connection = conn2; int cont=0; string query = "SELECT Trama FROM prova"; cmd = new SqlCommand(query, conn); adapter = new SqlDataAdapter(cmd); adapter.Fill(ds, "prova"); string trama = ""; while (ds.Tables[0].Rows.Count > cont) { trama=ds.Tables[0].Rows[cont]["Trama"].ToString(); cmd2.CommandText = "INSERT INTO [Foglio1$] (Trama) VALUES ('" + eliminApice(trama) + "')"; MessageBox.Show(cmd2.CommandText); cmd2.ExecuteNonQuery(); cont++; } cmd2.Dispose(); cmd2 = null; conn2.Dispose(); conn2 = null; Funziona il codice, il problema è che se importo su excel da programma una porzione di testo troppo grande scatta una eccezione... Grazie a tutti anticipatamente.. Ciaoooooo   | 
|   |   | 
|  15-05-2009, 08:22 | #2 | |
| Senior Member Iscritto dal: Dec 2004 
					Messaggi: 3210
				 | Quote: 
 Concatenare semplicemente una stringa come "Trama", che può contenere parecchi caratteri "speciali", come doppie virgolette, apici, slash ecc... conduce proprio a questo genere di errori in fase di esecuzione. Io non penso sia colpa della lunghezza della stringa Trama, ma solo della tecnica che usi. La tecnica più corretta è utilizzare i Parameters dell'oggetto Command, nel tuo caso ed esempio : Codice: cmd2.Parameters.Add("@Trama", OleDb.OleDbType.VarChar);Codice: cmd2.Parameters.Add("@Trama", OleDb.OleDbType.LongVarChar);Codice: cmd2.Parameters("@Trama").Value = <valore estratto dal DataSet...>;Codice: cmd2.CommandText = "INSERT INTO [Foglio1$] (Trama) VALUES (@Trama);  P.S.: Immagino tu avessi già pensato a qualcosa di simile con quella funzione "eliminApice(trama)", ma forse non è sufficiente, mentre il Parameter solitamente è infallibile, perciò ne potrai fare a meno.   | |
|   |   | 
|  15-05-2009, 12:41 | #3 | 
| Junior Member Iscritto dal: Mar 2008 
					Messaggi: 12
				 | 
		questo è il codice che ho modificato secondo i tuoi suggerimenti, ma sono sorti due problemi. 1) mi copia solamente la prima trama e poi la duplica tante quante sono le trame da importare, in pratica non mi inserisce la trama successiva. 2)Man mano che faccio delle prove, nel file excel i dati vengo shiftati sempre più in basso, e non capisco il perchè? Mi puoi aiutare? Ti ringrazio int cont = 0; while (ds.Tables[0].Rows.Count > cont) { string trama = ds.Tables[0].Rows[cont]["Trama"].ToString(); cmd2.CommandText = "INSERT INTO [Foglio1$] (Trama) VALUES (@Trama)"; OleDbParameter TramaParamater = cmd2.Parameters.AddWithValue("@Trama", OleDbType.LongVarChar); TramaParamater.Direction = ParameterDirection.Input; TramaParamater.Value = trama; MessageBox.Show("Count: " + cont + " - Trama: " + TramaParamater.Value.ToString()); cmd2.ExecuteNonQuery(); cont++; } cmd2.Dispose(); cmd2 = null; conn2.Dispose(); conn2 = null; | 
|   |   | 
|  15-05-2009, 13:39 | #4 | 
| Senior Member Iscritto dal: Dec 2004 
					Messaggi: 3210
				 | 
		No, non così. La definizione del Command e dei suoi attributi al di fuori del ciclo, altrimenti ad ogni passaggio continui ad accodare un nuovo parametro ( io infatti non ti ho detto di usare .AddWithValue ). Se applichi alla lettera quanto ti avevo consigliato, il risultato dovrebbe essere qualcosa come : Codice: // definizione cmd2 ...
cmd2.CommandText = "INSERT INTO [Foglio1$] (Trama) VALUES (@Trama)";
cmd2.Parameters.Add("@Trama", OleDb.OleDbType.LongVarChar);
int cont = 0;
while (ds.Tables[0].Rows.Count > cont)
{
string trama = ds.Tables[0].Rows[cont]["Trama"].ToString();
cmd2.Parameters("@Trama").Value = trama;
MessageBox.Show("Count: " + cont + " - Trama: " + TramaParamater.Value.ToString());
cmd2.ExecuteNonQuery();
cont++;
}
// libero le risorse... | 
|   |   | 
|   | 
| Strumenti | |
| 
 | 
 | 
Tutti gli orari sono GMT +1. Ora sono le: 09:10.









 
		 
		 
		 
		








 
  
 



 
                        
                        










