简体   繁体   English

带有SQL Server的GroceryCrud(主键问题)

[英]GroceryCrud with SQL Server (primarykey issue)

I try to use GroceryCRUD with SQL Server (2008 R2) to manage some table. 我尝试将GroceryCRUD与SQL Server(2008 R2)一起使用来管理某些表。

Well, I find the following thread very usefull on StackOverflow : How can I run grocery with sql server? 好吧,我发现以下线程在StackOverflow上非常有用: 如何使用sql server运行杂货店?

But, when I use $this->grocery_crud->set_relation , it returns an error "PrimaryKey not found" on the method set_primary_key. 但是,当我使用$this->grocery_crud->set_relation ,它在set_primary_key方法上返回错误“ PrimaryKey not found”。 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 食品杂货1.5.2
  • CodeIgniter-3.0.1 CodeIgniter-3.0.1

STEP 1 第1步

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

Update method field_data($table) 更新方法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 第2步

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

Update method field_data($table) 更新方法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 步骤3

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

Update method field_data() 更新方法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. 我希望它可以帮助其他人。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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