nar86 Ответов: 2

Свойство Fill selectcommand.connection не было инициализировано


при запуске приведенного ниже кода он показывает ошибку следующим образом

fill selectcommand.connection property has not been initialized

как исправить эту ошибку. пожалуйста, дайте мне знать.

Что я уже пробовал:

if (e.CommandName == "UploadFarmData")
                {

  string CurrentFilePath = Path.GetFullPath(FileUpload1.PostedFile.FileName);
                        constr = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0 Xml;HDR=YES;""", CurrentFilePath);
                        Econ = new OleDbConnection(constr);
                        Econ.Open();
                        DataTable dtExcelSchema;
                        dtExcelSchema = Econ.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                        string sheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();
                        DataSet ds = new DataSet();
                        string SheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();
                        OleDbCommand cmdExcel = new OleDbCommand();
                        OleDbDataAdapter da = new OleDbDataAdapter();
                        cmdExcel.CommandText = "SELECT * From [" + SheetName + "]"; 
                        da.SelectCommand = cmdExcel;
                        da.Fill(ds);
                        Econ.Close();
                        DataTable dt = new DataTable();
                        dt = ds.Tables[0];
                        bool s = false;
                        if (dt.Rows.Count > 0)
                        {
                            for (int i = 0; i < dt.Rows.Count; i++)
                            {
                                dal.DAL_Insert_Farm_Data(dt.Rows[i]["Farmer Code"].ToString(), dt.Rows[i]["Farm No"].ToString(),
                                    dt.Rows[i]["Type of Farm"].ToString(), dt.Rows[i]["Seeded Date"].ToString(), dt.Rows[i]["Farm Visit No"].ToString());
                                s = true;
                            }


                            if (s)
                            {
                 showStatusTrue.InnerHtml = "Farm Details Uploaded Successfully";
                            dal.DAL_Data_Update();
                            }

2 Ответов

Рейтинг:
1

Maciej Los

Попробуйте заменить:

OleDbCommand cmdExcel = new OleDbCommand();
cmdExcel.CommandText = "SELECT * From [" + SheetName + "]";

с:
string sql = "SELECT * From [" + SheetName + "$]";
OleDbCommand cmdExcel = new OleDbCommand(sql, Econ);

потому что:
1. OleDbCommand должен быть связан с объектом OleDbConnection.
2. Там обязательно [$] подпись после названия листа

Для получения более подробной информации, пожалуйста, смотрите: Строки подключения Excel - ConnectionStrings.com[^]


Рейтинг:
0

OriginalGriff

Посмотрите на сообщение об ошибке:

Цитата:
Свойство Fill selectcommand.connection не было инициализировано
И это не так.
Вы создаете объект соединения, вы даже открываете его:
Econ = new OleDbConnection(constr);
Econ.Open();
Но это все, что вы делаете - вы никогда не подключаете это к вашему адаптеру данных.
Вместо этого используйте параметризованный конструктор:
OleDbDataAdapter da = new OleDbDataAdapter("SELECT * From [" + SheetName + "]", Econ);
da.Fill(ds);
Но будьте чертовски осторожны: когда вы объединяете строки для формирования SQL-команд, вы оставляете себя открытым для SQL-инъекций, которые могут повредить или уничтожить вашу БД. Если только вы не обладаете абсолютным контролем над содержанием SheetName вы подвергаетесь высокому риску с этим кодом.
Кстати: вам не нужно открывать и закрывать объект соединения, чтобы работать с адаптером данных - он сделает это за вас, если ему это нужно.