0
            SqlDataReader reader;
            string r="C:\\Users\\Shivam\\Documents\\";
            if ((FileUpload1.PostedFile != null)&&(FileUpload1.PostedFile.ContentLength > 0))
            {
                r += System.IO.Path.GetFileName(FileUpload1.PostedFile.FileName);

            }

            OleDbConnection oconn =
              new OleDbConnection
                (@"Provider=Microsoft.Jet.OLEDB.4.0;"
                 + "Data Source="+r+";"
                 + @"Extended Properties=""Excel 8.0;HDR=Yes;""");
            oconn.Open();
            conn.Open();
            OleDbCommand dbcom = new OleDbCommand("SELECT * FROM [Sheet1$]", oconn);
            OleDbDataReader dbreader = dbcom.ExecuteReader();

            //dbread = dbreader;
            int rni = dbreader.GetOrdinal ("RollNo");
            int mki = dbreader.GetOrdinal ("marks");
            int rowcount =0;
            while(dbreader.Read())
            { rowcount++; }
            //dbreader.Close();
            //OleDbDataReader dbread = dbcom.ExecuteReader();
            int[] rn = new int[rowcount];
            int[] gr = new int[rowcount];


            while (dbreader.Read())
            {

                int o = 0;
                for(int i=0;i<rowcount;i++)
                {
                    int q = (int)dbreader.GetValue(rni);
                    int p = (int)dbreader.GetValue(mki);
                    rn[i] = q;
                    gr[i] = p;
                    //roll[i] = valid(odr, 0);//Here we are calling the valid method
                    //marks[i] = valid(odr, 1);
                    //i++;
                    if (gr[i] >= 11)
                    { o=i; }
                }
                if(o!=0)
                { break; }
                TextBox4.Text += rn + "\t" + gr;

                //Here using this method we are inserting the data into the database

                x = TextBox2.Text.Substring(0, 1);
                y = TextBox2.Text.Substring(1, 1);

                //for (int s = 0; s < roll.Length; s++)
                //{

                    //SqlDataAdapter sda = new SqlDataAdapter("select StudentID from Student where APID=" + int.Parse(y)+ "and Semester=" + int.Parse(z) + "and Roll_No=" + int.Parse(RollNo), conn);
                    //DataSet ds = new DataSet();
                    //sda.Fill(ds);
                    //GridView1.DataSource = ds;
                    //GridView1.DataBind();
                    SqlCommand command = new SqlCommand();
                    command.Connection = conn;
                    //command.Connection.Open();
                    command.CommandType = CommandType.Text;
                    int c = rn.Length;
                    for (int n = 0; n<rn.Length; n++)
                    {
                        command.CommandText = "Select StudentID from Student where APID=" + int.Parse(x) + "and Semester=" + int.Parse(y) + "and Roll_No=" + rn[n];

                    }
                reader = command.ExecuteReader();

                    while (reader.Read())
                    {
                        TextBox4.Text = reader.GetInt32(0).ToString();
                        a = (int)reader["StudentID"];
                        for (int v = 0; v < rn.Length; v++)
                        {
                            insertdataintosql(rn[v], gr[v]);
                        }
                    }
                //}

            }
            conn.Close();
            oconn.Close();

这里的问题是 while(dbreader.read()) 中的语句没有执行,而是直接执行 conn.Close() 。如果我在关闭前一个数据读取器后使用相同的命令使用另一个数据读取器,则会在“int q = (int)dbreader.GetValue(rni);”处引发错误“指定的强制转换无效”。请帮帮我...在此先感谢

4

1 回答 1

0

DataReaders are forward-only. You can't "reuse" it.

All you are doing is allocating an array based on the number of records. Either run a COUNT query first to get the number of records, or re-allocate your array on the fly in the one loop.

OleDbCommand dbcom = new OleDbCommand("SELECT COUNT(*) as RowCount FROM [Sheet1$]", oconn);
 dbreader = dbcom.ExecuteReader();
dbreader.Read();
rowcount = dbreader.GetOrdinal("RowCount");
dbcom.Close();

dbcom = new OleDbCommand("SELECT * FROM [Sheet1$]", oconn);
 dbreader = dbcom.ExecuteReader();

... carry on with your 2nd loop

There is more to say about releasing resources properly. Best practice is to add parameter CommandBehavior.CloseConnection to ExecuteReader, create your data reader inside a using() construct and issue cmd.Dispose() at the end to ensure SQL connection resources are released properly.

.. though actually since it's a local file you're using it may not matter so much but generally speaking you should do that. Otherwise its very easy to find that an orphaned DataReader has not released its connection.

于 2010-10-21T18:01:40.860 回答