必须声明标量变量“@Template”

时间:2014-02-13 13:16:08

标签: c# sql sql-server web-services webmethod

我有一个web服务,可以在数据库中搜索存储的模板。但是,运行我的应用程序时出现错误

  

必须声明标量变量“@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;
}

3 个答案:

答案 0 :(得分:2)

您尚未将SQL参数添加到SQLCommand:

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

答案 1 :(得分: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的数据类型是什么。因此,此代码以二进制数据类型的形式传递一个字节数组,这可能不是用于与模板字段进行比较的确切数据类型。

看到你对Image字段的评论我建议尝试使用此(未测试)

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

这似乎是必要的,因为使用AddWithValue添加byte []类型的值会自动创建一个SqlDbType.Binary参数类型,而数据库似乎就像一个SqlDbType.Image,但是,请阅读deprecated Image field

答案 2 :(得分:0)

试试这个。添加@template的参数

SqlCommand com = new SqlCommand("SELECT * FROM tblFingerprint WHERE Template = @Template)", cn);
com.Parameters.AddWithValue("@Template", Template);
相关问题