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)
            {

            }
        }
    }
4

2 に答える 2

1

selectステートメントは4列をクエリしますが、forループは列0、1、2、3、4をカバーします。これi = 4は5列なので、範囲外です。

試すfor (int i = 0; i < 4; i++)

于 2012-07-26T09:30:28.200 に答える
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から3 )を返しますが、forループはインデックス0から4になります

于 2012-07-26T09:32:45.710 に答える