2015-05-05 2 views
-1

Я пытаюсь экспортировать данные в отдельные электронные таблицы на основе категорий, которые находятся в поле со списком. В combobox есть DataTable как источник данных. Этот DataTable имеет два столбца: categoryid (ValueMember) и Category (DisplayMember).Экспорт в Excel (ошибка DBNull)

Проблема заключается в том, я получаю сообщение об ошибке:

"Object cannot be cast from dbnull to other types."

Однако мой DataTable генерируется из базы данных, и оба CategoryId и категории не могут иметь значения NULL.

Вот мой код:

private void excelSpreadsheetToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     string fname = "Inventory Report.xlsx"; 
     XLWorkbook xwb = new XLWorkbook(); 
     foreach (DataRowView dvrow in catcombobox.Items) 
     { 
       //gives integer to function (categoryid), and gives name to spreadsheet (Category) 
       xwb.Worksheets.Add(exceldt(Convert.ToInt32(dvrow.Row["categoryid"])), dvrow.Row["Category"].ToString()); 
       xwb.SaveAs(fname); 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

private DataTable exceldt(int i) 
{ 
    using (var sqlcmd = new SqlCommand("SELECT Item, Quantity, Date FROM inventory_table WHERE categoryid= " + i)) 
    { 
     using (SqlDataAdapter sqlda = new SqlDataAdapter()) 
     { 
      sqlcmd.Connection = sqlconnection; 
      sqlda.SelectCommand = sqlcmd; 

      using (DataTable dt = new DataTable()) 
      { 
       sqlda.Fill(dt); 
       return dt; 
      } 
     } 
    } 
} 

Как я могу это исправить?

Попытка решения:

    if (!(dvrow.Row["categoryid"].Equals(DBNull.Value))) 
        { 
         xwb.Worksheets.Add(exceldt(Convert.ToInt32(dvrow.Row["categoryid"])), dvrow.Row["Category"].ToString()); 
        } 
+0

Пожалуйста, рассмотрите возможность использования SQLParameters 'используя (вар Sqlcmd = новое SqlCommand (" SELECT позиции, количество, дата FROM inventory_table WHERE CategoryID = "+ i)). Эта строка уязвима. – Max

+0

Почему вы не изменяете свой запрос, чтобы добавить «И» в предложение where, где вы отбрасываете данные, которые не являются нулевыми. Имейте в виду, что «Null and Empty» - это не то же самое @John – MethodMan

+0

@MethodMan , Однако столбец категории в моей базе данных не может быть «null»; его одно из ограничений. – John

ответ

1

Попробуйте сделать что-то вроде этого:

if(dvrow.Row["categoryid"] != DBNull.Value){ 
    xwb.Worksheets.Add(exceldt(Convert.ToInt32(dvrow.Row["categoryid"])), dvrow.Row["Category"].ToString()); 
} 

и переместить xwb.SaveAs(fname); из Еогеасп, является более эффективным.

и @Max говорят, чтобы использовать параметр в запросе, как это:

.... 
using (var sqlcmd = new SqlCommand("SELECT Item, Quantity, Date FROM inventory_table WHERE categoryid= @catid")){ 
... 
    sqlcmd.Parameters.Add(new SqlParameter("catid", id)); 
.... 
} 
+0

Я получаю ошибку: Operator '==' не может быть применен к операндам типа «System.Data.DataTable» и «System.DBNull» – John

+0

@John У меня есть обновленный код .. Я думаю, проблема возникла из '' ' dvrow.Row ["categoryid"] '' 'cast – TotPeRo

+0

Я не пытаюсь добавить« id ». Я пытаюсь извлечь данные в DataTable из таблицы в базе данных на основе других таблиц «categoryid». – John