C# 将数据库mdb导入Sql Server时出错
你好,我在这个c代码上有一个错误,我在代码上有一个异常:MessageBox.Show(“Salto sulla query 3”+ex),但我不明白为什么,我加载了下面生成的异常图像,你能帮我吗谢谢C# 将数据库mdb导入Sql Server时出错,c#,sql-server,sqlbulkcopy,C#,Sql Server,Sqlbulkcopy,你好,我在这个c代码上有一个错误,我在代码上有一个异常:MessageBox.Show(“Salto sulla query 3”+ex),但我不明白为什么,我加载了下面生成的异常图像,你能帮我吗谢谢 MessageBox.Show("Aggiorno Articoli "); //APRO LA CONNESSIONE AL FILE dbConn = new OleDbConnection(@"Provider = Mic
MessageBox.Show("Aggiorno Articoli ");
//APRO LA CONNESSIONE AL FILE
dbConn = new OleDbConnection(@"Provider = Microsoft.Jet.OLEDB.4.0; Data Source=" + dialog.FileName + "; Persist Security Info = False; Jet OLEDB:Database Password = " + textBoxPwdComet.Text + "; Mode = Share Deny None");
//APRO LA CONNESSIONE
SqlConnection conn = db.apriconnessione();
//CREO LA TABELLA TEMPORANEA
String QueryTemp = "CREATE TABLE TabellaTemp(CODMARCA varchar(MAX),CODART varchar(MAX),DESCR varchar(MAX),UM varchar(MAX),PRZNETTO money,PRZCASA money,DATAAGG datetime,);";
SqlCommand cmdTemp = new SqlCommand(QueryTemp, conn);
cmdTemp.ExecuteNonQuery();
//COPIA DEI DATI NELLA TABELLA TEMPORANEA
string query = "SELECT CODMARCA,CODART,DESCR,UM,PRZNETTO,PRZCASA,DATAAGG FROM ARTICOLI";
OleDbDataAdapter da = new OleDbDataAdapter(query, dbConn);
DataTable dt = new DataTable();
da.Fill(dt);
SqlBulkCopy bulk = new SqlBulkCopy(conn);
bulk.DestinationTableName = "TabellaTemp";
bulk.WriteToServer(dt);
//Setto tutti gli articoli come non disponbili(QUELLI COMET)
try
{
String Query2 = "Update Articolo set Stato = 'Nondisponibile' where Importato = 'COMET' ";
cmdTemp = new SqlCommand(Query2, conn);
cmdTemp.ExecuteNonQuery();
}
catch(Exception ex)
{
MessageBox.Show("Salto su query 2");
}
//Aggiorno gli articoli, quelli che non vengono aggiornati non sono più disponbili
try {
String Query3 = "Update Articolo set Articolo.Stato = 'Disponibile',Articolo.Prezzo = TabellaTemp.PRZNETTO,Articolo.PrezzoListino = TabellaTemp.PRZCASA,Articolo.DataAggiornamento = TabellaTemp.DATAAGG,Articolo.Descrizione = TabellaTemp.DESCR,Articolo.UM = TabellaTemp.UM from Articolo inner join TabellaTemp on TabellaTemp.CodMarca = Articolo.CodMarca and TabellaTemp.CODART = Articolo.CodArt where Articolo.Importato = 'COMET' ";
cmdTemp = new SqlCommand(Query3, conn);
cmdTemp.ExecuteNonQuery();
}
catch(Exception ex)
{
MessageBox.Show("Salto sulla query 3 "+ex);
}
//FINE COPIA DATI TABELLA TEMPORANEA
//ELIMINO LA TABELLA TEMPORANEA
QueryTemp = "DROP TABLE TabellaTemp";
cmdTemp = new SqlCommand(QueryTemp, conn);
cmdTemp.ExecuteNonQuery();
//FINE
conn.Close();
MessageBox.Show("Aggiornamento Articoli terminato!! ");
CaricamentoDataGridNonDisponbili();
例外情况:
首先尝试将命令对象设置为“无”
cmdTemp = Nothing;
如果这不能解决问题,那么请尝试调查查询3的更新查询超时的原因。我首先将UPDATE语句转换为SELECT语句。验证您是否得到了结果,并且您的查询没有对服务器造成负担
SELECT a.Stato, a.Prezzo, a.PrezzoListino, a.DataAggiornamento, a.Descrizione, a.UM,
t.PRZNETTO, t.PRZCASA, t.DATAAGG, t.DESCR, t.UM
FROM Articolo a
INNER JOIN TabellaTemp t on t.CodMarca = a.CodMarca
and t.CODART = a.CodArt
WHERE a.Importato = 'COMET'
如果您的SELECT语句工作正常,那么我打赌您的更新需要更多的时间来运行。我相信您的命令的超时属性是30秒。您可以将其默认为0,以运行任意长的时间,但我会小心这样做。试着玩弄timeout语句。这会帮你解决问题的
String Query3 = "Update Articolo set Articolo.Stato = 'Disponibile',Articolo.Prezzo = TabellaTemp.PRZNETTO,Articolo.PrezzoListino = TabellaTemp.PRZCASA,Articolo.DataAggiornamento = TabellaTemp.DATAAGG,Articolo.Descrizione = TabellaTemp.DESCR,Articolo.UM = TabellaTemp.UM from Articolo inner join TabellaTemp on TabellaTemp.CodMarca = Articolo.CodMarca and TabellaTemp.CODART = Articolo.CodArt where Articolo.Importato = 'COMET' ";
cmdTemp = Nothing;
cmdTemp = new SqlCommand(Query3, conn);
// Setting command timeout to 2 minutes
cmdTemp.CommandTimeout = 120;
cmdTemp.ExecuteNonQuery();
如果这能解决问题,我会诚实地让你的UPDATE语句以更理想的速度运行。你的查询超时了,即:没有在默认的30秒内完成。将CommandTimeout设置为更高的值不是一个好的做法。要真正解决这个问题,您需要为所有涉及的表提供表模式(索引,如果有的话)。基于此,您需要使用适当的索引优化查询以更快地运行。您是否尝试过使用bulkCopy.BulkCopyTimeout属性?@HKImpact否我不知道它是什么默认超时设置为30秒。如果查询需要更多时间,则需要使用BulkCopyTimeout属性。尝试将其设置为60秒。bulkCopy.BulkCopyTimeout=60@HKImpact现在我试着告诉你,谢谢you@HKImpact我尝试过,但我总是生成相同的异常,我在query3上遇到的问题是,未命中批量复制我尝试了查询选择它有效,然后我尝试添加到查询3,cmdTemp.CommandTimeout=120,但我没有,然后我尝试设置cmdTemp.CommandTimeout=0,但仍然被卡住,数据库上没有生命迹象,这不会改变任何事情!但查询未完成其executionTry设置cmdTemp为nothing。我重新更新了我的答案以反映这一变化。我试图输入nothing(null),但没有任何变化,继续被阻止。我已经增加了sql server机器的ram,现在开始了,谢谢