C # SqlCeDataReader rdata FieldCount - PullRequest
2 голосов
/ 06 июня 2011

Я пытаюсь проверить, существует ли идентификатор в базе данных, в данном случае это vetID.

Чтобы проверить, успешен ли результат запроса SQL, я пытаюсь использовать rdata.FieldCount

FieldCount всегда возвращает 11, даже если идентификатор ввода (переменная i) равен -400 (номер идентификатора, который не может существовать в базе данных). Я также пробовал использовать другие невозможные числа, например 100 или 800 (в базе данных всего 1–5 элементов)

var mySQLCommand = new SqlCeCommand("SELECT * FROM vets WHERE vetID = @ID", dbCon);
mySQLCommand.Parameters.AddWithValue("ID", i);
SqlCeDataReader rdata = mySQLCommand.ExecuteReader();
if (rdata.FieldCount >= 1) 
{
    MessageBox.Show(" HAS ROWS "); go = true; 
}
else 
{ 
    MessageBox.Show("NO ROWS RETURNED"); 
}
MessageBox.Show("rdata FieldCount " + rdata.FieldCount + " i has value " + i);

Есть ли более элегантный способ проверить, что идентификатор все еще действует в базе данных и не был удален?

ОК ... прежде чем вы называете меня Глупым ... я предполагаю, что FieldCount - это как раз то, что FieldCount, а не FieldCount из возвращенного запроса ... doh ...

Но все еще остается вопрос: есть ли элегантный способ узнать, есть ли идентификатор в базе данных?

Ответы [ 4 ]

4 голосов
/ 06 июня 2011

FieldCount всегда возвращает 11, потому что (я предполагаю) в таблице 11 столбцов.

Лучший способ:

var sql = new SqlCeCommand("select top 1 vetid from vets where vetid = @id", dbCon);
sql.Paramaters.AddWithValue("id", i);
if (null != mySqlCommand.ExecuteScalar())
{
   // ID exists
}
2 голосов
/ 06 июня 2011

Если вы используете устройство чтения данных, вы не можете получить количество строк с помощью fieldcount. Но если вы хотите оставить запрос таким же, вы бы сделали:

var mySQLCommand = new SqlCeCommand("SELECT * FROM vets WHERE vetID = @ID", dbCon);
mySQLCommand.Parameters.AddWithValue("ID", i);
SqlCeDataReader rdata = mySQLCommand.ExecuteReader();
if (rdata.read() ) 
{
    MessageBox.Show(" HAS ROWS "); 
go = true; 
}
else 
{ 
    MessageBox.Show("NO ROWS RETURNED"); 
}
MessageBox.Show("rdata FieldCount " + rdata.FieldCount + " i has value " + i);

Другой способ проверить - использовать select count(*), чтобы увидеть, есть ли он в таблице, и будет 0, если он не существует.

var mySQLCommand = new SqlCeCommand("SELECT count(*) FROM vets WHERE vetID = @ID", dbCon);
            mySQLCommand.Parameters.AddWithValue("ID", i);
            SqlCeDataReader rdata = mySQLCommand.ExecuteReader();
int rowCount = 0;
if ( rdata.read() ) {
    rowCount = rdata[0];
}
1 голос
/ 06 июня 2011

SQL-ридер предназначен только для прямого чтения - поэтому вы не можете получить количество строк в свойстве. FieldCount - количество столбцов в текущей записи. Единственный способ получить количество возвращаемых строк - это прочитать их все или выполнить запрос count перед этим (что может быть небезопасно для параллелизма)

0 голосов
/ 21 февраля 2013

Попробуйте использовать свойство HasRows вместо:

if (rdata.HasRows) 
{
    MessageBox.Show(" HAS ROWS "); go = true; 
}
else
{ 
    MessageBox.Show("NO ROWS RETURNED"); 
}
...