系统.InvalidCastException:指定的类型转换在. executescalar中无效

本文关键字:executescalar 无效 类型转换 InvalidCastException 系统 | 更新日期: 2023-09-27 18:10:07

我正在制作一个链接到本地数据库的应用程序。我想要的,是在表格中显示数据从数据库,但在标签。我创建了一个标签列表,但是在command.Executescalar()中出现了这个错误,我试图在其中获取数据库中输入的行数,以便该列表可以创建确切的行数。谢谢!

int infoCount = (int)command.ExecuteScalar();
var pozitie = 50; //50 pixeli
for (var i = infoCount ; i >= 0; i--)
{
      //creez si adaug un nou label in form
       Label label = new Label();
       label.Text = dataTable.Rows[i][i].ToString();
       label.Location = new Point(pozitie, 150);
       label.AutoSize = true;
       //afisez in form
       //adaug in colectie
       labels.Add(label);

}

L。艾凡:

var query = "SELECT * FROM grupe WHERE Nume='" + nume + "'";
var command = new SqlCeCommand(query, conn);
var dataAdapter = new SqlCeDataAdapter(command);
var dataTable = new DataTable();
dataAdapter.Fill(dataTable);

系统.InvalidCastException:指定的类型转换在. executescalar中无效

这个查询返回的不是记录数:

SELECT * FROM grupe WHERE Nume=@nume

它选择所有列,对于ExecuteScalar,它返回第一行第一列的值。相反,您应该使用:

SELECT COUNT(*) FROM grupe WHERE Nume=@nume

还使用sql参数(如上所示)来防止sql注入。

using(var command = new SqlCeCommand(query, conn))
{
     command.Parameters.Add("@nume", SqlDbType.VarChar).Value = nume;
}

还需要注意的是,在c#中索引都是0,所以你可以通过coll[0]访问列表或数组中的第一项。最后一项是coll.Count-1,因此你应该将For循环更改为:

for (int i = infoCount - 1 ; i >= 0; i--)
{
    // ...
}

但是您根本不需要使用单独的查询来确定行数。您正在填充具有table.Rows.Count属性的DataTable。所以很简单:

// ...
var dataTable = new DataTable();
dataAdapter.Fill(dataTable);
for(int i = dataTable.Rows.Count - 1; i >= 0; i--)
{
     DataRow row = dataTable.Rows[i];
    // ...
}