尝试...抓住什么都没有,但代码仍在破坏

时间:2015-07-16 19:19:10

标签: c# try-catch

更新:因此,此代码在此方法之前将SQL查询收集到DataSet中。然后将此数据集放入特定单元格地址(从表单加载)的相应选项卡中的Excel中,但下面的代码是导出到excel方法。我收到以下错误:

An unhandled exception of type 'System.AccessViolationException' occurred in SQUiRE (Sql QUery REtriever) v1.exe

附加信息:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

我已经跟踪了一段时间并且认为我修复了它,但我的解决方案是误报。所以我正在使用try ... catch块正在破坏但没有返回任何东西。如果你们都看到我所遗漏的任何东西,请告诉我。我通常在这一行(templateSheet = templateBook.Sheets [tabName];)和相同的tabName上打破。该选项卡未被锁定或限制,因此可以写入并运行超过一半的时间。

public void ExportToExcel(DataSet dataSet, Excel.Workbook templateBook, int i, int h, Excel.Application excelApp) //string filePath, 
    {
        try
        {

            lock (this.GetType())
            {
                Excel.Worksheet templateSheet;

                //check to see if the template is already open, if its not then open it,
                //if it is then bind it to work with it
                //if (!fileOpenTest)
                //{ templateBook = excelApp.Workbooks.Open(filePath); }
                //else
                //{ templateBook = (Excel.Workbook)System.Runtime.InteropServices.Marshal.BindToMoniker(filePath); }


                //Grabs the name of the tab to dump the data into from the "Query Dumps" Tab
                string tabName = lstQueryDumpSheet.Items[i].ToString();
                templateSheet = templateBook.Sheets[tabName];                   

                // Copy DataTable
                foreach (System.Data.DataTable dt in dataSet.Tables)
                {
                    // Copy the DataTable to an object array
                    object[,] rawData = new object[dt.Rows.Count + 1, dt.Columns.Count];

                    // Copy the values to the object array
                    for (int col = 0; col < dt.Columns.Count; col++)
                    {
                        for (int row = 0; row < dt.Rows.Count; row++)
                        { rawData[row, col] = dt.Rows[row].ItemArray[col]; }
                    }

                    // Calculate the final column letter
                    string finalColLetter = string.Empty;
                    string colCharset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
                    int colCharsetLen = 26;

                    if (dt.Columns.Count > colCharsetLen)
                    { finalColLetter = colCharset.Substring((dt.Columns.Count - 1) / colCharsetLen - 1, 1); }

                    finalColLetter += colCharset.Substring((dt.Columns.Count - 1) % colCharsetLen, 1);

                    /*Grabs the full cell address from the "Query Dump" sheet, splits on the '=' and
                     *pulls out only the cell address (i.e., "address=a3" becomes "a3")*/
                    string dumpCellString = lstQueryDumpText.Items[i].ToString();
                    string dumpCell = dumpCellString.Split('=').Last();

                    /*Refers to the range in which we are dumping the DataSet.  The upper right hand cell is
                     *defined by 'dumpCell'and the bottom right cell is defined by the final column letter 
                     *and the count of rows.*/
                    string firstRef = "";
                    string baseRow = "";

                    //Determines if the column is one letter or two and handles them accordingly
                    if (char.IsLetter(dumpCell, 1))
                    {
                        char[] createCellRef = dumpCell.ToCharArray();
                        firstRef = createCellRef[0].ToString() + createCellRef[1].ToString();

                        for (int z = 2; z < createCellRef.Count(); z++)
                        { baseRow = baseRow + createCellRef[z].ToString(); }
                    }
                    else
                    {
                        char[] createCellRef = dumpCell.ToCharArray();
                        firstRef = createCellRef[0].ToString();

                        for (int z = 1; z < createCellRef.Count(); z++)
                        { baseRow = baseRow + createCellRef[z].ToString(); }
                    }

                    int baseRowInt = Convert.ToInt32(baseRow);
                    int startingCol = ColumnLetterToColumnIndex(firstRef);
                    int endingCol = ColumnLetterToColumnIndex(finalColLetter);
                    int finalCol = startingCol + endingCol;
                    string endCol = ColumnIndexToColumnLetter(finalCol - 1);
                    int endRow = (baseRowInt + (dt.Rows.Count - 1));
                    string cellCheck = endCol + endRow;
                    string excelRange;

                    if (dumpCell.ToUpper() == cellCheck.ToUpper())
                    { excelRange = string.Format(dumpCell + ":" + dumpCell); }
                    else
                    { excelRange = string.Format(dumpCell + ":{0}{1}", endCol, endRow); }

                    //Dumps the cells into the range on Excel as defined above
                    templateSheet.get_Range(excelRange, Type.Missing).Value2 = rawData;

                    /*Check to see if all the SQL queries have been run from 
                    if (i == lstSqlAddress.Items.Count - 1)
                    {
                        //Turn Auto Calc back on
                        excelApp.Calculation = Excel.XlCalculation.xlCalculationAutomatic;

                        /*Run through the value save sheet array then grab the address from the corresponding list 
                         *place in the address array.  If the address reads "whole sheet" then save the whole page,
                         *else set the addresses range and value save that.

                        for (int y = 0; y < lstSaveSheet.Items.Count; y++)
                        {
                            MessageBox.Show("Save Sheet: " + lstSaveSheet.Items[y] + "\n" + "Save Address: " + lstSaveRange.Items[y]);
                        }*/

                        //run the macro to hide the unused columns
                        excelApp.Run("ReportMakerExecute");

                        //save excel file as hospital name and move onto the next
                        SaveTemplateAs(templateBook, h);                            
                    }
                }

            }
        }
        catch (Exception e)
        {
            MessageBox.Show(e.ToString());
        }
    }

0 个答案:

没有答案