2015-08-27 3 views
0

Я работаю над приложением, связанным с локальной базой данных. Я хочу, чтобы показать в форме datae из базы данных, но в ярлыках. Я создал список меток, но я получаю эту ошибку в команде .Executescalar(), где я пытаюсь получить количество строк, введенных в базу данных, поэтому список может создавать точное количество строк. Благодаря !System.InvalidCastException: Указанное приведение недействительно на .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); 

}

LE:

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); 
+1

Не могли бы вы предоставить запрос, который используете? – learningNew

+1

Учитывая, что ошибка находится в первой строке, остальная часть строк не имеет значения ... но код * до * эта строка - которая показывает запрос - будет очень * релевантной. Кроме того, вы можете временно назначить результат переменной типа «object» и cast * that *, чтобы вы могли видеть, какой тип результата на самом деле ... –

+0

Позвольте мне угадать ваш запрос: 'SELECT * FROM TableName' –

ответ

1

Этот запрос возвращает не число записей:

SELECT * FROM grupe WHERE [email protected] 

Вместо этого он выбирает все столбцы, с ExecuteScalar она возвращает значение первый столбец первой строки. Вместо этого вы хотите использовать:

SELECT COUNT(*) FROM grupe WHERE [email protected] 

Также используйте sql-параметры (как показано выше) для предотвращения внедрения sql.

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

отметить также, что индексы начинаются с нуля в C#, так что вы получаете доступ к первому элементу в списке или массиве с помощью coll[0]. Последний пункт в coll.Count-1 По этой причине вы должны изменить вашу цикл для:

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]; 
    // ... 
} 
+0

В позиции 2 нет строки. Не знаю, почему я это получаю. – Ezekiel

+0

@ user3348368: я отредактировал свой ответ, используйте 'var i = infoCount - 1' вместо' var i = infoCount'. Но вам не нужен этот запрос вообще, данные datatable уже знают, что это размер. –

+0

Работает, но на нем нет ярлыка или текста, или что-то в этом роде. – Ezekiel

Смежные вопросы