【问题标题】:GroceryCrud with SQL Server (primarykey issue)使用 SQL Server 的 Grocery Crud(主键问题)
【发布时间】:2015-09-28 08:18:20
【问题描述】:

我尝试使用 GroceryCRUD 和 SQL Server (2008 R2) 来管理一些表。

好吧,我发现 StackOverflow 上的以下线程非常有用: How can I run grocery with sql server?

但是,当我使用 $this->grocery_crud->set_relation 时,它在方法 set_primary_key 上返回错误“未找到主键”。 该表显然已经正确设置了主键。

谁能帮我找出问题出在哪里?

【问题讨论】:

    标签: php sql-server codeigniter grocery-crud


    【解决方案1】:

    好的。这就是我破解代码的方式:

    参考版本:

    • grocery-crud-1.5.2
    • CodeIgniter-3.0.1

    第 1 步

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

    更新方法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;
    }
    

    第 2 步

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

    更新方法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;
    }
    

    第 3 步

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

    更新方法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;
    }
    

    就是这样。我希望它可以帮助其他人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-14
      • 2012-06-05
      • 1970-01-01
      相关资源
      最近更新 更多