2014-02-13 11 views
0

У меня есть веб-сервис, который выполняет поиск в базе данных для сохраненных шаблонов. Тем не менее, я получаю сообщение об ошибке при запуске приложенияДолжен объявить скалярную переменную «@Template»

Должен объявить скалярную переменную «@Template».

[WebMethod] 
public Verification StuVerification (byte[] Template) 
{ 
    cn.Open(); 
    SqlCommand com = new SqlCommand("SELECT * FROM tblFingerprint WHERE Template = @Template)", cn); 
    SqlDataReader sr = com.ExecuteReader(); 
    while (sr.Read()) 
    { 
     Verification verification = new Verification() 
     { 
      StudentID = sr.GetInt32(0), 
      StudentNumber = sr.GetString(1), 
      Name = sr.GetString(2), 
      Surname = sr.GetString(3), 
     }; 
     cn.Close(); 
     return verification; 

    } 

    cn.Close(); 
    return new Verification(); 

} 





Verification ver = verification.StuVerification(m_VrfMin); 
Verification v = new Verification(); 
if (ver.StudentID > 0) 
{ 
    // Verification v = new Verification(); 
    richTextBox1.Text = v.StudentNumber; 
} 
else 
{ 
    richTextBox1.Text = "Verification Failed" + error; 
} 
+1

Где объявлена ​​переменная? –

+0

Я не вижу значения параметров, которые вы добавили в свой параметр 'SqlCommand' для параметра' @ Template'. –

+1

Каков тип данных в поле «Шаблон» в таблице «tblFingerprint» – Steve

ответ

2

Вы не добавили параметр SQL в SQLCommand:

com.Parameters.AddWithValue("@Template", TemplateObject); 
+0

@ user3284789 У вас есть дополнительный парс в конце вашего заявления. – TTeeple

2

@Template строка в командном тексте является заполнителем для параметра, который вы должны определить в вашей коллекции параметров команды вместе со значением, которое нужно передать в код базы данных.

cn.Open(); 
SqlCommand com = new SqlCommand(@"SELECT * FROM tblFingerprint 
            WHERE Template = @Template", cn); 
com.Parameters.AddWithValue("@Template", Template); 
SqlDataReader sr = com.ExecuteReader(); 

Его значение используется при выполнении запроса для выбора строк, которые будут возвращены запросом. Однако неясно, из вашего кода выше, какой тип данных поля Template в вашей таблице базы данных. Как и в случае, этот код передает массив байтов в виде двоичного типа данных, и это не может быть точный тип данных, который будет использоваться для сравнения с полем Шаблон.

Видя ваш комментарий о поле изображения я мог бы предложить, чтобы попытаться с этим (не тестировался)

SqlParameter p = com.Parameters.Add("@Template", SqlDbType.Image); 
p.Value = Template; 
SqlDataReader sr = com.ExecuteReader(); 

Это, кажется, необходимо, так как добавление значения байта [] типа с AddWithValue автоматически создает SqlDbType. Тип Двоичный параметр, а не база данных, кажется, как в SqlDbType.Image, однако, прочитать о deprecated Image field

+0

template is byte [] – user3284789

+0

Я говорил о поле Template в таблице tblFingerPrint. Он объявлен как VARBINARY (MAX) в вашей таблице? Если да, то код должен работать, если нет, то вам нужно какое-то преобразование – Steve

+0

Обратите внимание, что текст запроса неверен. Закрывающие круглые скобки не должны присутствовать – Steve

0

Попробуйте параметр this.Add для @template

SqlCommand com = new SqlCommand("SELECT * FROM tblFingerprint WHERE Template = @Template)", cn); 
com.Parameters.AddWithValue("@Template", Template); 
Смежные вопросы