C# - SqlDataAdapter无论如何都不会填充DataTable

4

我想要用 MSSQL 查询结果填充 DataTable,但是它完全无法工作,这让我非常生气。

当我使用 SqlDataReader 迭代结果并读取时,我可以得到结果,即使我尝试使用 SqlDataAdapter 填充 DataTable,查询也会在 SQL Profiler 中出现,但是没有返回任何数据。

我不知道我的代码出了什么问题,但也许你可以找出来:

            try
            {
                // Global variables
                var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
                var textString = "Pasākums {0} sākas pēc {1}!";
                var linkString = @"/Event/Index/{0}";

                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    // Set variables
                    var findIn24HrsEventsCmd = new SqlCommand(@"
                        SELECT adm.UserID, adm.EventID FROM [dbo].[EventAdmissions] AS adm WHERE EventID IN
                        (
                        SELECT EventID FROM [dbo].[Events]
                        WHERE DATEDIFF(hour, @date, StartTime) BETWEEN 0 AND 24
                        )
                        AND 
                        (
                        SELECT COUNT(URL) FROM [dbo].[Notifications]
                        WHERE Type = 1 AND UserID = adm.UserID
                        AND URL LIKE '/Event/Index/'+CAST(adm.EventID AS VARCHAR(36))
                        ) = 0", conn);
                    findIn24HrsEventsCmd.Parameters.Add(new SqlParameter("date", "2015-05-31 02:17:28.727"));

                    var test = new SqlCommand(@"SELECT * FROM [dbo].[EventAdmissions]", conn);

                    var findIn1HrEventsCmd = new SqlCommand(@"
                        SELECT adm.UserID, adm.EventID FROM [dbo].[EventAdmissions] AS adm WHERE EventID IN
                        (
                        SELECT EventID FROM [dbo].[Events]
                        WHERE DATEDIFF(minute, @date, StartTime) BETWEEN 0 AND 60
                        )
                        AND 
                        (
                        SELECT COUNT(URL) FROM [dbo].[Notifications]
                        WHERE Type = 1 AND UserID = adm.UserID
                        AND URL LIKE '/Event/Index/'+CAST(adm.EventID AS VARCHAR(36))
                        ) < 2", conn);
                    findIn1HrEventsCmd.Parameters.Add(new SqlParameter("date", "2015-05-31 02:17:28.727"));
                    var t = findIn1HrEventsCmd.CommandTimeout;

                    // Retrieve data
                    conn.Open();
                    log.Debug("Starting with the events that are on in an hour.");

                    // Do it first for evens within an hour
                    var oneHrDataAdapter = new SqlDataAdapter(test);
                    var oneHrDt = new DataTable();

                    oneHrDataAdapter.Fill(oneHrDt);

                    findIn1HrEventsCmd.Dispose();
                    findIn24HrsEventsCmd.Dispose();
                    oneHrDataAdapter.Dispose();
                }
            } catch (Exception e)
            {
                log.Fatal("Fatal error!" + e.Message);
            }

请注意,我已经将复杂的查询替换为一个非常简单的测试查询,该查询在Management Studio和DataReader中肯定返回结果,但由于某种原因在DataTable中无法工作。请注意,它没有超时,服务器位于同一台机器上,查询运行时间最多可能只有1-2秒钟。
连接是有效的,因为如我之前所提到的,DataReader方法可以工作,并且也没有抛出任何异常。

你有没有遇到任何错误? - user786
不,我没有收到任何错误。 - Fabis
尝试在数据库引擎中运行您的查询。可能是您的查询从数据库中没有返回任何数据,或者可能是您的数据库表根据您的查询没有返回数据。 - user786
1个回答

9

天哪,我从来没有注意过DataTable的Rows属性,结果它确实有效。

我以为它不起作用,因为在调试模式下,Visual Studio非常具有误导性,当你将鼠标悬停在datatable变量上时,它只显示“{}”,通常这意味着该变量为空。


是的,这个数据适配器确实很让人困惑。我不经常使用它,也把我难住了。 - Josh O'Bryan
什么鬼?!这不仅是欺骗,而且是犯罪行为。 - Chaim Eliyah
哇...真是太棒了...我在这个问题上浪费了好几天的时间。感谢你提供的解决方案! - I try so hard but I cry harder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接