SQL Serverへのデータベースmdbのインポートエラー

c# sqlbulkcopy sql-server

質問

こんにちは私はこのC#コードでエラーが発生しました。私はコード上で例外があります:MessageBox.Show( "Salto sulla query 3" + ex)、なぜか、私は以下で生成された例外画像をロードしました。感謝を助けてください。

  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();

例外:

ここに画像の説明を入力

受け入れられた回答

あなたの質問はタイムアウトしています:つまり、デフォルトでは30秒で完了していません。 CommandTimeoutを高い値に設定するのは良い方法ではありません。これを実際に修正するには、関連するすべてのテーブルのテーブルスキーマ(存在する場合はインデックス)を提供する必要があります。それに基づいて、適切な索引付けを使用してより速く実行するように照会を最適化する必要があります。


人気のある回答

まずコマンドオブジェクトを何も設定しないでください。

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ステートメントが正常に動作している場合、UPDATEを実行するにはさらに時間が必要です。あなたのコマンドのtimeoutプロパティは30秒だと思います。あなたは望みどおりに実行するためにこれをデフォルトに0にすることができますが、それには注意が必要です。タイムアウトステートメントを試してみてください。これはあなたのために物事を修正する必要があります。

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文をより最適な速度で実行するように働きかけます。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