有没有办法为不同的提供者编写参数化的sql?
例子:
connection.QuerySingle<string>("select name from user where id = :id", new {id = 4});
这适用于 oracle 提供程序,但 MsSql 需要“@id”作为参数。
Dapper 常见问题解答说:
It's your job to write the SQL compatible with your database provider.
但是怎么办?目前我们有以下解决方法:
$".. where id = {db.ParamToken}id"
但是用较大的 SQL 编写真的很难看。
有没有办法让所有提供者都拥有一个 token ?
最佳答案
"Is there a way to have one token for all providers?"
是的,但它需要一些设置。您可以从现有的 DBConnection
中检索有用的数据库提供程序特定信息。首先检索 DataSourceInformation来自连接的表:
DbConnection connection = GetSomeConnection();
var infoTable = connection.GetSchema(DbMetaDataCollectionNames.DataSourceInformation);
该表将有一行包含各种提供者信息。关于参数命名,将有一个名为 ParameterMarkerPattern
的列,它表示用于验证参数的 Regex
模式字符串。如果该列有数据,第一个字符将是您的 DbParameter
标记。如果该列为空,ParameterMarkerFormat
可以为您提供在构建参数名称时应用的字符串格式。
"But that's really ugly to write in larger SQL's".
如果您正在考虑直接格式化您的 SQL,这并不能真正解决这个问题,并且您的解决方法已经比这简单得多。然而,您从 DataSourceInformation
获得的额外数据应该足以让您将自己的字符串传递给您创建的方法,这将替换默认参数起始字符(如 @
) 与提供商提供的正确代码:
string sql = SqlIfy("SELECT name FROM user WHERE id = @id");
您可以更进一步,对带引号的标识符执行相同的操作。你可以传入如下内容:
“SELECT [Name] FROM [dbo].[SomeTable]”
然后让它像
SELECT "Name"FROM "dbo"."SomeTable"
一切取决于供应商。如果您想在某些自定义基础提供程序类上动态构建查询,您可以打开一个初始连接并存储所有提供程序特定的数据。您不希望每次使用连接时都调用 DbConnection.GetSchema
。
关于c# - Dapper 提供者依赖参数 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52118230/