System.InvalidCastException: 指定的转换在 .ExecuteScalar 中无效
System.InvalidCastException: Specified cast is not valid at .ExecuteScalar
我正在开发一个链接到本地数据库的应用程序。我想要的是以数据库中的表格数据形式显示,但以标签形式显示。我创建了一个标签列表,但在 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.E:
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);
本查询returns不是记录数:
SELECT * FROM grupe WHERE Nume=@nume
而是选择所有列,ExecuteScalar
它returns第一行第一列的值。相反,您想使用:
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# 中基于零,因此您可以通过 coll[0]
访问列表或数组中的第一项。最后一项位于 coll.Count-1
因此,您应该将 for 循环更改为:
for (int i = infoCount - 1 ; i >= 0; i--)
{
// ...
}
但是您根本不需要使用单独的查询来确定行数。您正在填充一个 DataTable
,它有一个 table.Rows.Count
属性。所以很简单:
// ...
var dataTable = new DataTable();
dataAdapter.Fill(dataTable);
for(int i = dataTable.Rows.Count - 1; i >= 0; i--)
{
DataRow row = dataTable.Rows[i];
// ...
}
我正在开发一个链接到本地数据库的应用程序。我想要的是以数据库中的表格数据形式显示,但以标签形式显示。我创建了一个标签列表,但在 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.E:
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);
本查询returns不是记录数:
SELECT * FROM grupe WHERE Nume=@nume
而是选择所有列,ExecuteScalar
它returns第一行第一列的值。相反,您想使用:
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# 中基于零,因此您可以通过 coll[0]
访问列表或数组中的第一项。最后一项位于 coll.Count-1
因此,您应该将 for 循环更改为:
for (int i = infoCount - 1 ; i >= 0; i--)
{
// ...
}
但是您根本不需要使用单独的查询来确定行数。您正在填充一个 DataTable
,它有一个 table.Rows.Count
属性。所以很简单:
// ...
var dataTable = new DataTable();
dataAdapter.Fill(dataTable);
for(int i = dataTable.Rows.Count - 1; i >= 0; i--)
{
DataRow row = dataTable.Rows[i];
// ...
}