SQL Query返回所有表列

时间:2016-07-28 08:58:48

标签: c# sql-server

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。所以它似乎得到了正确的行,但不是正确的列。

这真是太奇怪了!

0 个答案:

没有答案