如何为C#SqlCommand中的表指定模式限定符?

时间:2013-04-12 19:14:40

标签: c# sql-server

工作代码的格式为:

string sql = "SELECT foo from myTable";
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
contractTable = new DataTable();
da.Fill(contractTable);

现在数据库架构已从dbo更改为mySchema,这不是我用户的默认设置 架构,我没有管理员权限来更改它。当我尝试运行代码时,我得到了:

  

System.Data.SqlClient.SqlException:无效的对象名称'myTable'。

好的,我理解,它找不到它,因为它不再是dbo.

我尝试添加一行:

cmd.Parameters.AddWithValue("@SchemaName", 'mySchema');

但是没有可观察到的效果。

然后基于How to use a SqlCommand Parameter to specify the schema name for a select query

我尝试将这些行添加到我的SQL

DECLARE @SchemaName sysname
SET @SchemaName = 'mySchema'
SELECT foo FROM @SchemaName.[myTable]

但是在执行SQL SELECT

时,这会在表名中给出无效的语法错误

这是什么正确的语法?

2 个答案:

答案 0 :(得分:2)

如果您的SQL确实是您的代码,那么这应该有效:

string aSchema = "newSchema";
string sql = "SELECT foo from " + aSchema + ".myTable"; 

但它确实存在SQL注入的危险

此外,您可以将架构名称放在配置文件中,并引用C#代码中的配置条目。如果架构再次发生变化,这将在未来保护您。

string aSchema = ConfigurationManager.AppSettings.Get("schema_name");
string sql = "SELECT foo from " + aSchema + ".myTable"; 

答案 1 :(得分:1)

模式限定符是无法使用变量指定的项之一(非常类似于列和表名)。

您需要使用dynamic SQL - 构造SQL并执行它。

这带来了自身的危险(SQL Injection是主要的)。

动态SQL的诅咒与祝福是Erland Sommarskog撰写的一篇文章,详细讨论并解释了不同的问题。