C#SqlCeDataReader rdata字段计数

本文关键字:字段 rdata C#SqlCeDataReader | 更新日期: 2023-09-27 17:58:30

我正在尝试查看数据库中是否存在ID,在本例中是vetID。

为了查看SQL查询的结果是否成功,我尝试使用rdata。FieldCount

即使输入ID(变量i)为=-400(数据库中不存在的ID号),FieldCount似乎总是返回11。我也尝试过其他不可能的数字,比如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);

有没有更优雅的方法来检查ID在数据库中是否仍然有效并且没有被删除?

好的。。在你叫我愚蠢之前。。。我猜FieldCount正是返回Query的FieldCount,而不是FieldCount。。。doh。。。

但问题仍然存在,是否有一种优雅的方法可以知道ID是否仍在数据库中?

C#SqlCeDataReader rdata字段计数

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
}

如果使用数据读取器,则无法使用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];
}

sql读取器只是一个正向读取器,因此您无法从属性中获取行数。FieldCount是当前记录中的列数。获取返回的行数的唯一方法是将它们全部读入,或者提前运行count查询(这可能不安全并发)

尝试使用HasRows属性:

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