七行代码打印BLOB字段图像,VFP效果太丝滑了

上篇文章BLOB字段存放了图片,要怎么打印呢?我们看一下VFP的报表能打印的方式。

  1. 图像文件名
    可以生成图像文件,然后在下方的控件源填入文件路径字段
  2. 通用型字段名
    已经被淘汰,不建议用
  3. 表达式或变量名
    变量名的话,我们就可以放于变量,这个变量是image对象,而image.pictureval就可以引用blob字段了

于是开干,在表单中加入一个打印按钮,写上代码
打印按钮click事件

myimg=Newobject("image")
myimg.PictureVal=test.field1
Report Form 报表3.frx Preview

报表的控件源设为myimg变量

好了,运行看看

嘿嘿嘿,显示出来了,可爱的小狐狸,戴着围巾,感觉很适合今天厦门的天气,
湿冷显冷,瞬间就不冷了。
但是不对,发现第二个图像也显示成小狐狸了,应该是另一张图。

再开启脑洞想想,控件源类型还可以是表达式,那不可以用函数了,函数返回一个image对象,传入字段不就OK了。

六行代码搞起来
将下方代码保存为_getpic

Function _getpic
	Lparameters cImgBin
	mypic=Newobject("image")
	mypic.PictureVal=cImgBin
	Return mypic
Endfunc

报表的控件源设为_getpic(test.field1)

按钮事件改为

Report Form 报表3.frx Preview

运行测试看看,一切完美。

