我想从我的数据库中获取特定值。 为此,我写了一个我称之为的函数:
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;
}
答案 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 });
(当然使用数据库中正确的参数类型和长度)。