2012-07-26 134 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