1

我想在 C# 中使用ServiceStack 的 OrmLite来查询AWS RedShift。AWS RedShift 使用 postgresql 有线协议作为其查询接口,并对可以运行的查询施加了一些限制,其中之一是它不能接受参数化查询(我被告知;我实际上还没有找到这在文档中得到了支持)。

因此,我正在研究是否可以使用 ORM 生成参数化 SQL,然后在参数值中查找/替换。

如何访问 OrmLite 生成的 SQL,然后在运行之前对其进行更改?

4

2 回答 2

1

OrmLite 的文档中:

默认情况下 OrmLite使用参数化 SQL。只有对所有 SQL 操作使用参数化语句的 API,这些都用 Param 后缀标识,例如:

参数化写操作

db.InsertParam(new Person { FirstName = "Jimi", LastName = "Hendrix", Age = 27})
db.UpdateParam(new Person { FirstName = "Jimi", LastName = "Hendrix", Age = 27})
db.DeleteByIdParam<Person>(1)
Parameterized Read operations

var people = db.SelectParam<Person>(q => q.Age == 27)
var person = db.GetByIdParam<Person>(1)

//Existing parameterized query API's
var people = db.Where<Person>(new { FirstName = "Jimi", Age = 27 })
var people = db.Query<Track>("FirstName = @name and Age = @age", 
    new { name = "Jimi", age = 27 })

此外,包含单词QueryWhere的选择方法也使用参数化 SQL(其他选择方法不使用)。传递到 Where 的匿名类型被视为 AND 过滤器。

var track3 = db.Where<Track>(new { AlbumName = "Throwing Copper", TrackNo = 3 })

查询语句使用提供的匿名类型(如果有)的属性接收参数化 SQL

var track3 = db.Query<Track>(
"select * from Track Where AlbumName = @album and TrackNo = @trackNo", 
    new { album = "Throwing Copper", trackNo = 3 })

在它执行之后(不是之前),你可以得到 Last SQL 语句生成:

db.GetLastSql()
于 2013-06-04T14:36:38.337 回答
1

OrmLite 不会(当前)使其生成的 SQL 直到执行后才可用。

我发现 RedShift 实际上确实支持参数化查询。

于 2013-06-05T15:48:12.047 回答