2012-07-26 110 views
1

嗨,这段代码给了我数组超出了数组错误的界限,并指向这里“if(!objReader.IsDBNull(i))”。此脚本旨在以txt格式打印出来。任何帮助将不胜感激:)数组超出了数组的界限错误

namespace test 
    { 
     public partial class frmSales : Form 
     { 
      public frmSales() 
      { 
       InitializeComponent(); 
      } 


      private void dtpFrom_ValueChanged(object sender, EventArgs e) 
      { 

      } 

      private void btnExtract_Click(object sender, EventArgs e) 
      { 

       SqlConnection objConn = new SqlConnection("Data Source=asdasd;Initial Catalog=Medprac;Persist Security Info=True;User ID=sa;Password="); 

        objConn.Open(); 

        SqlCommand objCmd = new SqlCommand("SELECT CONVERT(char(80), inv.[InvDate],3) AS InvDate,inv.[InvoiceNo],inv.[TaxAmount] + inv.[SubTotal] AS Amount, '' AS Payment FROM [Invoice] inv LEFT JOIN [PatientDetails] tab ON inv.[MedicalRecordID] = tab.[MedicalRecordID] WHERE (inv.[InvDate] >= CONVERT(datetime, '" + dtpFrom.Text + "', 105)) AND (inv.[InvDate] <= CONVERT(datetime, '" + dtpTo.Text + "', 105))", objConn); 

       SqlDataReader objReader; 
       objReader = objCmd.ExecuteReader(); 

       System.IO.FileStream fs = new System.IO.FileStream("C:\\CMSExportedData\\Sales-" + DateTime.Now.ToString("dd-MM-yyyy") + ".txt", System.IO.FileMode.Create); 
       System.IO.StreamWriter sw = new System.IO.StreamWriter(fs, System.Text.Encoding.Default); 

       int count = 0; 
       while (objReader.Read()) 
       { 

        for (int i = 0; i < 5; i++) 
        { 
         if (!objReader.IsDBNull(i)) 
         { 
          string s; 
          s = objReader.GetDataTypeName(i); 
          //MessageBox.Show(s); 
          if (objReader.GetDataTypeName(i) == "char") 
          { 
           sw.Write(objReader.GetString(i)); 
          } 
          else if (objReader.GetDataTypeName(i) == "money") 

          { 
           sw.Write(objReader.GetSqlMoney(i).ToString()); 
          } 
          else if (objReader.GetDataTypeName(i) == "nvarchar") 
          { 
           sw.Write(objReader.GetString(i)); 
          } 
         } 
         if (i < 4) 
         { 
          sw.Write("\t"); 
         } 

        } 
        count = count + 1; 
        sw.WriteLine(); 

       } 
       sw.Flush(); 
       fs.Close(); 
       objReader.Close(); 
       objConn.Close(); 
       MessageBox.Show(count + " records exported successfully."); 
       this.Close(); 
      } 

      private void groupBox1_Enter(object sender, EventArgs e) 
      { 

      } 

      private void dtpTo_ValueChanged(object sender, EventArgs e) 
      { 

      } 

      private void frmSales_Load(object sender, EventArgs e) 
      { 

      } 
     } 
    } 
+0

其表示您的索引中没有项目 – JohnnBlade 2012-07-26 09:29:33

+0

有项目@JohnnBlade – Newbie 2012-07-26 09:35:33

回答

1

你的SELECT语句查询4列,但你的for循环覆盖列0,1,2,3,4:这是五列,所以i = 4是出界。

尝试for (int i = 0; i < 4; i++)

+0

嗨@Hinek,试过了,能够执行没有错误。但是它向我展示了3列而不是4列 – Newbie 2012-07-26 09:35:22

+1

作为您的第四列,您选择'''AS Payment'...当您选择一个空字符串时,您希望在列中看到什么? – Hinek 2012-07-26 10:07:20

+0

哈哈!我很愚蠢。谢谢你,先生! – Newbie 2012-07-27 02:08:02

1

你的SqlCommand有以下SQL语句

SELECT 
    CONVERT(char(80), inv.[InvDate],3) AS InvDate, 
    inv.[InvoiceNo], 
    inv.[TaxAmount] + inv.[SubTotal] AS Amount, 
    '' AS Payment 
FROM 
    ... 

返回4个值(指数0至),但你的for循环从指数0到

+0

如果我增加5?我的循环从0到5上午我说得对吗? – Newbie 2012-07-26 09:41:25

+1

不,你的循环条件是'i <5',对于0,1,2,3,4是正确的 - 但对于5 :-) – 2012-07-26 09:45:29

+0

哦。谢谢stephan :) – Newbie 2012-07-27 02:06:35