C# 方法在ASP.Net中返回空字符串
我对这种方法有困难。它返回空字符串,这有什么问题 我有这个方法:C# 方法在ASP.Net中返回空字符串,c#,sql,asp.net,sql-server,database,C#,Sql,Asp.net,Sql Server,Database,我对这种方法有困难。它返回空字符串,这有什么问题 我有这个方法: public static string GetData(string Table1, string Column1, string WhereColumn, string WhereValue) { Table1 = Methods.cleaninjection(Table1); // Some injection method that cleans the string SqlConnection conn
public static string GetData(string Table1, string Column1, string WhereColumn, string WhereValue)
{
Table1 = Methods.cleaninjection(Table1); // Some injection method that cleans the string
SqlConnection connection = new SqlConnection(WebConfigurationManager.ConnectionStrings["connection"].ConnectionString);
SqlCommand command = new SqlCommand("SELECT " + "@Column1" + " FROM " + Table1 + " WHERE " + "@WhereColumn" + " = " + "@WhereValue", connection);
command.Parameters.AddWithValue("Column1", Column1);
command.Parameters.AddWithValue("WhereColumn", WhereColumn);
command.Parameters.AddWithValue("WhereValue", WhereValue);
try
{
if ((connection.State == ConnectionState.Closed) || (connection.State == ConnectionState.Broken))
{
connection.Open();
}
string veri = Convert.ToString(command.ExecuteScalar());
return veri;
}
finally
{
connection.Close();
}
}
运行此命令时,命令字符串如下所示:
从表1中选择@Column1,其中@WhereColumn=@WhereValue
它看起来是正确的,但我找不到哪里错了。有什么想法吗?如前所述,您不能参数化列名和表名。相反,请执行字符串连接:
"SELECT " + Column1 + " FROM " + Table1 + " WHERE " + WhereColumn + " = @WhereValue";
下面是您的代码应该是什么:
public static string GetData(string Table1, string Column1, string WhereColumn, string WhereValue)
{
Table1 = Methods.cleaninjection(Table1); // My injection method that cleans the string
string sql = "SELECT " + Column1 + " FROM " + Table1 + " WHERE " + @WhereColumn + " = @WhereValue";
using (SqlConnection connection = new SqlConnection(WebConfigurationManager.ConnectionStrings["connection"].ConnectionString))
{
using (SqlCommand command = new SqlCommand(sql, connection))
{
command.Parameters.Add("@WhereValue", SqlDbType.VarChar, 50).Value = WhereValue;
connection.Open();
string veri = Convert.ToString(command.ExecuteScalar());
return veri;
}
}
}
注:
AddWithValue
。改用参数。添加()
。据此,中,以确保正确清理资源
[]
尝试:
“从”…
中选择“+Column1+”,已尝试但未成功,谢谢。另外,@WhereColumn
。您不能将参数用作列或对象名。现在已成功,非常感谢@Dan GuzmanOkey谢谢,但这是否安全?你的意思是在你的代码中这样吗其中+WhereColumn+“=@WhereValue”;还要确保cleanInjection
除了@WhereValue
这是唯一的实际参数之外,几乎所有的东西都要清洗。您需要确保cleanInjection
能够胜任这项任务。总而言之,我认为@mrbengi的方法本身是有缺陷的。出于额外的安全目的,请使用[]
包装表名和列名。我认为在安全性方面,这两种方法是相同的。不同之处在于,AddWithValue()
必须推断数据库类型,这有时是错误的,并且会导致性能问题。Add
的好处是,您可以指定SQL数据类型,这与AddWithValue
不同。比如说,您有一个VARCHAR
列,AddWithValue
将您的参数作为NVARCHAR
发送。DB不会将参数转换为VARCHAR
,因为这可能会导致数据丢失。相反,该列将转换为NVARCHAR
,这使得您的WHERE
子句不可搜索。