По заголовку темы понятно о чем речь, но подробнее:
Есть файл excel, в нем есть записи, необходимо выгрузить данные в таблицу SQL.
Существует много способов выгрузки данных:
1. Можно или подключить библиотеку и работать с ней
2. Можно в sql запросом, к примеру,
- Код: Выделить всё
SELECT * INTO test_new
FROM OPENROWSET('MSDASQL','Driver={Microsoft Excel Driver (*.xls)};DBQ=c:\test.xls','SELECT * FROM [Лист1$]')
3. Или же сделать из excel такой же источник как sql, oledb или odbc и работать как с обычным ADO
Если вы знаете еще методы выгрузки,то пишите здесь, буду очень признателен расширить свой кругозор, может ваш метод будет проще
Зная это, я решил выбрать 3-й вариант, т.к. 1-й как мне показалось геморойный, 2-й не подходит, т.к. конечная таблица находится на sybase
и вот код который я сделал c помощью ODBC, т.к. не понял, что лучше:
- Код: Выделить всё
// сначала достаю данные в datatable из Excel
OdbcConnection cn = new OdbcConnection();
cn.ConnectionString = string.Format(@"Driver={{Microsoft Excel Driver (*.xls)}};DBQ={0};ReadOnly=0;", workbookPath);
string strCom = "select * from [Лист1$]";
cn.Open();
OdbcCommand comm_mon = new OdbcCommand(strCom, cn);
OdbcDataAdapter da = new OdbcDataAdapter();
da.SelectCommand = comm_mon;
System.Data.DataTable dt = new System.Data.DataTable();
da.Fill(dt);
// затем подключаю свою бд, также через ODBC, т.к. иначе будет ругаться
string strCon = "Dsn=srvr;uid=login;srvr=srvr;db=db;pwd=pwd";
OdbcConnection conn = new OdbcConnection(strCon);
conn.Open();
//и потом пробегаясь по всем строкам и столбцам вставляю данные в таблицу, которую я до этого сделал в бд
foreach (DataRow row in dt.Rows)
{
string strCom2 = "insert into tmp_export_excel select"
+ "'" + row[0].ToString() + "',"
+ "'" + row[1].ToString() + "',"
+ "'" + row[2].ToString() + "',"
+ "'" + row[3].ToString() + "',"
+ "'" + row[4].ToString() + "',"
+ "'" + row[5].ToString() + "',"
+ "'" + row[6].ToString() + "',"
+ "'" + row[7].ToString() + "',"
+ "'" + row[8].ToString() + "',"
+ "'" + row[9].ToString() + "',"
+ "'" + row[10].ToString() + "',"
+ "'" + row[11].ToString() + "',"
+ "'" + row[12].ToString() + "',"
+ "'" + row[13].ToString() + "',"
+ "'" + row[14].ToString() + "',"
+ "'" + row[15].ToString() + "',"
+ "'" + row[16].ToString() + "',"
+ "'" + row[17].ToString() + "'";
OdbcCommand cm = new OdbcCommand(strCom2, conn);
cm.ExecuteNonQuery();
}
conn.Close();
cn.Close();
}
вот код для создания бд
- Код: Выделить всё
create table tmp_export_excel
(
F1 VARCHAR(10) NULL,
F2 VARCHAR(20) NULL,
F3 VARCHAR(20) NULL,
F4 VARCHAR(20) NULL,
F5 VARCHAR(30) NULL,
F6 VARCHAR(10) NULL,
F7 VARCHAR(10) NULL,
F8 VARCHAR(50) NULL,
F9 VARCHAR(50) NULL,
F10 VARCHAR(30) NULL,
F11 VARCHAR(50) NULL,
F12 VARCHAR(20) NULL,
F13 VARCHAR(20) NULL,
F14 VARCHAR(20) NULL,
F15 VARCHAR(20) NULL,
F16 VARCHAR(20) NULL,
F17 VARCHAR(20) NULL,
F18 VARCHAR(20) NULL
)
в принципе это все работает, но я бы хотел сделать более гибкую систему:
т.е. возможно ли как-то сделать, чтобы не создавать таблицу в бд, т.к. я могу не знать количество и названия столбцов
и можно ли как-то всю datatble вставить в бд, не пробегаясь по строкам.
Т.е. в итоге, чтобы грузить любой excel файл, не зная сколько там столбцо и их названий, что мне нужно поменять или добавит в моем коде ?
а может у вас есть свой вариант, буду признателен, т.к. охота иметь более автоматизированную вещь, а так это получаетсякак одноразовая посуда
Жду предложений