Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
App. WinForms / WPF .NET
Uso dei dataAdapter e dataset
lunedì 20 maggio 2013 - 13.54
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
Elenco Tags
C#
|
.NET 3.5
|
Windows 7
|
Visual Studio 2008
|
MySQL 5.5
|
Office 2010
|
Office 2003
|
Office 2000
slavishdany
Profilo
| Newbie
28
messaggi | Data Invio:
lun 20 mag 2013 - 13:54
Buongiorno a tutti,
vi spiego al volo la mia problematica. Io ho un programma online che gira in php, sostanzialmente una parte di questo programma importa dei file xls nel suo db, li elabora e li presenta al cliente. Il problema è che questo programma non funziona quando il file xls ha troppe righe, quindi attualmente quando il cliente deve importare i file chiama me, io li importo con navicat con l'import wizard , dopo di che ho delle mie funzioni che elaborano i dati e tutto torna come prima.
Ho avuto l'idea di creare un programmino C# che fa l'importazione dei dati da xls nel db destinatario. Attualmente, apro l'xls e popolo un dataset. Il mio problema è trasportare il dataset nel db mysql destinatario. vi posto ciò che ho fatto attualmente
//Apro la connessione OLEDB al file Excel
OleDbConnectionStringBuilder builder = new OleDbConnectionStringBuilder();
builder.DataSource = nome;
builder.Provider = "Microsoft.Jet.OLEDB.4.0";
builder["Extended Properties"] = "Excel 8.0;HDR=Yes;IMEX=1";
this.Invoke(myDelegate,"Sto aprendo il file " + nome) ;
string connection = builder.ConnectionString.ToString();
OleDbConnection conn = new OleDbConnection(connection);
DataTable dt = null;
string nomeFoglio = "";
try
{
conn.Open();
dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
String[] excelSheets = new String[dt.Rows.Count];
int y = 0;
// Add the sheet name to the string array.
foreach (DataRow row in dt.Rows)
{
excelSheets[y] = row["TABLE_NAME"].ToString();
y++;
}
nomeFoglio = excelSheets[0];
this.Invoke(myDelegate,"File " + nome + " aperto");
this.Invoke(myDelegate, excelSheets[0]);
}
catch (OleDbException ex)
{
MessageBox.Show(ex.Message);
}
OleDbCommand mycommCount = new OleDbCommand("SELECT count(*) from [" + nomeFoglio+ "]" , conn);
OleDbDataReader myreadCount = mycommCount.ExecuteReader();
myreadCount.Read();
int righexls = myreadCount.GetInt32(0);
this.Invoke(myDelegate2, "Righe trovate " + righexls);
OleDbDataAdapter dba = new OleDbDataAdapter("SELECT * FROM [" + nomeFoglio+ "]", conn);
DataSet ds = new DataSet();
dba.Fill(ds);
//Creo e apro la connessione al db destinatario
MySqlConnectionStringBuilder builderStr = new MySqlConnectionStringBuilder();
builderStr.Server = "localhost";
builderStr.UserID = "root";
builderStr.Password = "test";
builderStr.Database = "test";
string mysqlConnStr = builderStr.ConnectionString;
MySqlConnection mysqlConn = new MySqlConnection(mysqlConnStr);
this.Invoke(myDelegate, "Apro la connessione al DB ");
try
{
mysqlConn.Open();
this.Invoke(myDelegate,"Connessione al DB aperta");
}
catch (MySqlException ex)
{
this.Invoke(myDMessaggi,ex.Message);
}
//Creo la tabella di destinazione in base alla tabella lingue presente nel db , poichè il file xls si presenta con la stessa struttura
string sqlLingue = "SELECT count(id) from lingue";
MySqlCommand mycommLingue = new MySqlCommand(sqlLingue, mysqlConn);
MySqlDataReader myreadLingue = mycommLingue.ExecuteReader();
myreadLingue.Read();
int lingue = myreadLingue.GetInt32(0);
string sqlstring = "DROP TABLE IF EXISTS `articoliXls`;CREATE TABLE `articoliXls` (";
string stringheIns = "";
int i = 0;
for(i=0;i<lingue;i++)
{
sqlstring += "`" + ds.Tables[0].Columns[i].ToString() + "` varchar(255) DEFAULT NULL,";
stringheIns += ds.Tables[0].Columns[i].ToString() + ";";
}
myreadLingue.Close();
sqlstring = sqlstring.Remove(sqlstring.Length - 1, 1);
sqlstring += ") ENGINE=MyISAM DEFAULT CHARSET=utf8;";
MySqlCommand mysqlComm = new MySqlCommand(sqlstring, mysqlConn);
mysqlComm.ExecuteNonQuery();
try
{
//Provo a popolare la tabella con il dataset estratto in precendeza.
MySqlDataAdapter dbm ;
dbm = new MySqlDataAdapter("SELECT * FROM articoliXls",mysqlConn);
MySqlCommandBuilder cmdbild = new MySqlCommandBuilder();
cmdbild.DataAdapter = dbm;
this.Invoke(myDMessaggi, cmdbild.GetInsertCommand().CommandText);
dbm.InsertCommand = cmdbild.GetInsertCommand();
dbm.Update(ds);
this.Invoke(myDelegate, "Tabella popolata");
}
catch (MySqlException ex)
{
this.Invoke(myDMessaggi, ex.Message);
}
Sostanzialmente avrei potuto fare due cicli per inserire i dati tramite query, però presenta due problemi. Mysql va fuori tempo massimo, e poi siccome nel file xls ci sono dei caratteri giapponesi, cinesi e russi non me li codifica, in questo modo teoricamente dovrebbe perchè li prende da una parte e li sbatte dall'altra.
Quello che non va è che comunque non popola la tabella "articoliXls" . sono due giorni che ci sto impazzendo. Secondo voi cosa potrebbe essere?
Grazie mille
Danilo
Torna su
Stanze Forum
Elenco Threads
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?
Dopo esserti registrato potrai chiedere
aiuto sul nostro
Forum
oppure aiutare gli altri
Consulta le
Stanze
disponibili.
Registrati ora !