У меня есть веб-приложение на основе CodeIgniter, которое ранее использовало базу данных MySQL. Я изменил файл database.php, чтобы подключить его к SQL Server после переноса всех данных / таблиц. Я сейчас тестирую приложение и логин сработал. Однако при добавлении объекта из формы в веб-приложение при запросе вставки выдается ошибка.
Ошибка указывает, что она не может быть вставлена в таблицу guests
, если свойство ID Insert включено.
Произошла ошибка базы данных
Номер ошибки: 23000/544
[Microsoft] [Драйвер ODBC 17 для SQL Server] [SQL Server] Невозможно вставить
явное значение для столбца идентичности в таблице 'гости', когда
Для параметра IDENTITY_INSERT установлено значение OFF.
INSERT INTO "guests" ("id", "firstname", "lastname", "gender", "dob",
"email", "country_id", "state_id", "city_id", "address", "mobile",
"id_type", "id_no", "remark", "vip", "password", "added") VALUES (0,
'abc', '123', '1', '', 'abc123@123.com', '', '', '', '', '899834534',
'', '', '', 0, '6367c48dd193d56ea7b0baad25b19455e529f5ee', '2019-01-21
09:58:11')
Имя файла: C: /wamp64/www/hms/system/database/DB_driver.php Номер строки:
691
Я знаю, что обходной путь - T-SQL SET IDENTITY_INSERT guests ON
, но почему эти запросы на вставку вообще так структурированы?
Я проверил DB_Driver.php, и вот, возможно, соответствующая часть
/**
* Generate an insert string
*
* @param string the table upon which the query will be performed
* @param array an associative array data of key/values
* @return string
*/
public function insert_string($table, $data)
{
$fields = $values = array();
foreach ($data as $key => $val)
{
$fields[] = $this->escape_identifiers($key);
$values[] = $this->escape($val);
}
return $this->_insert($this->protect_identifiers($table, TRUE, NULL, FALSE), $fields, $values);
}
// --------------------------------------------------------------------
/**
* Insert statement
*
* Generates a platform-specific insert string from the supplied data
*
* @param string the table name
* @param array the insert keys
* @param array the insert values
* @return string
*/
protected function _insert($table, $keys, $values)
{
return 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')';
}
Как я могу внести изменения в проект, чтобы он не пытался вставить столбец Identity в каждый запрос вставки?
Редактировать :
Вышеприведенный фрагмент кода, вероятно, не является тем местом, где формируется запрос, потому что я изменил его, и ошибка остается.