2014-05-07 208 views
0

我不斷收到,我不明白的錯誤:必須聲明標量變量「@user」

必須聲明標量變量「@user」

我實際上做一個網站,我正在使用C#ASP.NET和SQL Server。我有一個班級名稱Connection,另一個名爲Query。這裏是問題

public class Query 
{ 
    public int ValidateLogin(string userID, string password) 
    { 
     string query = "Select * From tblLogin where UserID = @user and Password = @paswd"; 

     Connection objConn = new Connection(); 

     DataTable dtLogin = objConn.GetDataFromDB(query); 

     int result = 0; 

     if (dtLogin.Rows.Count > 0) 
     { 
      result = 1; 
     } 

     return result; 
} 

public class Connection 
{ 
    string conn = ConfigurationManager.ConnectionStrings["DBConn"].ToString(); 

    public DataTable GetDataFromDB(string query) 
    { 
     SqlConnection myConn = new SqlConnection(conn); 
     myConn.Open(); 

     SqlDataAdapter da = new SqlDataAdapter(); 
     da.SelectCommand = myConn.CreateCommand(); 
     da.SelectCommand.CommandText = query; 

     DataTable dt = new DataTable(); 

     da.Fill(dt); 

     da.Dispose(); 
     myConn.Close(); 

     return dt; 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
} 

protected void btn_login_Click(object sender, EventArgs e) 
{ 
     int result = 0; 
     Query q = new Query(); 
     result = q.ValidateLogin(txt_userID.Text, txt_password.Text); 

     if (result == 1) 
     { 
      Response.Redirect("~/Performance Appraisal Form.aspx"); 
     } 
     else 
     { 
     } 
} 
+7

您要使用的參數與你的查詢,但你是不是將它們連接到命令的任何地方 – Habib

+1

@Habib後它的答案。 –

回答

1

將您的參數添加到SelectCommand。

例子:

private static void UpdateDemographics(Int32 customerID, 
    string demoXml, string connectionString) 
{ 
    // Update the demographics for a store, which is stored 
    // in an xml column. 
    string commandText = "UPDATE Sales.Store SET Demographics = @demographics " 
     + "WHERE CustomerID = @ID;"; 

    using (SqlConnection connection = new SqlConnection(connectionString)) 
    { 
     SqlCommand command = new SqlCommand(commandText, connection); 
     command.Parameters.Add("@ID", SqlDbType.Int); 
     command.Parameters["@ID"].Value = customerID; 

     // Use AddWithValue to assign Demographics. 
     // SQL Server will implicitly convert strings into XML. 
     command.Parameters.AddWithValue("@demographics", demoXml); 

     try 
     { 
      connection.Open(); 
      Int32 rowsAffected = command.ExecuteNonQuery(); 
      Console.WriteLine("RowsAffected: {0}", rowsAffected); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 
} 

您的代碼

要做到這一點的另一個參數,以此來

public DataTable GetDataFromDB(string query) 

改變其添加到

public DataTable GetDataFromDB(string query, string[] params) //example, can be another type of collection like ParameterCollection. 


da.SelectCommand.parameters.add("@user",params[0]); 
da.SelectCommand.parameters.add("@paswd",params[1]); 

參數傳遞給您的方法。

string[] Params= new string[2]; 
    Params[0] = txt_userID.Text; 
    Params[1] =txt_password.Text; 


DataTable dtLogin = objConn.GetDataFromDB(query,Params); 

參考:

http://msdn.microsoft.com/es-es/library/system.data.sqlclient.sqlcommand.parameters(v=vs.110).aspx

-2

您正在使用內聯SQL,因此需要有效的SQL字符串。 @user不是SQL代碼中聲明的變量,因此不會被檢測到。要麼在您的SQL字符串中包含聲明語句,要麼在您的字符串中注入「user」的實際值。

希望這有助於..

(呵呵,作爲一個方面說明..請不要使用內聯SQL,這是非常不安全的。切換到使用存儲過程至少是...)

+3

內聯SQL如何「非常不安全」?對於單行SELECT使用存儲過程似乎對我來說過分了。 –

+0

您可以使用內聯Sql,但總是使用參數。它會幫助你避免sql注入。 http://stackoverflow.com/questions/6547986/how-to-prevent-a-sql-injection-escaping-strings –

+0

在行SQL不是不安全的 - 你怎麼做出這個斷言?只要你沒有使用字符串連接來生成你的查詢,那絕對沒問題。您認爲Entity Framework或LINQ to SQL與SQL Server通信還有什麼意義? –