C # не распознает пустую ячейку с помощью SQL, oleDB - PullRequest
0 голосов
/ 08 декабря 2011

Когда я пытаюсь получить значение из моей таблицы доступа, а ячейка пуста, я получаю эту ошибку:

System.InvalidCastException: указанное приведение недопустимо.

это происходит, когда я пытаюсь получить информацию из столбцов триплетов. Возможно, у него нет значения в ячейке, но должно быть в столбце триплета1.Вот часть кода, который я написал.

public Codons(string name)
{
    this.start = false;
    this.end = false;
    this.dataconnection = new OleDbConnection();
    this.dataconnection.ConnectionString =              "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Projects_2012\\Project_Noam\\Access\\myProject.accdb";
    this.dataconnection.Open();

    string sql = "SELECT tblCodons.codonsCodon1, tblCodons.codonsCodon3, "+
    "tblCodons.codonsTriplet1, tblCodons.codonsTriplet2, tblCodons.codonsTriplet3, "+
    "tblCodons.codonsTriplet4, tblCodons.codonsTriplet5, tblCodons.codonsTriplet6, "+
    "tblCodons.codonsFullName, tblCodons.codonsStart, tblCodons.codonsEnd"
    +" FROM tblCodons"
    +" WHERE tblCodons.codonsFullName=?";

    OleDbCommand mycomm = new OleDbCommand(sql, dataconnection);
    mycomm.Parameters.AddWithValue("codonsFullName", name);
    OleDbDataReader dataReader = mycomm.ExecuteReader();

    dataReader.Read();
    this.codon1 = dataReader.GetString(0);
    this.codon3 = dataReader.GetString(1);
    this.triplet1 = dataReader.GetString(2);
    if (dataReader.GetString(3) == "")
        this.triplet2 = "     ";
    else
    this.triplet2 = dataReader.GetString(3);

    if (dataReader.GetString(4) == "")
        this.triplet3 = "     ";
    else
    this.triplet3 = dataReader.GetString(4);

    if (dataReader.GetString(5) == "")
        this.triplet4 = "     ";
    else
    this.triplet4 = dataReader.GetString(5);

    if (dataReader.GetString(6) == "")
        this.triplet5 = "     ";
    else
    this.triplet5 = dataReader.GetString(6);

    if (dataReader.GetString(7) == "")
        this.triplet6 = "     ";
    else
    this.triplet6 = dataReader.GetString(7);

    this.fullName = dataReader.GetString(8);
    this.start = dataReader.GetBoolean(9);
    this.end = dataReader.GetBoolean(10);
    dataReader.Close();

Я также попробовал null вместо "".

TNX за помощь!

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Установите для свойства строки значение (dataReader[3] as string) ?? " ". Если поле базы данных имеет значение NULL, типом является DBNull со значением DBNull.Value, а не тип string со значением null.

Вы также можете проверить использование условного выражения, например dataReader[3] == DBNull.Value, перед вызовом GetString, чтобы проверить, является ли поле пустым.

0 голосов
/ 08 декабря 2011

в вашем примере кода, где вы проверяете что-то вроде этого

  if (dataReader.GetString(3) == "")
      this.triplet2 = "     "; 

Я бы порекомендовал использовать == string.empty; или использовать метод isNullOrEmpty().Существует разница между Null и empty

Так что, если у вас есть эта this.triplet2 = dataReader.GetString(3);, попытайтесь привести в качестве объекта что-то вроде этого

this.triplet2 = (dataReader.GetString(3) as object) ?? DBNull.Value; 

DBNull также ваш лучший вариант

...