更多资料:www.sn58.cn

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是用ADO更新BLOB字段的C代码: ``` #include <windows.h> #include <oledb.h> #include <stdio.h> void update_blob_field() { HRESULT hr = CoInitialize(NULL); if (SUCCEEDED(hr)) { // Connection string for your database char connStr[256] = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\myDatabase.mdb;Persist Security Info=False;"; // Initialize ADO objects IDBInitialize *pInitialize = NULL; IDBCreateSession *pCreateSession = NULL; IDBCreateCommand *pCreateCommand = NULL; hr = CoCreateInstance(CLSID_MSDASQL, NULL, CLSCTX_INPROC_SERVER, IID_IDBInitialize, (void**)&pInitialize); if (SUCCEEDED(hr)) { // Set DB initialization properties hr = pInitialize->Initialize(); if (SUCCEEDED(hr)) { // Create session hr = pInitialize->QueryInterface(IID_IDBCreateSession, (void**)&pCreateSession); if (SUCCEEDED(hr)) { DBPROP rgProps[1]; rgProps[0].dwPropertyID = DBPROP_AUTH_USERID; rgProps[0].dwOptions = DBPROPOPTIONS_REQUIRED; rgProps[0].colid = DB_NULLID; rgProps[0].vValue.vt = VT_BSTR; rgProps[0].vValue.bstrVal = SysAllocString("myUsername"); // Connect to database IDBSession *pSession = NULL; hr = pCreateSession->CreateSession(NULL, IID_IDBSession, (IUnknown**)&pSession); if (SUCCEEDED(hr)) { hr = pSession->SetConnectionProperties(1, rgProps); // Create command pSession->QueryInterface(IID_IDBCreateCommand, (void**)&pCreateCommand); // Issue update command for BLOB field char updateSQL[256] = "UPDATE myTable SET myBlobField = ? WHERE myID = 1"; ICommandText *pCommandText = NULL; hr = pCreateCommand->CreateCommand(NULL, IID_ICommandText, (IUnknown**)&pCommandText); if (SUCCEEDED(hr)) { hr = pCommandText->SetCommandText(DBGUID_DBSQL, updateSQL); if (SUCCEEDED(hr)) { // Set up parameter object for BLOB field IColumnsInfo *pColumnsInfo = NULL; pCommandText->QueryInterface(IID_IColumnsInfo, (void**)&pColumnsInfo); DBCOLUMNINFO *pColumnInfo = (DBCOLUMNINFO*)malloc(sizeof(DBCOLUMNINFO)); pColumnsInfo->GetColumnInfo(1, pColumnInfo, NULL, NULL, NULL, NULL); IAccessor *pIAccessor = NULL; pSession->QueryInterface(IID_IAccessor, (void**)&pIAccessor); HACCESSOR hAccessor; pIAccessor->CreateAccessor(DBACCESSOR_PARAMETERDATA, 1, &pColumnInfo->columnid, sizeof(DBPARAMETER), &hAccessor, NULL); DBPARAMETER param; param.dwParameterID = pColumnInfo->columnid; param.dwFlags = 0; param.iid = IID_NULL; param.pTypeInfo = NULL; param.pObject = NULL; param.pwszName = NULL; param.pwszDataSourceType = NULL; // Allocate a buffer for our BLOB data, and fill it with our desired data BYTE *pBlobData = (BYTE*)malloc(100000); // (In practice, you might want to read this data from a file or some other source) for (int i = 0; i < 100000; i++) { pBlobData[i] = (BYTE)(i % 256); } // Set value for BLOB field DBBINDING binding; binding.iOrdinal = 1; binding.dwPart = DBPART_VALUE | DBPART_STATUS | DBPART_LENGTH; binding.eParamIO = DBPARAMIO_INPUT; binding.dwMemOwner = DBMEMOWNER_CLIENTOWNED; binding.dwFlags = 0; binding.cbMaxLen = 100000; binding.cbMaxLen = 100000; binding.wType = DBTYPE_IUNKNOWN; binding.obStatus = 0; binding.obLength = 0; binding.obValue = 0; binding.pTypeInfo = NULL; binding.pObject = NULL; binding.pBindExt = NULL; binding.pDataSourceType = NULL; binding.pBindExt = NULL; binding.pObject = NULL; binding.dwReserved = 0; DBPARAMBINDING paramBinding; paramBinding.dwParamOrdinal = 1; paramBinding.pwszDataSourceType = NULL; paramBinding.dwFlags = 0; paramBinding.pwszName = NULL; paramBinding.iOrdinal = 1; DB_UPARAMS cParams = 1; DBPARAMINFO *rgParamInfo = NULL; DBCOUNTITEM cParamSets = 1; HROWSET hRowset; IRowsetChange *pRowset = NULL; IDBCreateCommand *pCommand = NULL; DBROWCOUNT cRowsAffected = 0; pCommandText->Execute(NULL, IID_IRowsetChange, NULL, &cRowsAffected, (IUnknown**)&pRowset); pCommandText->GetParameterInfo(&cParams, &rgParamInfo); rgParamInfo[0].cbMaxLen = 100000; rgParamInfo[0].dwFlags = 0; paramBinding.cbMaxLen = rgParamInfo[0].cbMaxLen; binding.cbMaxLen = rgParamInfo[0].cbMaxLen; IRowsetChange *pRowsetChange = NULL; pCommandText->QueryInterface(IID_IRowsetChange, (void**)&pRowsetChange); HROW hRow; pRowset->InsertRow(NULL, hAccessor, pBlobData, &hRow); IRowsetChange *pIRowsetChange = NULL; pCommandText->QueryInterface(IID_IRowsetChange, (void**)&pIRowsetChange); pIRowsetChange->SetData(hRow, hAccessor, pBlobData); // Commit transaction ITransactionLocal *pTransaction = NULL; pSession->QueryInterface(IID_ITransactionLocal, (void**)&pTransaction); DBPARAMS params; params.cParamSets = cParamSets; params.hAccessor = hAccessor; params.pData = pBlobData; params.rgParamIO = NULL; params.cbParamIO = 0; params.pVarData = NULL; params.rghCursors = NULL; params.rgRowStatus = NULL; params.hChapter = 0; params.cParamBindings = 1; params.rgParamBindings = &paramBinding; hr = pTransaction->StartTransaction(ISOLATIONLEVEL_READCOMMITTED,ISOLEVEL_CHAOS,0,NULL); hr = pRowsetChange->SetData(hRow, hAccessor, pBlobData); pRowsetChange->Update(hRow, NULL, NULL, &cRowsAffected); hr = pTransaction->Commit(FALSE, XACTTC_ASYNC_PHASEONE, 0); if (!SUCCEEDED(hr)) { printf("Could not commit transaction!"); } // Clean up ADO objects pCommand->Release(); pRowsetChange->Release(); pRowset->Release(); pIRowsetChange->Release(); pIAccessor->Release(); pCommandText->Release(); pColumnsInfo->Release(); CoFreeUnusedLibraries(); CoUninitialize(); free(pColumnInfo); free(pBlobData); } } } } } } } } ``` 请注意,这段代码在编写时并未测试。一些细节可能需要调整和完善,以确保它按您预期的方式运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加菲猫的VFP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值