【问题标题】:Evaluate "image" SQL column in a query评估查询中的“图像”SQL 列
【发布时间】:2011-05-28 23:15:14
【问题描述】:

我有一个数据库,其中包含一个带有“图像”列的表:

此列实际上包含一个编码为 HEX 字节值的长字符串。

我需要选择此列编码的字符串包含某个子字符串的所有记录。伪代码是:

Select *
From SomeTable
Where dataColumnofTypeImage.ToString().Contains("somesubstring")

我尝试在 Linq (LinqPad) 中使用:

from z in Zanus
let p = z.Udata.ToArray() // z.Udata will be of type System.Linq.Binary so I want to     make a byte array out of it...
where System.Text.ASCIIEncoding.ASCII.GetString(p).Contains("EXED")
select new
{
    z.Idnr,
    z.Udatum,
    z.Uzeit,
    z.Unr,
    z.Uart,
    z.Ubediener,
    z.Uzugriff,
    z.Ugr,
    z.Uflags,
    z.Usize,
    z.Udata
}

但这根本不起作用说:

NotSupportedException:方法 'Byte[] ToArray()' 没有支持的 SQL 转换。

我简直不敢相信不可能在 Where 子句中检查二进制数据类型,就像我可能检查其他数据类型一样...

有人可以帮帮我吗?

【问题讨论】:

  • 您希望 ToString 表示看起来像什么?我希望System.Linq.Binary 或二进制数据的字符解释,而不是二进制数据本身,所以即使它会编译你的代码仍然是错误的。
  • 您是否尝试过 PatIndex 而不是 Contains? msdn.microsoft.com/en-us/library/…
  • @Ed @shsmith 问题不在于字符串操作本身。首先,我似乎无法从列中获取数据。请在下面查看我的 cmets 以获取示例数据、人类可读的表示以及我遇到的问题。
  • 你有没有想过你会如何用 SQL 来写这个? LINQ to SQL 将 LINQ to SQL 转换为 SQL,所以如果在 SQL 中没有办法做到这一点,那你就被坑了。

标签: c# sql linq linqpad


【解决方案1】:

我知道这样做的唯一方法是使用直接 sql 和子字符串

例如,类似:

string str1 = @"
    select 
        Idnr, 
        Udatum,
        Uzeit, 
        Unr, 
        Uart, 
        Ubediener, 
        Uzugriff, 
        Ugr,
        Uflags, 
        Usize, 
        Udata 
    from  Zanus 
    where Udata is not null 
       and SubString(Udata, 1 , 2147483647) like '%EXED%'" ;

    var query1 = this.ExecuteQuery<Zanus>(str1);
    (from z in query1 
    select new
    {
        z.Idnr,
        z.Udatum,
        z.Uzeit,
        z.Unr,
        z.Uart,
        z.Ubediener,
        z.Uzugriff,
        z.Ugr,
        z.Uflags,
        z.Usize,
        z.Udata
    }    

注意,如果搜索字符串在列中,而不是在前 2,147,483,647 个字节中,这将失败(但如果这些是图像,我认为这不应该是一个问题)。

【讨论】:

  • 谢谢...我明天试试。
  • 非常感谢您的建议。 SQL 查询恰好返回了我期望和需要的那些记录。让它在 Linq 中运行存在一些问题,但这是语法和缺少括号或 ;这里和那里。真的很有帮助!
【解决方案2】:
where p.Contains(System.Text.ASCIIEncoding.ASCII.GetString("EXED"))

这大概是您要执行的操作的代码,它是否有效取决于您的图像字符串

【讨论】:

  • 不起作用。一个例子:?code 0x3200001000000000000000200B00000012FF000003000000343000000000703000000033000000040000000000A841340000000400000000C07F4435000000040000000000A041FE010000040000009825E53B000000400E00000000FE000006000000454B47443600000000F000000000 code其中goves code 2 ?????????? ????????????40??????p0???3??????????A4??????????D5?????? ????A?????????%?;???@????????????EKGD6?????????code我感兴趣的地方在 EKGD 部分。但是,我收到一个错误codeNotSupportedException: Method 'Byte[] ToArray()' has no supported translation to SQL.code It让我抓狂...
猜你喜欢
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多