C# - SqlDataAdapter 无论如何都不会填充 DataTable
C# - SqlDataAdapter doesn't fill DataTable no matter what
所以我试图用来自 MSSQL 查询的数据填充数据表,但由于某种原因它完全拒绝工作,这让我 非常生气了。
当我使用 SqlDataReader 和 Read() 遍历结果时,我得到了结果,甚至当我尝试用 SqlDataAdapter 填充 DataTable 时,查询出现在 SQL Profiler 上,但没有没有 return 任何数据。
我不知道我的代码是什么,但也许你能弄明白:
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);
}
请注意我是如何用一个非常简单的测试查询替换复杂查询的,该测试查询肯定 returns 在 Management Studio 和 DataReader 中产生结果,但由于某种原因不适用于 DataTable。请注意,它没有超时,服务器位于同一台机器上,查询最多运行 1-2 秒。
连接有效,因为正如我之前提到的,DataReader 方法有效并且没有抛出异常。
该死的,我从来没有费心去检查 DataTable 的行 属性,结果它确实有效。
我认为不是,因为在调试模式下 Visual Studio 非常具有误导性,因为当您将鼠标悬停在数据表变量上时,它只显示“{}”,这通常意味着它是空的。
所以我试图用来自 MSSQL 查询的数据填充数据表,但由于某种原因它完全拒绝工作,这让我 非常生气了。
当我使用 SqlDataReader 和 Read() 遍历结果时,我得到了结果,甚至当我尝试用 SqlDataAdapter 填充 DataTable 时,查询出现在 SQL Profiler 上,但没有没有 return 任何数据。
我不知道我的代码是什么,但也许你能弄明白:
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);
}
请注意我是如何用一个非常简单的测试查询替换复杂查询的,该测试查询肯定 returns 在 Management Studio 和 DataReader 中产生结果,但由于某种原因不适用于 DataTable。请注意,它没有超时,服务器位于同一台机器上,查询最多运行 1-2 秒。
连接有效,因为正如我之前提到的,DataReader 方法有效并且没有抛出异常。
该死的,我从来没有费心去检查 DataTable 的行 属性,结果它确实有效。
我认为不是,因为在调试模式下 Visual Studio 非常具有误导性,因为当您将鼠标悬停在数据表变量上时,它只显示“{}”,这通常意味着它是空的。