对于某些人来说,这似乎是一个简单的问题,但我正在努力解决它。
我正在尝试使用SQLDataReader.GetFieldType来检查某个字段是否为Image字段。让我们假设结果集的第一个字段是一个Image字段,如果我这样做:
reader.GetFieldType(0).ToString;
我得System.Byte[]
但这是检查它的正确方法吗?我真的不喜欢:
if (reader.GetFieldType(0).ToString="System.Byte[]")
有更好的方法吗?
谢谢,
AJ
答案 0 :(得分:5)
你总是可以缩短它:
if(reader.GetFieldType(0) == typeof(byte[]));
不幸的是,没有从SQL Server中的图像字段直接映射到.NET CLR类型......这就是为什么你得到一个字节数组。
您可能希望添加进一步检查以确保返回的字节数组实际上是一个图像(字节数组用于image
,binary
,varbinary
和{{ 1}}列也是。)
您可以在以下位置检查类型映射:
答案 1 :(得分:1)
最好使用Type.IsAssignableFrom方法,而不是查看类型名称本身。
Type fieldType = reader.GetFieldType(0);
bool isImageField = typeof(byte[]).IsAssignableFrom(fieldType);
这为您提供了一些编译时安全性的测量方法。
注意:这实际上并不保证该字段将包含图像 - 任何形式的二进制数据都可以存储在image
/ binary
/ {{1}中}字段,所以查看它是否真的是一个图像的唯一方法是读取值并尝试将其加载为一个。但您可以使用它来检查该字段是否为二进制字段。
答案 2 :(得分:1)
另一种方法是使用SqlDataReader.GetSchemaTable方法。这将返回一个包含结果集模式的数据表,并使数据库中的实际数据类型可用 - 例如返回的模式表的DataTypeName列将是实际的SQL Server数据类型,如varchar,而ProviderSpecificDataType列将是System.Data.SqlType
e.g。
DataTable dataSchema = reader.GetSchemaTable();
// dataSchema.Rows[0]["DataTypeName"] would return the sql server
// data type name for the first column in the resultset.
答案 3 :(得分:0)
您可能必须检查第一个字节以查看它们是否构成图像标头。否则,您可能会处理音频文件。所以字节数组不一定代表图像。