Указанный состав недействителен - PullRequest
0 голосов
/ 21 октября 2010
            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);».Пожалуйста, помогите мне ... спасибо заранее

1 Ответ

0 голосов
/ 21 октября 2010

DataReaders только для пересылки.Вы не можете «повторно использовать» это.

Все, что вы делаете, это выделяете массив в зависимости от количества записей.Либо сначала выполните запрос COUNT, чтобы получить количество записей, либо перераспределите свой массив на лету в одном цикле.

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();

... продолжите свой второй цикл

Есть еще что сказать о правильном освобождении ресурсов.Рекомендуется добавить параметр CommandBehavior.CloseConnection в ExecuteReader, создать средство чтения данных внутри конструкции using() и в конце ввести cmd.Dispose(), чтобы обеспечить правильное высвобождение ресурсов подключения SQL.

.. хотя на самом деле, посколькуэто локальный файл, который вы используете, он может не иметь большого значения, но в целом вы должны это сделать.В противном случае очень легко обнаружить, что потерянный DataReader не освободил свое соединение.

...