I was trying to add data from a database to acombobox.
try
{
SqlCeCommand com = new SqlCeCommand("select * from Category_Master", con);
SqlCeDataReader dr = com.ExecuteReader();
while(dr.Read()){
string name = dr.GetString(1);
cmbProductCategory.Items.Add(name);
}
}
catch(Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message, System.Windows.Forms.Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
I get the following exception:
Unable to cast object of type 'System.Int32' to type 'System.String'
What am I missing here?
Your column doesn't have the type string
. Apparently it's int
. So use:
dr.getInt32(1).ToString()
or even
dr.GetValue(1).ToString()
which should be more roubst to type changes in the database.
As some sort of general advice I try to follow at least:
Access the fields using their names, e.g.
dr.GetGuid(dr.GetOrdinal("id"))
Such a thing can also be nicely solved by an extension method:
public T GetFieldValue<T>(this DbDataReader reader, string columnName)
{
return reader.GetFieldValue<T>(reader.GetOrdinal(columnName));
}
Side note: Including stack traces (or at least saying which line in your code the exception comes from) can be helpful to others trying to help you. As you can see from the wild guesses what the culprit could be. My guess would be that the stack trace looks somewhat like this:
SqlDataReader.GetString
YourCode.YourMethod
and that GetString
looks more or less like this:
public string GetString(int index)
{
return (string) GetValue(index);
}