如何在c# SqlCommand中为表指定模式限定符?
本文关键字:模式 SqlCommand | 更新日期: 2023-09-27 18:08:48
工作代码的形式为:
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。无效的对象名称'myTable'。
好的,我明白了,它找不到它,因为它不再是dbo.
了。
我试着添加一行:
cmd.Parameters.AddWithValue("@SchemaName", 'mySchema');
,但没有明显的影响。
然后根据How use a SqlCommand Parameter为select查询指定模式名
我试着添加行到我的SQL
DECLARE @SchemaName sysname
SET @SchemaName = 'mySchema'
SELECT foo FROM @SchemaName.[myTable]
,但这给了我一个无效的语法错误在表名执行SQL SELECT
正确的语法是什么?
如果你的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";
模式限定符是不能用变量指定的项之一(很像列名和表名)。
为此,您需要使用动态SQL—构造SQL并执行它。
这有其自身的危险(SQL注入是主要的)。
动态SQL的诅咒和祝福是Erland Sommarskog的一篇文章,详细讨论和解释了不同的问题。