2009-04-17 54 views
0

也許我做錯了,但這裏有雲:subsonic.migrations和Oracle XE

我試圖創建一個使用subsonic.migrations在OracleXE版本10.2.0.1.0數據庫。我安裝了ODP v 10.2.0.2.20。

這是我的app.config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="SubSonicService" type="SubSonic.SubSonicSection, SubSonic" requirePermission="false"/> 
    </configSections> 

    <connectionStrings> 
    <add name="test" connectionString="Data Source=XE; User Id=test; Password=test;"/> 
    </connectionStrings> 

    <SubSonicService defaultProvider="test"> 
    <providers> 
     <clear/> 
     <add name="test" type="SubSonic.OracleDataProvider, SubSonic" connectionStringName="test" generatedNamespace="testdb"/> 
    </providers> 
    </SubSonicService> 

</configuration> 

這是我的第一次遷移:

public class Migration001_Init : Migration { 

     public override void Up() { 

      //Create the records table 
      TableSchema.Table records = CreateTable("asdf"); 
      records.AddColumn("RecordName"); 
     } 

     public override void Down() { 
      DropTable("asdf"); 
     } 
    } 

當我運行sonic.exe,我得到這個異常:

Setting ConfigPath: 'App.config' 
Building configuration from D:\Users\carlucci\Documents\Visual Studio 2008\Projects\Wum\Wum.Migration\App.config 
Adding connection to test 
ERROR: Trying to execute migrate 
Error Message: System.Data.OracleClient.OracleException: ORA-02253: especifica‡Æo de restri‡Æo nÆo permitida aqui 

    at System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc) 
    at System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, Boolean needRowid, OciRowidDescriptor& rowidDescriptor, ArrayList& resultParameterOrdinals) 
    at System.Data.OracleClient.OracleCommand.ExecuteNonQueryInternal(Boolean needRowid, OciRowidDescriptor& rowidDescriptor) 
    at System.Data.OracleClient.OracleCommand.ExecuteNonQuery() 
    at SubSonic.OracleDataProvider.ExecuteQuery(QueryCommand qry) in D:\@SubSonic\SubSonic\SubSonic\DataProviders\OracleDataProvider.cs:line 350 
    at SubSonic.DataService.ExecuteQuery(QueryCommand cmd) in D:\@SubSonic\SubSonic\SubSonic\DataProviders\DataService.cs:line 544 
    at SubSonic.Migrations.Migrator.CreateSchemaInfo(String providerName) in D:\@SubSonic\SubSonic\SubSonic.Migrations\Migrator.cs:line 249 
    at SubSonic.Migrations.Migrator.GetCurrentVersion(String providerName) in D:\@SubSonic\SubSonic\SubSonic.Migrations\Migrator.cs:line 232 
    at SubSonic.Migrations.Migrator.Migrate(String providerName, String migrationDirectory, Nullable`1 toVersion) in D:\@SubSonic\SubSonic\SubSonic.Migrations\Migrator.cs:line 50 
    at SubSonic.SubCommander.Program.Migrate() in D:\@SubSonic\SubSonic\SubCommander\Program.cs:line 264 
    at SubSonic.SubCommander.Program.Main(String[] args) in D:\@SubSonic\SubSonic\SubCommander\Program.cs:line 90 
Execution Time: 379ms 

我在做什麼錯?

非常感謝任何幫助:)

安德烈·卡盧奇

UPDATE: 正如指出的安東,問題是亞音速OracleSqlGenerator。它試圖使用此sql創建模式表:

CREATE TABLE SubSonicSchemaInfo (
     version int NOT NULL CONSTRAINT DF_SubSonicSchemaInfo_version DEFAULT (0) 
) 

哪一個不能在oracle上工作。正確的SQL是:

CREATE TABLE SubSonicSchemaInfo (
    version int DEFAULT (0), 
    constraint DF_SubSonicSchemaInfo_version primary key (version) 
) 

有趣的是,因爲這是亞音速遷移執行的第一個SQL,從來沒有人測試了甲骨文。

回答

1

只是胡亂猜測(我不完全瞭解有關精確CREATE TABLE語法用於Oracle):以「0」爲默認值亞音速嘗試創建一個「架構信息」表(見this,搜索private static void CreateSchemaInfo(string providerName))。它在內部使用OracleGenerator,它基本上是ANSIGenerator,所以這可能是問題所在。

+0

你是對的!我做了一步一步的調試,可以看到亞音速使用的是與oracle完全不同的SQL。謝謝! – andrecarlucci 2009-04-17 16:19:19

0

這是我的錯。我沒有Oracle許可,也沒有關於它如何工作的一點線索。我試圖做的(關於SQL生成)是使用虛擬方法生成符合ANSI的SQL(嗯,我知道 - 但一個人可以夢想),每個提供者可以根據需要調整。

Eric和其他人(使用Oracle)測試了大部分查詢等 - 但您是對的 - 我們從未有機會在Oracle上測試遷移。這是我的錯,我承擔責任。我需要花一些時間去了解Oracle - 或者找一個願意在這裏投入更多時間的提交者。

+0

這也是亞音速存在的缺點,讓我們老實說,它真的很有趣。 關於oracle,你可以下載oracle express(http://www.oracle.com/technology/products/database/xe/index.html),它是開發的免費版本,它具有你需要的所有功能。無論如何,我會看看這個,歡呼! – andrecarlucci 2009-04-17 19:18:23