Ошибка подключения при доступе к Sage Timberline Accounting с помощью PHP и ODBC в Windows
Я пытаюсь подключиться к базе данных Sage Timberline Accounting на моем Windows 2003 Server, используя PHP 5.3. У меня правильно установлен PHP с IIS как fastcgi. У меня есть системный DSN, настроенный в ODBC Manager и правильно настроенный для базы данных Timberline.
Вот мой PHP-скрипт.
<?php
$conn = odbc_connect("Timberline ODBC","user", "password");
?>
Я получаю следующую ошибку:
Предупреждение: odbc_connect(): ошибка SQL: [Sage Timberline Office][Драйвер ODBC для Sage Timberline Office] [Библиотека файлов DRM] Неверное имя учетной записи. Состояние SQL 08001 в SQLConnect в C:\Inetpub\wwwroot\index.php в строке 3
Неважно, какую действительную комбинацию имени пользователя и пароля Timberline я пытаюсь использовать.
Кто-нибудь может помочь?
5 ответов
Не уверен, что это все еще вопрос или нет... но вы понимаете, что распространенное SQL-соединение - это индексный файл, который затем имеет индексные ссылки на другую информацию? Более известный как структура базы данных с плоскими файлами.
Таким образом, нет никакого чистого способа сделать соединение. Я работаю над аналогичной проблемой, связанной с подключением моего сервера MSSQL к базе данных Timberline, и он не так чист, как вы думаете.
Вы пытались загрузить драйвер Timberline на веб-сервер или в рассматриваемое приложение для потребления? Sage совсем не упростил вам доступ к этой информации, и если бы у меня было 2 цента, чтобы сказать об этом наборе приложений, я бы посоветовал против нее ВСЕХ цен.
Пока здесь есть строка подключения, которая работает через VS2k5. Это строка DSN, но строка подключения тем не менее. Проблема, с которой я столкнулся - это отсоединение части DSN от строки подключения и заставить ее работать должным образом.
DSN=<whatever>;uid=<userid>;dbq=<PathToDirectory>;codepage=1252;
maxcolsupport=1536;dictionarymode=0;standardmode=0;shortennames=1;databasetype=1
Это должно работать для ADO, но не может заставить его работать должным образом:
Provider=MSDASQL.1;Driver={Timberline Data};dbq=<PathToDirectory>;
uid=<userid>;pwd=<password>;codepage=1252
Убедитесь, что IIS работает как пользователь, имеющий доступ к каталогу Timberline (путь, который вы указали для параметра dbq в строке подключения).
Измените настройку "Вход в систему" службы IIS. Опять же, убедитесь, что вы используете учетную запись, у которой есть доступ к сетевому расположению ваших данных на линии связи.
Недавно я потратил много времени на эту работу; Я нашел несколько десятков сообщений людей, которые не смогли соединиться; но очень мало ответов. Это мои уроки:
Sage Timberline Office, теперь называемый Sage CRE 300, использует базу данных Pervasive SQL. Их путь обновления к SQL Server к концу 2019 года.
Есть 2 ODBC-соединения, которые вы можете использовать для подключения:
1. Используйте родные драйверы Pervasive ODBC
Драйверы ODBC включены в бесплатный Pervasive Client. Просто найдите последнюю версию.
Оба, 32 и 64-битные драйверы включены.
PHP позволяет подключаться через простую строку подключения, такую как: odbc_connect("Driver={Pervasive ODBC Interface};ServerName=myserver;ServerDSN=mydsn;", "", "", SQL_CUR_USE_ODBC);
У Pervasive есть много хорошей современной доступной документации.
Один гигантский недостаток: вы можете только читать данные. Поля Sage помечены внутри и требуют пароль для обновления. Sage не предоставит пароль; даже за плату. (Я старался).
2. Используйте предоставленный Sage драйвер ODBC
Единственный способ получить драйвер ODBC - установить Sage Client. (Но читайте дальше, так как вы, вероятно, не хотите этого делать).
Драйвер Sage ODBC называется Timberline Data и продуктом Simba.
Драйвер доступен только в 32-битной версии.
Драйвер делает больше, чем интерфейс: - распространяющиеся имена таблиц и полей короткие; этот драйвер ODBC действует как переводчик, предоставляющий длинные имена. Есть 2 версии этих длинных имен. Решите, что вы хотите использовать, и придерживайтесь его. - Драйвер Sage ODBC позволяет обновлять поля. Не все поля; только поля, которые Sage позволяет вам изменить. Если обновление имеет решающее значение, то это ваш единственный вариант.
Это официальная строка подключения, и как вы будете использовать ее в PHP:
odbc_connect("Driver={Timberline Data};UID=Mark;PWD=sage123!;DBQ=C:\Documents and Settings\All Users\Application Data\Sage\Timberline Office\Data\Construction Sample Data;CODEPAGE=1252;DictionaryMode=0;StandardMode=1;MaxColSupport=1536;", "", "", SQL_CUR_USE_ODBC);
У меня не было никакой пользы UID=Mark;PWD=sage123!;
Конечно, убедитесь, что удвоили все обратные слеши. C:\\Documents and Settings\\All..
Сейдж утверждает, что их драйвер ODBC был протестирован только с продуктами MS Office; но он также будет работать с C++, C# и т. д. (поддержка Per Sage.)
Со следующим исключением: мне не удалось использовать UNC-путь в строке подключения с C# или PHP. У MS Access не было проблем с подключением по UNC-пути. Я не мог заставить PHP работать со строкой. Сопоставленные диски не помогли; они могут работать на вас.
подсказки:
- Убедитесь, что вы используете PHP 32 bit для драйвера Sage ODBC; 64 бит не будет работать!
- Для тестирования подключение с MS Access к ODBC-драйверу было несложным; это послужило хорошим способом получения имен таблиц и полей и подтверждения строки подключения.
- В итоге я настроил веб-сервер и установил экземпляр PHP на сервере Sage. Это имеет следующие преимущества:
- Нет необходимости устанавливать Sage Client (500 МБ) на ваш веб-сервер.
- Предоставляет 32-битную опцию, если ваш основной сайт работает в 64-битной среде.
- Нет проблем с путями UNC
Я использую этот код для построения строк подключения для использования с ADO.NET для подключения к Timberline. Вы можете использовать его как шаблон для построения строки подключения в PHP. Также рассмотрите возможность использования DSN по умолчанию "Источник данных Timberline".
public class TimberlineConnectionStringBuilder
{
public static string GetConnectionString(string username, string password, string dataFilePath, string dsn)
{
var builder = new OdbcConnectionStringBuilder { Dsn = dsn };
builder.Add("uid", username);
builder.Add("dbq", dataFilePath);
builder.Add("codepage", 1252);
builder.Add("dictionarymode", 0);
builder.Add("standardmode", 1);
builder.Add("maxcolsupport", 1536);
builder.Add("shortenames", 0);
builder.Add("databasetype", 1);
builder.Add("pwd", password);
return builder.ConnectionString;
}
}
При возникновении такого рода ошибки может потребоваться убедиться, что только один профиль Windows зарегистрирован или зарегистрирован с именем DSN. Другими словами, если у вас больше профилей, зарегистрированных с тем же именем DSN (на том же компьютере / сервере), это, скорее всего, является причиной ошибки!