【发布时间】:2012-06-23 12:22:37
【问题描述】:
我有一个 SqlDataReader,需要使用 SqlDataReader.GetBytes() 方法从中读取一个 varbinary(max) 列。此方法填充一个字节数组,因此需要知道要读取的数据长度。
这就是我感到困惑的地方.. 显然我想读取从数据库返回的所有数据在这一行/列中,那么我应该传递什么“长度”参数?
据我所知,SqlDataReader 没有提供任何方法来发现可用数据的长度,因此这种方法对我来说似乎相当尴尬。
我很想在这里传递 int.MaxValue 并忘记这个问题,但我对此并不满意。
我知道我可以改为调用
byte[] value = (byte[])dataReader["columnName"];
.. 这似乎完全解决了内部的长度问题。但是,我正在使用围绕 SqlDataReader.GetXXXX() 方法构建的一组复杂的代码生成模板。所以我对使用 GetBytes 很感兴趣,需要了解它的正确用法。
【问题讨论】:
-
SQL 有方法来询问 varbinary 中的长度 - 您必须将其放入 SQL:msdn.microsoft.com/en-us/library/ms173486.aspx - DATALENGTH。选择Field, DataLength(FIeld) from Table 就可以看到长度了。
-
谢谢,我确实考虑在 SQL 中使用 DATALENGTH,但这并不是一个真正可以接受的解决方案。正如您可能猜到的那样,这一切都构成了数据访问层的一部分,因此在手写存储过程中强制使用诸如此类的约定来支持基本功能并不是很好。
-
@Martyn 当我在这里时...有一些库专用来确保您不需要编写乏味的 ADO.NET 代码...“dapper” (在我的严重偏见中)非常适合隐藏这些担忧,同时保持非常轻量级且不打扰。
-
强制约定?没有最佳使用 SQL 层的 DAL 是一回事 - 损坏。这不是“惯例”,这是数据存储层的设计方式。
-
@Marc Gravell 我在这里维护一个遗留产品,因此提到了我不能真正偏离太多的代码模板。我多么想使用现成的 DAL 或 ORM!但这是你需要和我老板讨论的问题:)
标签: c# .net vb.net ado.net sqldatareader