ASP.NET中的AddWithValue-Statement不起作用

时间:2016-02-11 15:03:37

标签: c# sql asp.net

我想从我的数据库中获取特定值。 为此,我写了一个我称之为的函数:

strUserId = SqlSelectToString("SELECT UserId FROM BugNet.dbo.Users WHERE UserName = @UserName");

该功能的工作原理如下:

private string SqlSelectToString(string strSqlCommand)
{
    string result = "";
    using (SqlConnection connection = new SqlConnection(strConnectionString))
    {
        using (SqlCommand command = new SqlCommand(strSqlCommand, connection))
        {
            command.Parameters.AddWithValue("@UserName", strUserName);
            try
            {
                connection.Open();
                result = (string)command.ExecuteScalar();
            }
            catch
            {
                if (connection.State == ConnectionState.Open)
                {
                    connection.Close();
                }
            }
        }
    }

    return result;

我尝试了很多不同的方法,但无法在查询中添加“strUserName”。

查询字符串始终为“SELECT UserId FROM BugNet.dbo.Users WHERE UserName = @UserName”。

我做错了什么? 提前谢谢。

编辑:

我们需要UserId的用户名始终相同,并由Webserver-Admin通过Web.config定义如下:

<appSettings>
<add key="UserName" value="kunde"/>
<add key="ApplicationName" value="InternalTest"/>

在执行SqlSelectToString方法之前,我从配置中获取strUsername,如下所示:

strUserName = System.Configuration.ConfigurationManager.AppSettings["UserName"].ToString();

希望有所帮助。

编辑:

终于找到了问题的解决方案。 这是正确的方法:

private const string strSelectUserId = "SELECT UserId FROM BugNet.dbo.Users WHERE UserName = @UserName";

/// <summary>
/// Saves the result of an SQL-Query in a string
/// </summary>
/// <param name="strSqlCommand"></param>
private string SqlSelectToString(string strSqlCommand)
{
    string result = "";
    SqlConnection connection = new SqlConnection(strConnectionString);
    SqlCommand command = new SqlCommand(strSqlCommand, connection);
    command.Parameters.AddWithValue("@UserName", strUserName);
    command.Parameters.AddWithValue("@ApplicationName", strApplicationName);
    command.Parameters.AddWithValue("@ProjectId", strProjectId);
    SqlDataReader reader;
    try
    {
        connection.Open();
        reader = command.ExecuteReader();
        while (reader.Read())
        {
            result = reader[0].ToString();
        }
    }
    catch
    {
        bInsert = false;
    }
    finally
    {
        if (connection != null)
        {
            connection.Close();
            connection.Dispose();
        }
    }
    return result;
}

1 个答案:

答案 0 :(得分:1)

  

查询字符串始终保持&#34; SELECT UserId FROM BugNet.dbo.Users WHERE UserName = @ UserName&#34;。

这就是假设发生的事情。它是参数化查询的整点。参数值从不直接替换为sql命令,因此避免了sql injection attack的任何可能性。相反,它更像是执行这样的SQL代码:

declare @UserName nvarchar(50);
set @UserName =  '... magic here to populate this without actually building sql code';

SELECT UserId FROM BugNet.dbo.Users WHERE UserName = @UserName

(虽然对于Sql Server,它实际上依赖于sp_executesql

我会帮助你更多,但是你从来没有告诉我们你运行代码后实际发生了什么......这可能是因为你吞下任何可能告诉你出错的异常。您拥有的代码几乎肯定会抛出一个异常,它会告诉您这里出了什么问题,而且您永远无法看到它。

说真的,只需从该代码中完全删除try / catch。你根本不需要它,整个catch块只是额外的代码。

在我走之前还有一件事:AddWithValue() isn't the best option for your query parameters.

把所有这些放在一起,你得到一个看起来更像这样的帮助方法:

private string GetSqlScalar(string strSqlCommand, params SqlParameter[] parameters)
{
    string result = "";
    using (SqlConnection connection = new SqlConnection(strConnectionString))
    using (SqlCommand command = new SqlCommand(strSqlCommand, connection))
    {
        if (parameters != null)
        {
            command.Parameters.AddRange(parameters);
        }

        connection.Open();
        result = (string)command.ExecuteScalar();
    }

    return result;
}

然后像这样称呼它:

strUserId = GetSqlScalar("SELECT UserId FROM BugNet.dbo.Users WHERE UserName = @UserName", 
    new SqlParameter("@UserName", SqlDbType.NVarChar, 50) {Value = strUserNanme });

(当然使用数据库中正确的参数类型和长度)。