SqlCommand query = new SqlCommand();
query.Connection = dbconn;
try {
query.CommandText = "SELECT email,LastSync FROM users WHERE email IN ('alexander@contoso.com')";
sdr = query.ExecuteReader();
while(sdr.Read()) if(!sdr.IsDBNull(1)) syncedUsers.Add(sdr.GetString(0));
sdr.Close();
} catch(Exception e) {
logger.Log(e.Message);
List<string> fields = new List<string>();
if(sdr!=null) for (int i = 0; i < sdr.FieldCount; i++)
{
fields.Add(sdr.GetName(i));
}
logger.Log(String.Join(",",fields));
}
这有时(并非总是)会引发错误:
Unable to cast object of type 'System.Int32' to type 'System.String'.
并且我看了一次,然后日志记录包含表格的所有字段列表,而不仅仅是两个请求的字段:
id,email,LastSync,...
虽然查询只是两列。 id是一个int,email是一个字符串,所以我假设错误在GetString(0)
中抛出。该错误无法可靠地重现,在启用VS调试时我还没有得到它。
现在,只要该阅读器打开,字段列表就不能改变,或者我认为。在某些情况下,SQL Server是否可以返回比我请求的更多的字段?
这是一个SQL Server Express 2012。
我知道这可以解决问题&#34;通过使用列名而不是索引,但在此之前,我想确保这确实是问题所在。我无法在部署代码的所有计算机上重现该问题,只有某些计算机似乎受到影响(它似乎不依赖于计算机可用的核心数,也不依赖于操作系统或.NET版本)
编辑:我在同一张桌子上使用ExecuteScalar()
时遇到同样的问题。据我所见,在其他表中不会发生这种情况。我尝试使用查询
SELECT displayName FROM users WHERE email=@email
使用ExecuteScalar()
,有时结果为4
,这是我请求的行的ID。所以它似乎得到了正确的行,但不是正确的列。
这真是太奇怪了!