У меня довольно сложный SQL-запрос, который вытаскивает различные типы продуктов из базы данных на основе идентификатора клиента. Он вытягивает три разных типа продуктов, идентифицируемых по их уникальным диапазонам номеров идентификаторов (т. Е. Идентификаторы 1000-1999 - это один тип продукта, 2000-2999 - другой, а 3000-3999 - еще один).Datareader пропускает первый результат
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, он прекрасно работает. Однако, когда я переношу это в оператор using в веб-части, которую я пишу в C# для SharePoint, он не возвращает первую строку, которую он должен, вместо этого возвращает нулевое значение. Например, если в SSMS я получаю три результата (скажем, «1001», «2008» и 3045), тогда мой datareader вернет только два результата с нулевым значением для первого (т. Е. «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 Profiler показывает тот же запрос передается независимо от того, если это делается через SSMS или из веб-части, кроме буквального используется по отношению к параметру. Кроме того, если я изменю параметр на литерал, я получаю тот же результат. Есть ли несоответствие в том, что C# обрабатывает SQL-запросы, а не SSMS, или я каким-то образом реализовал его неправильно?
Вот код для вытягивать данные из считывателя в DropDownList, для полноты картины:
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;
}
Я полностью тупик, и я действительно ценю любую помощь я могу получить.
Вы проверили, как выглядит ваш запрос в SQL Profiler? – Oded
Запустить запрос, используя литерал '11' один раз, без параметров команды, что это возвращает? –
Вы тестируете с идентификатором CustomerID 11 в своем коде? – 37Stars