在 ASP.Net 中处理数据访问时使用商业 @AT?

Use of commercial @AT when dealing with data access in ASP.Net?

两个小问题,主要涉及在 ASP.Net (C#) 中处理数据时的 @AT 语法。大多数在线教程显示了很多以下类型的代码,但没有提及(或者我可能忽略了)符号的实际用途,尽管它们确实解释了代码的一般用途。在此示例中,仅查询数据库以获取与日历控件的特定月份有关的数据。

protected DataSet GetCurrentMonthData(DateTime firstDate, 
    DateTime lastDate)
{
    DataSet dsMonth = new DataSet();
    ConnectionStringSettings cs;
    cs = ConfigurationManager.ConnectionStrings["ConnectionString1"];
    String connString = cs.ConnectionString;
    SqlConnection dbConnection = new SqlConnection(connString);
    String query;
    query = "SELECT HolidayDate FROM Holidays " + _
    " WHERE HolidayDate >= @firstDate AND HolidayDate < @lastDate";
    SqlCommand dbCommand = new SqlCommand(query, dbConnection);
    dbCommand.Parameters.Add(new SqlParameter("@firstDate", 
    firstDate));
    dbCommand.Parameters.Add(new SqlParameter("@lastDate", lastDate));

    SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(dbCommand);
    try
    {
        sqlDataAdapter.Fill(dsMonth);
    }
    catch {}
    return dsMonth;
}

第一期:@firstDate和@lastDate在数据库字符串查询中是什么意思或引用?是引用在 GetCurrentMonthData 方法中传递的参数还是数据库中的实际列名 table?

 query = "SELECT HolidayDate FROM Holidays " + _
    " WHERE HolidayDate >= @firstDate AND HolidayDate < @lastDate";

第二期:@firstDate和firstDate有什么区别?我说 firstDate 是实际参数变量本身是否正确?

dbCommand.Parameters.Add(new SqlParameter("@firstDate", 
    firstDate));

你的第一个问题:

根据 documentation,名称必须以 @:

开头

ParameterName 以@paramname 的形式指定。

更多信息:

Is it necessary to add a @ in front of an SqlParameter name?

第二个问题:

首先,那不是 ampersand but at sign or commercial at。它在此特定上下文中用于指示 SQL 参数名称。

这部分展示了如何将实际值(包含在 firstDate C# 变量中)传递给 SQL 参数 (@firstDate) :

dbCommand.Parameters.Add(new SqlParameter("@firstDate", 
    firstDate));

您可以读取您的参数化 SQL 查询语句,例如字符串连接,但使用 big advantages(前者使您免于 SQL 注入,任意数据类型到具有正确格式的字符串转换*, 等等):

query = "SELECT HolidayDate FROM Holidays " + _
    " WHERE HolidayDate >= " + firstDate + " AND HolidayDate < " + lastDate;

*) 看到在上面的字符串连接版本中,您需要根据您的 RDBMS 本地将 firstDatelastDate 转换为具有正确格式的字符串使其工作的设置。

查询语句中@inputvalue的主要用途是避免sql注入攻击。 如果您在构建查询语句时使用普通的连接方法,黑客可以轻松绕过带有 sql 注入的语句。

例如:

"Select * from user where username ='" + username.text + "' and password ='" + password.text + "'"

如果你使用上面的语句来验证用户登录,想想如果用户在用户名文本框中键入 a' = 'a') 或 'sometext 会发生什么和密码框中的 sometext。如果在用户验证中检查没有return条记录,它将return条记录执行并进入帐户区域。

为了避免这种情况,Microsoft 引入了@parameter 来构建sql 查询语句。您在@parameter 中传递的任何值都被视为输入参数值,您不能在其中注入 sql 语句。

回答你的第二个问题

dbCommand.Parameters.Add(new SqlParameter("@firstDate", 
    firstDate));

上述方法用于将@parameter(Add方法中的第一个参数)替换为参数值(Add方法中的第二个参数)。它使用@作为分隔符。它检查查询语句中是否有带前缀 '@' 的单词,它将被标记为参数并替换为作为 Add 方法中的第二个参数传递的实际值。

我同意@har07。那不是符号。据我所知,& 符号看起来像这样 -> &。为了回答这个问题,'at' sign (@) 用于表示 parameterized query in c# 中的变量。 在代码中

dbCommand.Parameters.Add(new SqlParameter("@firstDate",firstDate));

您正在将 DateTime 变量 firstDate 的值分配给查询中的 @firstDate 变量。

这是一个不那么令人困惑的例子(我希望如此): 假设我有一个名为 myName 的字符串变量,我想将其传递给我的查询 select * from students where name = @name。 要在我的查询中将 myName 的值传递给 @name,我会做

dbCommand.Parameters.Add(new SqlParameter("@name",myName));

希望对您有所帮助。