gpt4 book ai didi

c# - Datareader 跳过第一个结果

转载 作者:行者123 更新时间:2023-11-30 21:22:53 25 4
gpt4 key购买 nike

我有一个相当复杂的 SQL 查询,它根据客户 ID 从数据库中提取不同类型的产品。它提取三种不同类型的产品,由其唯一标识符编号范围标识(即,ID 1000-1999 是一种产品,2000-2999 是另一种,3000-3999 是另一种)。

SELECT b.fldMachineName, m2.fldRotaryPressName, mids.fldMachine_ID
FROM dbo.tblCustomerGeneralInfo c
LEFT JOIN dbo.tblMachine_IDs mids ON c.fldCustomer_ID = mids.fldCustomer_ID
LEFT JOIN dbo.tblBobstFlatDieSpecs b ON mids.fldMachine_ID = b.fldMachine_ID
LEFT JOIN dbo.tblDieInfo m1 ON mids.fldMachine_ID = m1.fldMachine_ID
LEFT JOIN dbo.tblRotaryDieSpecs sm ON m1.fldMachine_ID = sm.fldMachine_ID
LEFT JOIN dbo.tblRotaryPresses m2 ON sm.fldRotaryPress_ID = m2.fldRotaryPress_ID
WHERE c.fldCustomer_ID = '20'
ORDER BY fldRotaryPressName

c.fldCustomer_ID 是我唯一需要的用户输入,当我在 SQL Server Management Studio Express 中对数据库运行此查询时,它运行良好。但是,当我将其包装在我用 C# 为 SharePoint 编写的 Web 部件中的 using 语句中时,它不会返回它应该返回的第一行,而是返回一个空值。例如,如果在 SSMS 中我得到三个结果(例如,'1001'、'2008' 和 3045'),那么我的数据读取器将仅返回两个结果,第一个结果为空值(即,'null'、'2008' ,' 和 '3045')。这是我在 C# 中的代码:

            con.Open();
using (SqlCommand cmd = new SqlCommand("SELECT b.fldMachineName, m2.fldRotaryPressName, mids.fldMachine_ID " +
"FROM dbo.tblCustomerGeneralInfo c " +
"LEFT JOIN dbo.tblMachine_IDs mids ON c.fldCustomer_ID = mids.fldCustomer_ID " +
"LEFT JOIN dbo.tblBobstFlatDieSpecs b ON mids.fldMachine_ID = b.fldMachine_ID " +
"LEFT JOIN dbo.tblDieInfo m1 ON mids.fldMachine_ID = m1.fldMachine_ID " +
"LEFT JOIN dbo.tblRotaryDieSpecs sm ON m1.fldMachine_ID = sm.fldMachine_ID " +
"LEFT JOIN dbo.tblRotaryPresses m2 ON sm.fldRotaryPress_ID = m2.fldRotaryPress_ID " +
"WHERE c.fldCustomer_ID = @CustomerID " +
"ORDER BY fldRotaryPressName", con))
{
cmd.Parameters.Add("@CustomerID", SqlDbType.VarChar, 4).Value = customers.SelectedValue.ToString();

我们的 SQL 探查器显示正在传递的相同查询,无论它是通过 SSMS 还是从 Web 部件完成的,除了所使用的文字与参数之外。此外,如果我将参数更改为文字,我会得到相同的结果。 C# 处理 SQL 查询的方式与 SSMS 相比是否存在差异,或者我是否以某种方式错误地实现了它?

为了完整起见,下面是将阅读器中的数据拉入下拉列表的代码:

                    dr.read();
while (dr.Read())
{
try
{
string itemValue = Convert.ToString(dr["fldMachine_ID"]);
string flatName = Convert.ToString(dr["fldMachineName"]);
if (!string.IsNullOrEmpty(flatName))
{
items.Add(flatName, itemValue);
}
string rotaryName = Convert.ToString(dr["fldRotaryPressName"]);
if (!string.IsNullOrEmpty(rotaryName))
{
items.Add(rotaryName, itemValue);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}

// Bind list to ddl.
machines.DataSource = items;
machines.DataValueField = "Value";
machines.DataTextField = "Key";
machines.DataBind();

machines.Enabled = true;
}

我完全被难住了,非常感谢能得到的任何帮助。

最佳答案

更新

原来问题出在循环之前额外的 dr.Read() 调用。查看评论。

更新

查看代码,数据绑定(bind)似乎在错误的位置——也许是这样的?此外,我将其更改为显示空项...也许这会暴露逻辑问题。

while (dr.Read())
{
try
{
string itemValue = dr["fldMachine_ID"].ToString();
string flatName = dr["fldMachineName"].ToString();
if (string.IsNullOrEmpty(flatName)) flatName = "!NULL!";
if (string.IsNullOrEmpty(itemValue)) itemValue = "!NULL!";
items.Add(flatName, itemValue);

string rotaryName = dr["fldRotaryPressName"].ToString();
if (string.IsNullOrEmpty(rotaryName)) rotaryName= "!NULL!";
items.Add(rotaryName, itemValue);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}

}
// Bind list to ddl.
machines.DataSource = items;
machines.DataValueField = "Value";
machines.DataTextField = "Key";
machines.DataBind();

machines.Enabled = true;

它会不会像 customers.SelectedValue.ToString().Trim() 这样愚蠢的东西?

您可以运行探查器并准确查看服务器正在执行的 SQL...然后在 SSMS 中运行它以查看您是否仍会得到不同的结果。

关于c# - Datareader 跳过第一个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2097071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com