2015-09-28 2 views
0

Я пытаюсь использовать GroceryCRUD с SQL Server (2008 R2) для управления некоторой таблицей.GroceryCrud с SQL Server (основная проблема с ключом)

Ну, я нахожу следующую нить очень полезно на StackOverflow: How can I run grocery with sql server?

Но, когда я использую $this->grocery_crud->set_relation, он возвращает ошибку «PrimaryKey не найден» на метод set_primary_key. Таблица, очевидно, правильно установила первичный ключ.

Может кто-нибудь помочь мне выяснить, в чем проблема?

ответ

0

Хорошо. Это, как я взломать код:

ref.version:

  • продуктовый падла-1.5.2
  • CodeIgniter-3.0.1

ШАГ 1

system\database\drivers\pdo\subdrivers\pdo_sqlsrv_driver.php

метод обновления field_data ($ таблица)

public function field_data($table) 
{ 

    $sql = 'SELECT c.COLUMN_NAME, c.DATA_TYPE, c.CHARACTER_MAXIMUM_LENGTH, c.NUMERIC_PRECISION, c.COLUMN_DEFAULT 
      ,CASE WHEN pk.COLUMN_NAME IS NOT NULL THEN 1 ELSE 0 END AS KeyType 
       FROM INFORMATION_SCHEMA.COLUMNS c 
       LEFT JOIN (
        SELECT ku.TABLE_CATALOG,ku.TABLE_SCHEMA,ku.TABLE_NAME,ku.COLUMN_NAME 
        FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc 
        INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS ku 
         ON tc.CONSTRAINT_TYPE = \'PRIMARY KEY\' 
         AND tc.CONSTRAINT_NAME = ku.CONSTRAINT_NAME 
       ) pk 
       ON c.TABLE_CATALOG = pk.TABLE_CATALOG 
        AND c.TABLE_SCHEMA = pk.TABLE_SCHEMA 
        AND c.TABLE_NAME = pk.TABLE_NAME 
        AND c.COLUMN_NAME = pk.COLUMN_NAME 
        WHERE UPPER(c.TABLE_NAME) = '.$this->escape(strtoupper($table)); 

    if (($query = $this->query($sql)) === FALSE) 
    { 
     return FALSE; 
    } 
    $query = $query->result_object(); 

    $retval = array(); 
    for ($i = 0, $c = count($query); $i < $c; $i++) 
    { 
     $retval[$i]   = new stdClass(); 
     $retval[$i]->name  = $query[$i]->COLUMN_NAME; 
     $retval[$i]->type  = $query[$i]->DATA_TYPE; 
     $retval[$i]->max_length  = ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION; 
     $retval[$i]->primary_key = $query[$i]->KeyType; 
     $retval[$i]->default  = $query[$i]->COLUMN_DEFAULT; 
    } 

    return $retval; 
} 

ШАГ 2

файла: \system\database\drivers\sqlsrv\sqlsrv_driver.php

метод обновления field_data ($ таблица)

public function field_data($table) 
{ 

    $sql = 'SELECT c.COLUMN_NAME, c.DATA_TYPE, c.CHARACTER_MAXIMUM_LENGTH, c.NUMERIC_PRECISION, c.COLUMN_DEFAULT 
      ,CASE WHEN pk.COLUMN_NAME IS NOT NULL THEN 1 ELSE 0 END AS KeyType 
       FROM INFORMATION_SCHEMA.COLUMNS c 
       LEFT JOIN (
        SELECT ku.TABLE_CATALOG,ku.TABLE_SCHEMA,ku.TABLE_NAME,ku.COLUMN_NAME 
        FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc 
        INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS ku 
         ON tc.CONSTRAINT_TYPE = \'PRIMARY KEY\' 
         AND tc.CONSTRAINT_NAME = ku.CONSTRAINT_NAME 
       ) pk 
       ON c.TABLE_CATALOG = pk.TABLE_CATALOG 
        AND c.TABLE_SCHEMA = pk.TABLE_SCHEMA 
        AND c.TABLE_NAME = pk.TABLE_NAME 
        AND c.COLUMN_NAME = pk.COLUMN_NAME 
        WHERE UPPER(c.TABLE_NAME) = '.$this->escape(strtoupper($table)); 

    if (($query = $this->query($sql)) === FALSE) 
    { 
     return FALSE; 
    } 
    $query = $query->result_object(); 

    $retval = array(); 
    for ($i = 0, $c = count($query); $i < $c; $i++) 
    { 
     $retval[$i]   = new stdClass(); 
     $retval[$i]->name  = $query[$i]->COLUMN_NAME; 
     $retval[$i]->type  = $query[$i]->DATA_TYPE; 
     $retval[$i]->max_length  = ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION; 
     $retval[$i]->primary_key = $query[$i]->KeyType; 
     $retval[$i]->default  = $query[$i]->COLUMN_DEFAULT; 
    } 

    return $retval; 
} 

ШАГ 3

Файл: \system\database\drivers\mssql\mssql_result.php

метод Update field_data()

public function field_data() 
{ 
    $retval = array(); 
    for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) 
    { 
     $field = mssql_fetch_field($this->result_id, $i); 

     $retval[$i]  = new stdClass(); 
     $retval[$i]->name = $field->name; 
     $retval[$i]->type = $field->type; 
     $retval[$i]->max_length = $field->max_length; 
     $retval[$i]->primary_key = $field->primary_key; 

    } 

    return $retval; 
} 

Это все. Надеюсь, это поможет другим людям.