将tablename传递给存储过程c#

时间:2018-01-03 15:59:08

标签: c# stored-procedures

我是编程新手,我是用Visual Studio编程的。我试图从用户那里获得一个输入(像google.com这样的网站的名称)并向我的桌面搜索网站名称(我有不同的域名表,例如.com,.org等)。

所以,我试图编写这个存储过程,从没有实际表名的表中选择(我试图将表名从输入传递到存储过程)这里是我的存储过程:

CREATE PROCEDURE test
    @link nvarchar(50)
AS
    SELECT * 
    FROM @link

我已定义linksg(设置和获取),如下所示:

public string linksg
{
    get { return link; }
    set { link = value; }
}

这就是我在函数中定义linksg的方式(我的search_sitedomain函数采用类似.com的域名,并提供指向包含.com表格等网站名称的表格的链接:

public void search_sitedomain()
{
    SqlConnection con = new SqlConnection("Data Source=SM;Initial Catalog=mohandesi-net;Integrated Security=True;Pooling=False");

    SqlCommand cmd = new SqlCommand("search_sitedomain", con);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@domain", domain);

    con.Open();
    string link = Convert.ToString(cmd.ExecuteScalar());
    linksg = link;
    MessageBox.Show(link);
}

search_sitedomain函数完全正常并返回链接,但我的存储过程无法正常工作,因为它无法用表名替换@link(如.com)

那么我做错了什么?

1 个答案:

答案 0 :(得分:1)

在我看来,有一个参数化的表名是一个巨大的安全漏洞,但它可以这样做:

CREATE PROCEDURE test
@link nvarchar(50)
AS
EXEC ('SELECT * FROM dbo.['+@link+']');