【问题标题】:Passing C# byte[] to a VARBINARY SQL field将 C# byte[] 传递给 VARBINARY SQL 字段
【发布时间】:2013-03-26 11:00:57
【问题描述】:

我有一个 SQL Server 2008 表,其中一个字段声明为 VARBINARY (8000)

一个存储过程用来写这个表,它的参数是VARBINARY(8000)

C#代码调用存储过程,传入一个byte[]作为这个参数。

在某些情况下会因为字段太大而引发 SQL 异常。

这似乎是一个简单的问题,但到目前为止我一直找不到答案

我的 byte[] 多大才能不溢出 SQL 字段?

【问题讨论】:

  • 你能发布一些代码吗?
  • 如果该字段被声明为VARBINARY(8000),那么显而易见的答案是“它可以是 8000 字节或更少”——你看到了什么不同的东西吗?
  • 是的,我看到失败的一个例子是接收长度为 3262 的字节 [] 并引发异常
  • @JDibble 应该可以正常工作;我认为我们需要在这里看到一些东西 - 最特别的是 EXACT 错误消息,以及它是来自 sql-server 还是来自 .net 的指示;以及一些操纵它的代码。例如,是否有可能某些代码(如触发器或索引)正在使用它?
  • 首先,这是我支持的代码,而不是我编写的代码。我假设 8000 字节是限制,但实际上情况似乎并非如此 Exception is System.Data.SqlClient.SqlException: String or binary data will be truncated.

标签: c# sql-server sql-server-2008


【解决方案1】:

我有一个 SQL Server 2008 表,其中一个字段声明为 VARBINARY (8000)

...

我的 byte[] 多大才能不溢出 SQL 字段?

感觉像是一个技巧问题,但这里“明显”的答案是:8000 字节。

【讨论】:

  • 问题是由表上的触发器引起的,而不是由正在写入表本身的数据引起的。它看起来确实像“白痴”问题,但在实时系统中却是一个真正的问题。
【解决方案2】:

您的 byte[] 最多可以为 8000,以免溢出该字段。

【讨论】:

    【解决方案3】:

    在您的情况下为 8000,但为什么不使用 VARBINARY(MAX) 使用最大允许大小,这将能够存储 2^31-1 个字节,请参阅 binary and varbinary on MSDN

    【讨论】:

    • 调整大小不是解决方案,从 varbinary(8000) 更改为 varbinary(max) 将导致现有数据丢失。这不可能发生 - 所以我坚持使用数据库定义
    • @JDibble SQL Server 将进行就地转换,作为一个事务,所以我不希望任何数据丢失。
    • 这不是 DBA 在这里所说的 :(
    【解决方案4】:

    由表上的触发器引起的问题。触发器所做的工作是抛出异常。这与写入表的数据无关。

    谢谢大家或您的帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-11
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      相关资源
      最近更新 更多