Как вставить файл в sql-сервер через tiny_tds? - PullRequest
3 голосов
/ 13 февраля 2012

В скрипте импорта данных:

 client = TinyTds.Client.new(...)
 insert_str = "INSERT INTO [...] (...) VALUE (...)"
 client.execute(insert_str).do

Пока все хорошо.

Однако, как я могу прикрепить файл .pdf в поле varbinary (SQL Server 2000)?

Ответы [ 3 ]

1 голос
/ 25 июня 2013

У меня недавно была та же проблема, и использование activerecord не было действительно адаптировано для того, что я хотел сделать ...

Итак, без использования activerecord:

client = TinyTds.Client.new(...)
data = "0x" + File.open(file, 'rb').read.unpack('H*').first
insert_str = "INSERT INTO [...] (...) VALUE (... #{data})"
client.execute(insert_str).do

Чтобы отправить правильные данные varbinary, вам нужно прочитать файл, преобразовать его в шестнадцатеричную строку с unpack('H*').first и добавить к результату «0x».

0 голосов
/ 27 февраля 2012

Я закончил с использованием activerecord:

require 'rubygems'
require 'tiny_tds'
require 'activerecord-sqlserver-adapter'

..

my_table.create(:file_name => "abc.pdf", :file_data => File.open("abc.pdf", "rb").read)

Для поддержки SQLServer 2000 перейдите к версии 2.3.x activerecord-sqlserver-adapter gem.

0 голосов
/ 22 февраля 2012

Вот код PHP-MSSQL для сохранения двоичных данных:

mssql_query("SET TEXTSIZE 2147483647",$link);
$sql = "UPDATE UploadTable SET UploadTable_Data = ".varbinary_encode($data)." WHERE Person_ID = '".intval($p_id)."'";
mssql_query($sql,$link)  or 
  die('cannot upload_resume() in '.__FILE__.' on line '.__LINE__.'.<br/>'.mssql_get_last_message());

function varbinary_encode($data=null) {
  $encoded = null;
  if (!is_null($data)) {
    $a = unpack("H*hex", $data);
    $encoded = "0x";
    $encoded .= $a['hex'];
  }
  return $encoded;
}

Вот код PHP-MSSQL для получения двоичных данных:

mssql_query("SET TEXTSIZE 2147483647",$link);
$sql = "SELECT * FROM UploadTable WHERE ID = 123";
$db_result = mssql_query($sql,$link);
// work with result like normal
...