2011-04-14 48 views
1

我正在使用ReportViewer開發一些報告,並且在某些時候我必須連接到Oracle數據庫才能檢索某些數據並將其存儲在DataTable中。填寫DataTable時「嘗試讀取或寫入受保護的內存」

當DataAdapter的執行Fill方法我得到這個錯誤:

「試圖讀取或寫入保護內存這通常是指示其他內存已損壞」

下面的代碼(可惜的是我不能忍受的是SQL代碼的程序或裏面的東西):

OleDbConnection objConn = new OleDbConnection(ConfigurationManager.ConnectionStrings["Premio"].ConnectionString); 
     OleDbCommand objCmd = new OleDbCommand(); 
     DataTable objDt = new DataTable(); 
int vTipoTerr = LoadTipoTerritorio(ReportParameter.ReportData.Parameters.Item("pTerritorio").Value.ToString()); 
      string vDataParametroDataFinal = ReportParameter.ReportData.Parameters.Item("pMesAnoCompetencia").Value.ToString(); 
      int vDataInicial = int.Parse(vDataParametroDataFinal.Substring(0, 4)); 
      vDataInicial = vDataInicial - 1; 
      vDataInicial = int.Parse(vDataInicial.ToString() + vDataParametroDataFinal.Substring(4, 2)); 


objCmd.CommandText = "SELECT T.Nome, " + 
           "   T.Prontuario, " + 
           "   C.Cobertura, " + 
           "   Cn.Mesano_competencia, " + 
           "  G.Grupo, " + 
           "  T.Territorio, " + 
           "  N.Negocio " + 
           "  FROM Calculo C " + 
           " Inner Join Territorio T " + 
           "  ON C.Id_Territorio = T.Id_Territorio " + 
           " Inner Join Grupo G " + 
           "  ON C.Id_Grupo = G.Id_Grupo " + 
           " Inner Join Cenario Cn " + 
           "  On Cn.Id_cenario = C.Id_cenario " + 
           " Inner Join Negocio N " + 
           "  On Cn.Id_negocio = N.Id_negocio " + 
           " Where Cn.Mesano_competencia Between :p1 And :p2 --datas " + 
           "  And G.Grupo = :p3 " + 
           "  And Sub_terr(T.Territorio, Decode(:p4, 1, 'SETOR', 2, 'DISTRITO', 3, 'REGIONAL')) = :p5 " + 
           "  And (Cn.Flag_cenario_disp = 1 Or Cn.Flag_cenario_disp_rec = 1) " + 
           "  And N.Negocio = :p6 " + 
           "  And Cn.Flag_recuperacao = 0 " + 
           "  Order By Cn.Mesano_competencia; " + 
           "union all " + 
           "SELECT T.Nome, " + 
           "  T.Prontuario, " + 
           "  C.Cobertura, " + 
           "  Cn.Mesano_competencia, " + 
           "  G.Grupo, " + 
           "  T.Territorio, " + 
           "  N.Negocio " + 
           "  FROM Calculo_Rec C " + 
           " Inner Join Territorio T " + 
           "  ON C.Id_Territorio = T.Id_Territorio " + 
           " Inner Join Grupo G " + 
           "  ON C.Id_Grupo = G.Id_Grupo " + 
           " Inner Join Cenario Cn " + 
           "  On Cn.Id_cenario = C.Id_cenario " + 
           " Inner Join Negocio N " + 
           "  On Cn.Id_negocio = N.Id_negocio " + 
           " Where Cn.Mesano_competencia Between :p1 And :p2 " + 
           "  And G.Grupo = :p3 " + 
           "  And Sub_terr(T.Territorio, Decode(:p4, 1, 'SETOR', 2, 'DISTRITO', 3, 'REGIONAL')) = :p5 " + 
           "  And (Cn.Flag_cenario_disp = 1 Or Cn.Flag_cenario_disp_rec = 1) " + 
           "  And N.Negocio = :p6 " + 
           "  And Cn.Flag_recuperacao = 1 " + 
           "  Order By Cn.Mesano_competencia "; 
objCmd.Parameters.Add(new OleDbParameter("p1", OleDbType.Integer)).Value = vDataInicial; 
      objCmd.Parameters.Add(new OleDbParameter("p2", OleDbType.Integer)).Value = int.Parse(vDataParametroDataFinal); 
      objCmd.Parameters.Add(new OleDbParameter("p3", OleDbType.VarChar, 30)).Value = ReportParameter.ReportData.Parameters.Item("pGrupo").Value.ToString(); 
      objCmd.Parameters.Add(new OleDbParameter("p4", OleDbType.Integer)).Value = vTipoTerr; 
      objCmd.Parameters.Add(new OleDbParameter("p5", OleDbType.VarChar, 30)).Value = ReportParameter.ReportData.Parameters.Item("pTerritorio").Value.ToString(); 
      objCmd.Parameters.Add(new OleDbParameter("p6", OleDbType.VarChar, 30)).Value = ReportParameter.ReportData.Parameters.Item("pNegocio").Value.ToString(); 

      OleDbDataAdapter objAdapter = new OleDbDataAdapter(objCmd); 

      objConn.Open(); 

      objAdapter.Fill(objDt); 

      objConn.Close(); 

非常感謝你(:

回答

0

嘗試使用OracleCommandOracleConnection對象,而不是:

OracleConnection objConn = new OracleConnection (ConfigurationManager.ConnectionStrings["Premio"].ConnectionString); 
    OracleCommand objCmd = new OracleCommand(); 
+0

謝謝你的回答,但那對我沒有任何作用 – gabsferreira 2011-04-14 16:00:30

+0

剛纔解決的問題是我在2中拆分了Select with union不同的命令並填充DataTable兩次。不知道什麼是錯的,但現在好了。再次感謝。 – gabsferreira 2011-04-14 16:01:41

相關問題