2016-12-18 3 views
0

Я использую переменную класса DataTable dt и пытаюсь запустить два SQL-запроса и записать результаты в Excel. У меня нет ошибок, и все работает нормально, за исключением второй итерации и записи в Excel, записываются заголовки из datatable.DataTable Not Being Cleared

То, что я получаю после sheet1, получает всю информацию из sqlquery1, а затем sheet2 получает всю информацию из sqlquery2. Теперь datawise, он работает точно так, как мне нужно, НО лист2 получает заголовки из sqlquery1 по какой-то причине.

Где в моем синтаксисе я не правильно очищаю данные, чтобы следующая итерация начиналась с чистого листа?

public static void DoThis() 
{ 
string sqlsyntax = null; 
if (userid == "Red") 
{ 
    sqlsyntax = SQLQuery1 (just not showing syntax) 
    QuerySQLTable(sqlsyntax); 
    WriteDataToExcel(dt); 
} 
if (userid == "Pink") 
{ 
    sqlsyntax = SQLQuery2 (just not showing syntax) 
    QuerySQLTable(sqlsyntax); 
    WriteDataToExcel(dt); 
} 
} 

public static void QuerySQLTable(string sqlsyntax) 
{ 
using (conn = new SqlConnection(SqlConnection)) 
{ 
    //Clearing datatable if not null 
    dt.Clear(); 
    da = new SqlDataAdapter(sqlsyntax, conn); 
    conn.Open(); 
    da.Fill(dt); 
    conn.Close(); 
    da.Dispose();    
} 
} 

private static void WriteDataToExcel(DataTable dt) 
{ 
int i = 0; 
int j = 0; 

for (i = 0; i < dt.Columns.Count; i++) 
{ 
    xlWorkSheet.Cells[1, i + 1] = dt.Columns[i].ColumnName; 
} 

for (i = 0; i < dt.Rows.Count; i++) 
{ 
    for (j = 0; j < dt.Columns.Count; j++) 
    { 
     xlWorkSheet.Cells[i + 2, j + 1] = dt.Rows[i][j]; 
    } 
} 
} 

ответ

0

В моем понимании метод DataTable.Clear(); просто очищает данные из DataTable в то время как метод DataTable.Columns.Clear(); очистит столбцы.

Если я понять вашу проблему правильно, вы используете один и тот же DataTable для двух записей в Excel, и запись 1 имеет заголовки Field1, Field2, Field3 и написать два имеет заголовки RED1, Green1, Blue1 НО на ваш рабочий лист для Написать2 вы получите заголовки
FIELD1, поле2, поле3, RED1, Green1, Blue1

Это где метод DataTable.Columns.Clear() вступит в игру, как это будет ясно колонки перед второй записью и убедитесь, что с записью один вы ТОЛЬКО получить заголовки
Field1, Field2, Field3
и для записи двух вы ТОЛЬКО получить заголовки
Red1, Green1, Blue1

По существу попробуйте добавить в DataTable.Columns.Clear(); непосредственно над DataTable.Clear() вызова, который у вас есть, и вы должны получить выход в Excel, как и вы.

0

Вместо dt.Clear();

dt = new DataTable(); 

должен работать, как вы хотите. @user2676140 объяснил причину.