3

工作代码的形式为:

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');

但这没有明显的效果。

然后基于如何使用 SqlCommand 参数来指定选择查询的架构名称

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

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

但这给了我在执行 SQL SELECT 时表名的无效语法错误

什么是正确的语法?

4

2 回答 2

3

如果您的 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"; 
于 2013-04-12T19:24:47.567 回答
1

模式限定符是不能用变量指定的项目之一(很像列名和表名)。

为此,您将需要使用动态 SQL - 构建 SQL 并执行它。

这有其自身的危险(主要是SQL 注入)。

The Curse and Blessings of Dynamic SQL 是 Erland Sommarskog 的一篇文章,详细讨论和解释了不同的问题。

于 2013-04-12T19:16:49.490 回答