Указанное приведение не является допустимым исключением в запросе доступа MS с использованием C # - PullRequest
1 голос
/ 06 декабря 2010

Эй, ребята, у меня есть это странное исключение приведения, хотя мои типы данных верны в БД:

string sql =
            string.Format(
                @"select aim_network_id,aim_network_name,oxinetwork_id,pack_id,pack_name,p_face_value,pm_prefix from Operator where aim_network_id='{0}'",
                gridbackOffice["aim_network_id", gridbackOffice.CurrentCell.RowIndex].Value);
        OleDbCommand getSelectedGridDatecmd = new OleDbCommand(sql, conn);
        OleDbDataReader reader = getSelectedGridDatecmd.ExecuteReader();
        while (reader.Read())
        {
            txtAimNetworkID.Text = reader.GetString(0);
            txtAimNetworkName.Text = reader.GetString(1);
            txtPARNetworkID.Text = reader.GetString(2);
            txtPARFaceValue.Text = reader["p_face_value"].ToString();
           //in above line if i'm doing this `reader.GetString(5)` then i'm getting specified cast exception and that to randomly i.e some time it works fine and suddenly sometime gives this exception
            txtPARPackID.Text = reader.GetString(3);
            txtPARPackName.Text = reader.GetString(4);
            txtPARPMPrefix.Text = reader["pm_prefix"].ToString();
        }

Я немного запутался, если я использую это reader["p_face_value"].ToString(), тогда мой код работает очень гладко, но в чем проблема с использованием этого reader.GetString(5), по моему мнению, оба метода возвращают строку, никто не сталкивался с этой ошибкой b4? .... Ошибка в 4-й и 7-й строке цикла while.

Исключение : указанное приведение недействительно (InvalidCastException необработанное)

Ответы [ 4 ]

3 голосов
/ 06 декабря 2010

Согласно MSDN, OleDbDataReader.GetString () не выполняет никаких преобразований перед попыткой приведения к строке - поэтому полученные данные должны уже быть строкой.

Если существует вероятность того, что значение в этом столбце может быть нулевым , в документах рекомендуется, чтобы вы сначала проверили, является ли значение нулевым :

if (  !reader.IsDBNull(5) ) {
    txtPARFaceValue.Text = reader.GetString(5); 
}

Вызов reader["p_face_value"] для нулевого значения возвращает DBNull - и когда вы вызываете ToString () для DBNull , вы получаете пустую строку.

2 голосов
/ 06 декабря 2010

С MSDN :

Преобразования не выполняются;следовательно, полученные данные уже должны быть строкой.

Если столбец не является строковым типом, вам необходимо использовать метод .ToString() для его преобразования.

0 голосов
/ 06 декабря 2010

Вы должны использовать GetString только тогда, когда столбец является строковым эквивалентным типом в базе данных (например, varchar), в вашем случае p_face_value кажется числовым типом, поэтому он не может просто преобразовать его в строку.

То, как вы делаете это прямо сейчас, - правильный путь.

0 голосов
/ 06 декабря 2010

Каков тип данных p_face_value в вашей базе данных?

На основании приведенного описания ошибки кажется, что это не строковый тип, поэтому при вызове:

reader.GetString(5)

ошибки в коде, поскольку он не может преобразовать любой тип в строку.Метод .ToString () будет работать, так как он не использует приведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...