какой драйвер лучше всего выбрать для работы с sql sqrv 2008 на юниксах? я знаю как минимум два с половиной способа приканектиться. это через юникс одбц и через ФриДТС и бывает вроде еще тот же ФриДТС только через ПДО. Мож кто пробовал, поделитесь опытом.
нет, не правда. через freetds работают и обычные mssql_* функции. Алсо, FreeTDS работает просто прекрасно.
флоппик Получается на юниксах freedts можно юзать через mssql_* и через pdo, так что-ли? Если так, то хорошо, потому что в pdo объектный привычный интерфейс и ошибки на исключениях. А правда, что через freedts можно выполнить только один запрос и даже открытие второго подключения не поможет обойти это ограничение? http://freetds.org/faq.html#pending(Why does each connection support only one query at a time?)
за 1 раз, впрочем как и везде. connect(); query(); query(); query(); query(); query(); query(); close();
а транзации и вложенные транзакции, хранимые процедуры с out параметрами не приходилось пробовать? а то у меня будет вызов чужих хранимок и причем очень сложных.
Код (Text): hosting(root):/home/440hz#>cat /usr/local/etc/freetds.conf # # # [global] # TDS protocol version tds version = 8.0 try server login = yes у меня используется аутентификация на сервере try domain login = no а не на домене cross domain login = no text size = 64512 initial block size = 512 swap broken dates = no swap broken money = no # dump file = /tmp/freetds.log # debug flags = 0xffff # dump file append = yes text size = 64512 # # # [*****] host = ***** port = 14666 tds version = 8.0 client charset=CP1251 ; ; ; $this->mssql = @mssql_connect('*****,'login','password');
причем у меня MSSQL стоит удаленно, причем за шлюзом и в другой подсетке. там на самом деле учет работает и я на сайт дергаю данные из учета/бух, в реальном времени. задержек нет.
не. вернее не так. есть фирма по продаже автозапчастей. у нее внутри фирмы стоит учет и бух. а их сайт лежит удаленно у меня на сервере совсем в другом месте. так вот я с сайта дергаю учет в реальном времени. вот.
А кодировка в SQL Server 2008 есть как в других базах? нашел только, что сравнение выставлено Cyrillic_General_CI_AS а кодировку где можно посмотреть, не подскажете? Я хотел начать писать скрипты в utf-8, получится без переконвертирований iconv-ами, если база окажется в win-1251?
Други, помогите разобрать вот такой код PHP: <?php $conn = mssql_connect ('ipsoft', '*', '*') or die ("Can't connect to Microsoft SQL Server"); mssql_select_db('bill35', $conn) or die ("Can't select databes"); $query= mssql_query("SELECT TOP 100 * FROM dbo.Subscriber;", $conn); //300 000 длинных строк if ($query===FALSE) throw new Exceptio(mssql_get_last_message()); elseif($query===TRUE) throw new Excep("Запрос вернул 0 строк"); else{ while ($row = mssql_fetch_row($query)) { echo "{$row[0]} {$row[1]} {$row[2]} {$row[3]}<br/>"; } } ?> получаю ошибку "закончилась память после выделения 128мб" на строчке mssql_query. Как же так? зачем это все мне в пхп прилетело в момент mssql_query? я хотел бы получать по одной строке внуть пхп когда делаю mssql_fetch_row и тратить при этом пару килобайт.
а это что думаете, почему не выполняется? PHP: <?php //коннект $conn = mssql_connect ('ipsoft', '***', '***') or die ("Can't connect to Microsoft SQL Server"); mssql_select_db('bill35', $conn) or die ("Can't select databes"); //параметры хранимой процедуры $date= new Zend_Date(); $accountNumber= '560-И'; $sum= 10.35; $DATE= $date->get(Zend_Date::TIMESTAMP); echo $DATE; $PSID= ''; $currencyCode= 810; $txn_id=''; $ExternalPaymentID=''; //прицепить параметры $proc= mssql_init("PaymentAuthorizePS", $conn); mssql_bind($proc, '@AccountNumber', $accountNumber, SQLVARCHAR, false, false, 50); //BCOMMENT mssql_bind($proc, '@PaymentSumm', $sum, SQLFLT8); //money mssql_bind($proc, '@PaymentDate', $DATE, SQLINT4); //datetime 1275826536 mssql_bind($proc, '@PSID', $PSID, SQLVARCHAR, false, false, 1); //BCOMMENT mssql_bind($proc, '@CurrencyCode', $currencyCode, SQLINT2); //int mssql_bind($proc, '@txn_id', $txn_id, SQLVARCHAR, false, false, 255); //varchar(255) mssql_bind($proc, '@ExternalPaymentID', $ExternalPaymentID, SQLVARCHAR, false, false, 255); //varchar(255) //выполнить и получить результат $res= mssql_execute($proc); echo $res; output сама хранимая процедура очень простая. можно даже не читать дальше входных параметров. она только возвращает одно целое число 0 или 1. выходных параметров транзакций и других замут нет. [sql]ALTER procedure [dbo].[PaymentAuthorizePS] @AccountNumber BCOMMENT, @PaymentSumm money, @PaymentDate datetime, @PSID BCOMMENT, --временно @CurrencyCode int, -- код валюты ЗАГЛУШКА! -- @AuthResult int out, @txn_id varchar(255) = null, @ExternalPaymentID varchar(255) = null as begin declare @AuthResult int select @AuthResult = 5 --ACCOUNT_OTHER_FATAL if (select count(1) from Account a where a.Number = @AccountNumber) > 1 goto Error if (select a.ID from Account a where a.Number = @AccountNumber) is null begin select @AuthResult = 2 --ACCOUNT_NOT_EXISTS goto error end select @AuthResult = 0 --PAYMENT_OK select @AuthResult return Error: select @AuthResult end[/sql]
Теперь проблема с датами. Я передаю в хранимую процедуру даты в формате ISO-8601 (например 2010-06-08T12:06:20+06:00) поскольку это формат поддерживают все базы. и получаю в ответ вот такое сообщение соответственно вопрос к знатокам как правильно передавать даты?
С датами тоже все решил. Млин SQL Server - ТУПАЯ ХУЙНЯ!!! После постгрес я в шоке, что он не понимает таких простых вещей. Я пришел к выводу, что вот этот способ универсальный PHP: <?php $DATE=$date->toString('YYYY-MM-ddTHH:mm:ss'); mssql_bind($proc, '@PaymentDate', $DATE, SQLVARCHAR, false, false, 25); //datetime 2010-06-06T18:09:22 флоппик а как через freetds получить результат выполнения хранимой процедуры- целое число? Я пробую вот так, но ничего не получается PHP: <?php $res= mssql_execute($proc) echo $res; //получаю Resource id #14.