无法在nvarchar上调用方法 - 在db中没有nvarchar - 尝试参数化表名

时间:2014-07-08 15:46:02

标签: c# sql sql-server tsql ado.net

我正在尝试查询我的数据库以显示相关信息,它一直在运行,直到我开始使用参数。现在它告诉我,我无法在nvarchar上调用方法,我无法弄清楚问题。

当我做这样的事情时,我试图弄清楚这是不是一个错误:

@Parameter.customer_id

但我不确定。

这是我的查询行:

cmd.CommandText = "select Customer.customer_id, Customer.customer_name," +  
                  "@Product.license_start_date, " + p + ".version, " + p + "Details.processor " + 
                  "from Customer " + 
                  "left outer join " + p + 
                  " on Customer.customer_id = " + p + ".customer_id" + 
                  "left outer join " + p + "Details " +
                  "  on " + p + ".customer_id = " + p + "Details.customer_id";
cmd.Parameters.AddWithValue("@Product", ddProducts.SelectedItem.Text);

我使用+ p +只是为了确保查询正常运行,现在我正试图让它与参数一起使用

另外一个附带问题,我的表格是@ Product + Details(例如Computer,ComputerDetails)。我想这样做,所以我可以做+ Product +“Details”。我能这样做吗:

@Product Details

或者我必须有一个特殊参数吗?

1 个答案:

答案 0 :(得分:1)

这不是您使用参数来解决安全问题的方法 你应用应该知道什么表和什么列。

是的,你可以使用表变量和列名的.NET变量动态构建一个语句,但该变量永远不应该是用户直接输入(它们会在表名中键入)。

您可以在建立查询并插入tableNew或tableUsed的表名的情况下下载used与new。但你不能使用参数。

所有参数都是数据类型。 (没有列或表数据类型)
SqlDbType

让我们说用户可以输入零件描述 这是你永远不应该直接传递给TSQL的东西 你把它放在一个参数中,这样用户就不会做坏事。

string commandText = "UPDATE Sales.Store SET Demographics = @demographics "
    + "WHERE CustomerID = @ID;";

using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlCommand command = new SqlCommand(commandText, connection);
    command.Parameters.Add("@ID", SqlDbType.Int);
    command.Parameters["@ID"].Value = customerID;

    // Use AddWithValue to assign Demographics. 
    // SQL Server will implicitly convert strings into XML.
    command.Parameters.AddWithValue("@demographics", demoXml);

    try
    {
        connection.Open();
        Int32 rowsAffected = command.ExecuteNonQuery();
        Console.WriteLine("RowsAffected: {0}", rowsAffected);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}