我正在尝试创建一个小的测试应用程序,它读取FileStream的块并将其附加到SQL Server 2005 Express上的VarBinary(max)列.
一切正常 - 列应该按照它应该填充,但我的机器似乎仍然将所有内容缓冲到内存中,我只是看不清楚原因.
我正在使用以下代码(C#):
using (IDbConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings[1].ConnectionString))
{
connection.Open();
string id = Guid.NewGuid().ToString();
using (IDbCommand command = connection.CreateCommand())
{
command.CommandText = "INSERT INTO [BLOB] ([Id],[Data]) VALUES (@p1,0x0)";
SqlParameter param = new SqlParameter("@p1", SqlDbType.VarChar);
param.Value = id;
command.Parameters.Add(param);
command.ExecuteNonQuery();
}
if (File.Exists(textBox1.Text))
{
using (IDbCommand command = connection.CreateCommand())
{
command.CommandText = "UPDATE [BLOB] SET [Data].WRITE(@data, @offset, @len) WHERE [Id]=@id";
SqlParameter dataParam = new SqlParameter("@data", SqlDbType.VarBinary);
command.Parameters.Add(dataParam);
SqlParameter offsetParam = new SqlParameter("@offset", SqlDbType.BigInt);
command.Parameters.Add(offsetParam);
SqlParameter …Run Code Online (Sandbox Code Playgroud) 我正在使用NLog登录我的应用程序,作为其中一部分,我们记录了客户编号,这是C#中的字符串,以及数据库中的varbinary(32).我对此特定参数使用以下SQL代码.SQL语句的其余部分工作正常:
CONVERT(varbinary(32), @CustNumber)
Run Code Online (Sandbox Code Playgroud)
和以下NLog参数:
<parameter name="@CustNumber" layout="${event-context:item=CustNumber}" />
Run Code Online (Sandbox Code Playgroud)
和C#中的以下代码一起添加Nlog参数:
myEvent.Properties.Add("CustNumber", custNumber);
Run Code Online (Sandbox Code Playgroud)
由于某种原因,存储在实际表中的值仅是原始客户编号字符串的第一个字符.我有双重和三重检查,以确保我没有截断字符串发送到数据库之前.任何帮助将不胜感激.
我将 PDF 文档作为二进制存储在我的表中,存储 PDF 字节的列是 type varbinary(max)。我想update在 SQL Studio 中使用更新的文档记录一个记录,我尝试完成此操作的方式如下
UPDATE table
SET file_bytes=CONVERT(varbinary(max),'JVBERi0xLjYNCiW2JqDQo8PC9UeX...0YNCg==') --this is a base64 string
WHERE id='73c75254-ad86-466e-a881-969e2c6e7a04';
Run Code Online (Sandbox Code Playgroud)
查询运行,但是当我尝试下载文档(通过网站)时,它会抛出一条错误消息,内容为 PDF header signature not found.
这种转换甚至可能吗?
是否有一些有效的方法如何在"varbinary(max)filestream"列中获取数据长度?我发现只有转换为varchar的样本然后调用"LEN"函数.
我在工作中遇到了非常特殊的性能问题!
在我们使用的系统中,有一个表格,其中包含有关当前工作流程的信息.其中一个字段包含一个电子表格,其中包含有关该过程的元数据(不要问我为什么!!我不能改变它!)
问题是此电子表格存储在SQL Server 2005的IMAGE字段中(在具有SQL 2000兼容性的数据库集中).
这个表目前有22K +行甚至是这样的简单查询:
SELECT TOP 100 *
FROM OFFENDING_TABLE
Run Code Online (Sandbox Code Playgroud)
在查询分析器中检索数据需要30秒.
我正在考虑更新与SQL 2005的兼容性(一旦我被告知应用程序可以处理它).
我想的第二件事是将列的数据类型更改为varbinary(max)但我不知道这样做是否会影响应用程序.
我正在考虑的另一件事是使用sp_tableoption设置large value types out of row到1,因为它是目前0的,但我没有任何信息,如果这样做将提高性能.
有谁知道在这种情况下如何提高性能?
编辑澄清
我的问题是,我无法控制应用程序向SQL Server提出的问题,我对它做了一些反思(该应用程序是一个.NET 1.1网站),并且它使用了违规字段来处理一些我不知道的内部内容这是什么.
我需要提高这个表的整体性能.
有没有办法在 MS SQL Server 2005 上没有 master.dbo.fn_varbintohexstr 函数的情况下将 varbinary 转换为 ASCII varchar 字符串(base64、md5、sha1 - 不管)?因为它不能在计算列内使用。
CONVERT 和 CAST 返回非 ASCII 字符串。
谢谢,
丹尼斯。
我有一个varbinary字段id喜欢做一个不区分大小写的搜索.
我知道varbinary字段的工作方式禁止你做这样的事情:
WHERE LOWER(page_title) = LOWER("Gasket")
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?我想我可以暂时将该字段作为varchar或其他东西.但我不确定.
我们在Oracle中有一个表,其中BLOB列需要填充少量任意字节数据 - 我们永远不会输入超过4000字节的数据.
我正在使用现有的基于C++ OCI的基础结构,这使得在某些上下文中使用绑定变量非常困难,因此我需要仅使用简单查询来填充此BLOB列.(我们正在努力使其现代化,但今天不是一种选择,)
我们对这样的查询运气不错:
UPDATE MyTable
SET blobData = HEXTORAW('0EC1D7FA6B411DA5814...lots of hex data...0EC1D7FA6B411DA5814')
WHERE ID = 123;
Run Code Online (Sandbox Code Playgroud)
起初,这很有效.但是,最近我们遇到了一个需要输入2000多字节数据的情况.此时,我们遇到了Oracle错误,ORA-01704: string literal too long因为传递给的字符串HEXTORAW超过了4000个字符.我尝试拆分字符串然后连接||,但这并没有避免错误.
因此,我需要一种更新此列的方法,并使用简单的查询将其填充超过2000字节的数据.可能吗?
(我知道如果我拥有绑定变量,那将是微不足道的 - 实际上与该表交互的其他应用程序使用这种确切的技术 - 但不幸的是我无法在这里重构数据库内容.只需要将数据输入表格.)
编辑:
一种没有用的有希望的方法是连接RAW:
UTL_RAW.CONCAT(HEXTORAW('...'), HEXTORAW('...'), HEXTORAW('...'))
Run Code Online (Sandbox Code Playgroud)
这避免了字符串长度限制,但似乎Oracle在a的长度上也有一个匹配的内部2000字节限制RAW.所以我不能用一个填充blob RAW.也许有一个函数可以将多个RAWs 连接成一个BLOB.
我有一个字段 id 定义如下。它是数据库中的 varbinary(16),当我通过 JPA 插入新记录时,我得到“com.mysql.jdbc.MysqlDataTruncation:数据截断:第 1 行的列“ID”的数据太长”。我究竟做错了什么?
@Id
@Column(name="ID")
private UUID id;
Run Code Online (Sandbox Code Playgroud) 我尝试使用如下代码将图像数据导入 sql server 2008 db:
INSERT INTO [TAB] (ID_PHOTO,PHOTO)
VALUES(
CAST('333EFB54-7062-E043-F088-FE0A916C0297' as uniqueidentifier),
CONVERT(varbinary(max),'0xFFD8FFE000')
)
Run Code Online (Sandbox Code Playgroud)
该字符串只是一个虚拟的,但是当我进行插入时,我在数据库中发现了类似的内容
0x307846464438464645303030
Run Code Online (Sandbox Code Playgroud)
这不是我所期望的。有谁知道我做错了什么?
varbinary ×10
sql ×5
sql-server ×4
mysql ×2
varchar ×2
base64 ×1
blob ×1
c# ×1
datalength ×1
eclipselink ×1
filestream ×1
imagefield ×1
jpa ×1
nlog ×1
oracle ×1
pdf ×1
search ×1
sql-update ×1
uuid ×1