提问人:user2717436 提问时间:7/19/2022 最后编辑:Thom Auser2717436 更新时间:7/20/2022 访问量:348
使用参数创建 SQL 数据库
Create SQL Database with parameters
问:
我在SQL中有一个代码,它使用以下命令创建数据库:
string query = String.Format(
"CREATE DATABASE [{0}] ON PRIMARY (NAME = N'{0}', FILENAME = N'{1}') LOG ON (NAME = N'{0}_Log', FILENAME = N'{2}') FOR ATTACH",
dbName, dbFile, logFile)
但是,此代码向 SQL 注入公开。
使用参数重写上述查询不起作用,我知道像 CREATE DATABASE 这样的 DDL 命令不支持参数。
在带有动态参数的代码中编写此 SQL 命令的正确方法是什么?
我宁愿不使用存储过程,因为这是我的代码基础结构的巨大变化。
答:
2赞
Charlieface
7/19/2022
#1
引用需要用于动态 SQL 的名称。QUOTENAME
const string query = @"
DECLARE @sql NVARCHAR(MAX) = N'
CREATE DATABASE ' + QUOTENAME(@dbName) + '
ON PRIMARY (NAME = ' + QUOTENAME(@dbName) + ', FILENAME = ' + @dbFile + ')
LOG ON (NAME = ' + QUOTENAME(@dbName + '_Log') + ', FILENAME = ' + @logFile + ')
FOR ATTACH;
';
EXEC sp_executesql @sql;
";
using (var conn = new SqlConnection("YourConnectionString"))
using (var comm = new SqlCommand(query, conn))
{
comm.Parameters.Add("@dbName", SqlDbType.NVarChar, 128).Value = dbName;
comm.Parameters.Add("@dbFile", SqlDbType.NVarChar, 260).Value = dbFile.Replace("'", "''");
comm.Parameters.Add("@logFile", SqlDbType.NVarChar, 260).Value = logFile.Replace("'", "''");
conn.Open();
comm.ExecuteNonQuery();
}
评论
0赞
Jodrell
7/19/2022
两个直接的问题,文件路径绝对不应该传递,我也不确定日志和数据名称。此外,文件路径的参数可能会截断有效值。QUOTENAME
评论
sp_executesql
呢?