当前位置: 首页 > 面试题库 >

如何使用SQL参数从SQL Server获取数据集

长孙明知
2023-03-14
问题内容

我正在从事C#项目,并且对这项技术不熟悉。

我想从SQL Server 2008中读取一些数据,并编写以下代码

public User select(string username, string password)
{
    string connection = ConfigurationManager.ConnectionStrings["lawyersDBConnectionString"].ConnectionString.ToString();
    string sql = string.Format("select * from users where userName = '{0}' and password = '{1}'", username, password);

    SqlConnection con = new SqlConnection();            
    con.ConnectionString = connection;

    DataSet ds = new DataSet();
    SqlDataAdapter da = new SqlDataAdapter(sql, con);

    User user = new User();
    DataRow dr;

    try
    {
            da.Fill(ds);
            dr = ds.Tables[0].Rows[0];

            user.Id = Convert.ToInt16(dr["userID"]);                
            user.FirstName = (string)dr["firstName"];
            user.LastName = (string)dr["lastName"];
            user.Email = (string)dr["email"];
            user.Username = (string)dr["userName"];
            user.Password = (string)dr["password"];
            user.type = (string)dr["type"];

            return user;
    }
    catch (Exception ex)
    {                
            return null;
    }
}//end of select method

但是我读过一篇有关SQL注入的文章,并且我想使用SQL参数来避免这种情况,但是我不知道如何做。


问题答案:

这是对代码的简单重做。未经测试,但实质上,它包括在一次性对象周围添加using语句以及使用带有参数集合的SqlCommand

string connection = ConfigurationManager.ConnectionStrings ["lawyersDBConnectionString"].ConnectionString.ToString();
string sql = "select * from users where userName = @uname and password = @pwd";

 DataSet ds = new DataSet();
 using(SqlConnection con = new SqlConnection(connection))
 using(SqlCommand cmd = new SqlCommand(sql, con))
 {
    con.Open();
    cmd.Parameters.AddWithValue("@uname", username);
    cmd.Parameters.AddWithValue("@pwd", password);

    using(SqlDataAdapter da = new SqlDataAdapter(cmd))
    {
         User user = new User();
         DataRow dr;
         da.Fill(ds);
         dr = ds.Tables[0].Rows[0];

         user.Id = Convert.ToInt16(dr["userID"]);                
         user.FirstName = (string)dr["firstName"];
         user.LastName = (string)dr["lastName"];
         user.Email = (string)dr["email"];
         user.Username = (string)dr["userName"];
         user.Password = (string)dr["password"];
         user.type = (string)dr["type"];
         return user;
    }
}

注意命令文本如何不直接包含用户和密码的字符串,而是一个简单的参数占位符(@uname and @pwd)。将参数添加到SqlCommand集合时,这些占位符称为参数名称。

在查看检索到的数据的用途时,我强烈建议您看一下简单的ORM工具(例如Dapper),该工具可以直接转换User对象中的所有这些代码



 类似资料:
  • 问题内容: 如何在存储过程中获取特定数据库的数据库名称。 问题答案: 要获取当前的数据库名称,请使用。 DB_NAME(Transact-SQL)

  • 问题内容: 在JSP中,如何从URL获取参数? 例如,我有一个www.somesite.com/Transaction_List.jsp?accountID=5 要获取的 URL5 。 是否有request.getAttribute(“ accountID”)之类的会话或类似内容? 问题答案: 在GET请求中,请求参数取自查询字符串(URL上问号后面的数据)。例如,URL http://hostn

  • 我希望在JMETER中实现以下功能 JMeter加载带有id号的CSV文件 Jmeter中的每个用户/线程选择一个id号,并将其添加到他们的HTTP请求中,例如HTTP:www.testsite.com/test.php?id=x 重复步骤2,选择文件中的下一个id号。 这样,我就可以测试我的servlet是否使用连接池执行多个线程。 谢谢

  • 问题内容: 如标题中所指定,我想在sqlserver中获取数据库名称,我所知道的所有信息都是数据源名称,用于获取Connection对象的登录名/密码,请在Java中显示一些有关如何正确检索数据库名称的指针,谢谢! 甚至 问题答案: 从连接对象获取一个实例。 数据库名称可以通过或方法获得(取决于JDBC驱动程序的供应商)。 或使用或方法。 如果您有兴趣获得Oracle数据库服务器或Oracle数据

  • 我正在创建一个fetchBill函数。分配https://randomapi.com/api/006b08a801d82d0c9824dcfdfdfa3b3c到一个api变量。它使用浏览器的fetch函数向api发出HTTP请求。它在一个函数中使用箭头函数。然后调用fetch函数,并在将其转换为JSON后返回响应。使用另一个。然后调用第一个函数,该函数将JSON数据传递给displayCartTo

  • 问题内容: 我正在为SQLException编写通用记录器,我想获取传递给PreparedStatement的参数,该怎么做?我能够得到他们的数量。 问题答案: 简短的回答:不能。 长答案:所有JDBC驱动程序都会将参数值保留在某个地方,但是没有标准的方法来获取它们。 如果要出于调试或类似目的而打印它们,则有几种选择: 创建一个传递JDBC驱动程序(使用p6spy或log4jdbc作为基础),该驱