簡體   English   中英

帶有SQL Server的GroceryCrud(主鍵問題)

[英]GroceryCrud with SQL Server (primarykey issue)

我嘗試將GroceryCRUD與SQL Server(2008 R2)一起使用來管理某些表。

好吧,我發現以下線程在StackOverflow上非常有用: 如何使用sql server運行雜貨店?

但是,當我使用$this->grocery_crud->set_relation ,它在set_primary_key方法上返回錯誤“ PrimaryKey not found”。 該表顯然已正確設置了主鍵。

有人可以幫我找出問題所在嗎?

好。 這是我修改代碼的方式:

參考版本:

  • 食品雜貨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;
}

就這樣。 我希望它可以幫助其他人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM