简体   繁体   中英

GroceryCrud with SQL Server (primarykey issue)

I try to use GroceryCRUD with SQL Server (2008 R2) to manage some table.

Well, I find the following thread very usefull on StackOverflow : How can I run grocery with sql server?

But, when I use $this->grocery_crud->set_relation , it returns an error "PrimaryKey not found" on the method set_primary_key. The table obviously has correctly set the primary key.

Can someone help me figure out where is the problem?

Ok. This is how I hack the code:

ref.version:

  • grocery-crud-1.5.2
  • CodeIgniter-3.0.1

STEP 1

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

Update method field_data($table)

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;
}

STEP 2

File: \\system\\database\\drivers\\sqlsrv\\sqlsrv_driver.php

Update method field_data($table)

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;
}

STEP 3

File: \\system\\database\\drivers\\mssql\\mssql_result.php

Update method 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;
}

That's all. I hope it can help other people.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM