我有以下问题,我有这样插入的varBinary
INSERT INTO [Valpo-SIG] SELECT 4, 'Limite Comunal', bulkcolumn FROM OPENROWSET( BULK 'C:\Users\daniel.rodriguez\Documents\Unidad Vecinal.kmz', SINGLE_BLOB ) AS y
,最终结果如下所示
问题是我已设法使用以下代码
创建可用的.KMZ文件 DECLARE @SQLIMG VARBINARY(MAX),
@DOC_PATH VARCHAR(50) = 'C:\xampp\htdocs\Practica1\tmp\' ,
@TIMESTAMP VARCHAR(MAX),
@ObjectToken INT,
@FILENAME VARCHAR(50) = 'NewFilea.kmz',
@TOTALPATH VARCHAR(100)
SET @TOTALPATH = @DOC_PATH + @FILENAME
SELECT @SQLIMG = Plano from [Valpo-SIG] where [Id-SIG] = 2
--PRINT @TIMESTAMP
--PRINT @SQLIMG
EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT
EXEC sp_OASetProperty @ObjectToken, 'Type', 1
EXEC sp_OAMethod @ObjectToken, 'Open'
EXEC sp_OAMethod @ObjectToken, 'Write', NULL, @SQLIMG --new variable here
EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @TOTALPATH, 2
EXEC sp_OAMethod @ObjectToken, 'Close'
EXEC sp_OADestroy @ObjectToken
上面的代码创建了一个名为NewFilea.kmz的文件,其中包含[Valpo-SIG]表格中存储在Plano上的信息。
然后我将Query放在PHP变量
中 $sql ="DECLARE @SQLIMG VARBINARY(MAX),
@DOC_PATH VARCHAR(50) = 'C:\xampp\htdocs\Practica1\tmp\' ,
@TIMESTAMP VARCHAR(MAX),
@ObjectToken INT,
@FILENAME VARCHAR(50) = 'NewFilea.kmz',
@TOTALPATH VARCHAR(100)
SET @TOTALPATH = @DOC_PATH + @FILENAME
SELECT @SQLIMG = Plano from [Valpo-SIG] where [Id-SIG] = 2
--PRINT @TIMESTAMP
--PRINT @SQLIMG
EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT
EXEC sp_OASetProperty @ObjectToken, 'Type', 1
EXEC sp_OAMethod @ObjectToken, 'Open'
EXEC sp_OAMethod @ObjectToken, 'Write', NULL, @SQLIMG --new variable here
EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @TOTALPATH, 2
EXEC sp_OAMethod @ObjectToken, 'Close'
EXEC sp_OADestroy @ObjectToken";
之后我使用Microsoft sql Server驱动程序尝试使用该sql
$stmt = sqlsrv_query($conn,$sql, array(), array("Scrollable" => 'static')) or die('Error, query failed');
但它失败了,我不知道从SQL Server数据库创建文件的任何其他方式,几乎所有的文档都是用于检索Blob(这是我在数据库中插入它的方式我相信) MySQL或者只是解释从Microsoft SQL Server Management Studio创建文件的过程,它首先破坏了将文件存储在DB中的目的
我正在使用SQL Server 2017 Developer Edition和PHP 7.2
答案 0 :(得分:0)
在尝试找到我自己的问题的答案之后,唯一可以解决我的问题的解决方案是在数据库中创建一个过程。例如:
CREATE PROCEDURE CreateArchive
(
@idplan int,
@FILENAME VARCHAR(50)
)
AS
BEGIN
DECLARE @SQLIMG VARBINARY(MAX),
@DOC_PATH VARCHAR(50) = 'C:\xampp\htdocs\Practica1\tmp\' ,
@TIMESTAMP VARCHAR(MAX),
@ObjectToken INT,
@TOTALPATH VARCHAR(100)
SET @TOTALPATH = @DOC_PATH + @FILENAME + '.kmz'
SELECT @SQLIMG = Plano from [Valpo-SIG] where [Id-SIG] = @idplan
--PRINT @TIMESTAMP
--PRINT @SQLIMG
EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT
EXEC sp_OASetProperty @ObjectToken, 'Type', 1
EXEC sp_OAMethod @ObjectToken, 'Open'
EXEC sp_OAMethod @ObjectToken, 'Write', NULL, @SQLIMG --new variable here
EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @TOTALPATH, 2
EXEC sp_OAMethod @ObjectToken, 'Close'
EXEC sp_OADestroy @ObjectToken
END
GO
@idplan和@FILENAME都是调用过程时必须提供的变量,第一个是查询的ID而@FILENAME是文件的名称,@ SQLIMG是字段值所在的位置存档时@Doc_Path是创建文件的路径,@ TotalPath是完整的名称,组合@Doc_Path和@Filename,'。kmz'是因为我自己的错误疏忽但很容易修复,不好解释片刻。
将过程存储在数据库中后,在php中你必须做两件事 首先,您必须使用命令sqlsrv_prepare($ conn,$ sql)准备特殊查询,因为如果您尝试执行正常的sqlsrv_query,它将返回错误,您还需要分配将使用的变量的值在程序中如果适用
header("Content-Type: text/html;charset=utf-8");
$serverName = "(local)"; //serverName\instanceName
$connectionInfo = array("Database" => "mulet", "CharacterSet" => "UTF-8",'ReturnDatesAsStrings' => true);//DB
$conn = sqlsrv_connect($serverName, $connectionInfo);//Connection is generated
$number = 3;
$name = "Example";
$sql =" Execute CreateArchive $number,$name";
$stmt = sqlsrv_prepare($conn,$sql);
之后你必须使用sqlsrv命令sqlserver_execute来正确执行该过程,例如
if (!sqlsrv_execute($stmt))
{
echo "Your code is fail!";
die;
}
这将在文件夹C:\ xampp \ htdocs \ Practica1 \ tmp \中创建一个文件,所以希望这个答案可以帮助任何碰巧遇到同样麻烦的人,并原谅我奇怪的英语,我的主要语言是西班牙语
度过愉快的一天