工作代码的格式为:
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
时,这会在表名中给出无效的语法错误这是什么正确的语法?
答案 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撰写的一篇文章,详细讨论并解释了不同的问题。