Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 方法在ASP.Net中返回空字符串_C#_Sql_Asp.net_Sql Server_Database - Fatal编程技术网

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
    。改用
    参数。添加()
    。据此,
  • AddWithValue()函数有一个问题:它必须推断 查询参数的数据库类型。事情是这样的: 有时它会弄错

  • 使用将对象包装在
    中,以确保正确清理资源

  • 出于其他安全目的,您可以将列名和表名用方括号括起来
    []

  • 尝试:
    “从”…
    中选择“+Column1+”,已尝试但未成功,谢谢。另外,
    @WhereColumn
    。您不能将参数用作列或对象名。现在已成功,非常感谢@Dan GuzmanOkey谢谢,但这是否安全?你的意思是在你的代码中这样吗其中+WhereColumn+“=@WhereValue”;还要确保
    cleanInjection
    除了
    @WhereValue
    这是唯一的实际参数之外,几乎所有的东西都要清洗。您需要确保
    cleanInjection
    能够胜任这项任务。总而言之,我认为@mrbengi的方法本身是有缺陷的。出于额外的安全目的,请使用
    []
    包装表名和列名。我认为在安全性方面,这两种方法是相同的。不同之处在于,
    AddWithValue()
    必须推断数据库类型,这有时是错误的,并且会导致性能问题。
    Add
    的好处是,您可以指定SQL数据类型,这与
    AddWithValue
    不同。比如说,您有一个
    VARCHAR
    列,
    AddWithValue
    将您的参数作为
    NVARCHAR
    发送。DB不会将参数转换为
    VARCHAR
    ,因为这可能会导致数据丢失。相反,该列将转换为
    NVARCHAR
    ,这使得您的
    WHERE
    子句不可搜索。