c# - Dapper 提供者依赖参数 token

标签 c# ado.net dapper

有没有办法为不同的提供者编写参数化的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

SQL服务器: enter image description here

甲骨文: enter image description here

关于c# - Dapper 提供者依赖参数 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52118230/

相关文章:

c# - 从 URL 字符串中提取查询字符串

c# - c# 中 async Func<Task<T>> 的 3 个调用有什么区别?

c# - 违反 PRIMARY KEY 约束。无法在对象中插入重复的键

c# - 在没有 Entity Framework 和数据表的情况下将 C# 中的复杂对象插入到 SQL Server 中

c# - Internet 上的客户端-服务器应用程序消息交换

c# - 当 FormBorderStyle 为 None 时,如何以编程方式显示窗口的系统菜单?

c# - SqlExpress LocalDb 无法打开文件

.net - 在数据源中删除的行的 DataAdapter.Fill() 行为

f# - Dapper 列到 F# 选项属性

c# - 我应该如何使用 Dapper,c# 将数组传递给 FIELD 语句