【问题标题】:ServiceStack OrmLite for Oracle hangs during selectServiceStack OrmLite for Oracle 在选择期间挂起
【发布时间】:2013-07-18 08:37:46
【问题描述】:

我正在尝试 ServiceStack OrmLite(使用 Oracle 数据库)。但它只是挂在db.Select.. 它也没有抛出异常.. 它只是挂在那里,好像有太多数据要加载。

我已经在我的电脑上安装了最新的 oracle 即时客户端 12.1。

这是我的 OrmLite 代码:

namespace ConsoleApplication1
{
    class Program
    {
            static void Main(string[] args) {
            string DbConnection = 
                "SERVER=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xxx.xxx.xxx.xxx)(PORT=9530))(CONNECT_DATA=(SERVICE_NAME=MYSID)));uid=myusername;pwd=mypassword";

            var dbFactory = new OrmLiteConnectionFactory(
                DbConnection, false, OracleDialect.Provider);

            using (var db = dbFactory.Open()) {
                var res = db.Select<Einduk>().Take(10);  //<-- it hangs here, no stacktrace whatsoever
                foreach (var einduk in res) {
                    Console.WriteLine(einduk.ToString());
                }
            }
            Console.ReadLine();
        }
    }
}

这是我的模型类:

namespace ConsoleApplication1
{
    public class Einduk
    {           
        [PrimaryKey]
        public string Akaun { get; set; }
        public string Jenis { get; set; }
        public string Bakaun { get; set; }
        public string Oldac { get; set; }
        public string Plgid { get; set; }
        public string Pnama { get; set; }
        public string Almat { get; set; }
        public string Kslah { get; set; }
        public DateTime? Trikh { get; set; }
        public decimal? Amaun { get; set; }

        public override string ToString() {
            return string.Format("Jenis: {0}, Akaun: {1}, Bakaun: {2}, Oldac: {3}, Plgid: {4}, Pnama: {5}, Almat: {6}, Kslah: {7}, Trikh: {8}, Amaun: {9}", Jenis, Akaun, Bakaun, Oldac, Plgid, Pnama, Almat, Kslah, Trikh, Amaun);
        }
    }
}

这是我的表,请注意该表没有主键。但在我的模型中,我将Akaun 设置为主键,因为我知道它是唯一的。 这会导致问题吗?

CREATE TABLE "EINDUK" 
(   
    "JENIS" CHAR(1 BYTE), 
    "AKAUN" VARCHAR2(40 BYTE), 
    "BAKAUN" VARCHAR2(50 BYTE), 
    "OLDAC" VARCHAR2(20 BYTE), 
    "PLGID" VARCHAR2(15 BYTE), 
    "PNAMA" VARCHAR2(100 BYTE), 
    "ALMAT" VARCHAR2(282 BYTE), 
    "KSLAH" VARCHAR2(508 BYTE), 
    "TRIKH" DATE, 
    "AMAUN" NUMBER
)

【问题讨论】:

  • 我怀疑我不应该使用.Take()...嗯...任何线索如何限制返回的行数?
  • 没关系.. 我应该使用db.select&lt;Einduk&gt;("rownum &lt; 10") 而不是.Take()

标签: ormlite-servicestack


【解决方案1】:

当您执行 Select().Take(10) 时,您尝试加载内存中的所有数据,然后尝试从(内存中)列表中获取前 10 条记录。而不是使用不带参数的选择,试试这个

  SqlExpressionVisitor<Einduk> ev = OrmLiteConfig.DialectProvider.ExpressionVisitor<Einduk>();
  ev = ev.Limit(0,10);
  var res = db.Select<Einduk>(ev);

为了了解Ormlite的特性,请阅读README.md文件:

https://github.com/ServiceStack/ServiceStack.OrmLite/blob/master/README.md

【讨论】:

  • 感谢SqlExpressionVisitor的解释。与这样做 db.select&lt;Einduk&gt;("rownum &lt; 10") 相比,使用它有什么好处吗?我假设使用SqlExpressionVisitor 将确保我的代码不依赖于数据库?
  • 如果您只是打算使用 Oracle,则不可以。但是如果您想切换到其他数据库,则此代码不起作用-当您使用 ormlite 时,框架使用适当的代码进行包装分页结果 sql - 例如,如果您想获取 Sql Server 中的前 10 行,框架会自动在您的选择中使用“Top 10”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多