2017-02-08 8 views
0

Так что я пытаюсь вернуть оператор Select в переменную. Он работает, однако он возвращает неправильное значение ...Сохранение запроса SQL return select в переменную возвращает неправильное значение

В большинстве случаев оно возвращает значение -7 столбцов, чем оно должно быть. Я думал, что это мой код, поэтому я попробовал его в менеджере SQL-серверов без параметров и получил почти такой же результат.

Что я делаю неправильно?

Вот мой оператор выбора (если вы не хотите, чтобы пройти через код):

"SELECT [Item #] FROM dbo.[" + cmbJobName.Text + "] WHERE [Manufacturer] LIKE @Manufacturer AND [Mill Location] LIKE @MillLocation AND [Product Description] LIKE @ProductDescription AND [Weld Seam Type] LIKE @WeldSeamType AND [Outer Dimension] LIKE @OuterDimension AND [Wall Thickness] LIKE @WallThickness AND [Coating] LIKE @Coating AND [Grade] LIKE @Grade AND [Heat] LIKE @Heat AND [ANSI/ASME] LIKE @ANSIASME AND [Purchase Order] LIKE @PurchaseOrder AND [Standard] LIKE @Standard AND [Notes] LIKE @Notes"; 

И вот мой код:

  try 
      { 
       using (SqlConnection con = new SqlConnection(Connection.MTRDataBaseConn)) 
       { 
        con.Open(); 
        SqlCommand cmd = new SqlCommand(); 

        cmd.CommandText = "SELECT [Item #] FROM dbo.[" + cmbJobName.Text + "] WHERE [Manufacturer] LIKE @Manufacturer AND [Mill Location] LIKE @MillLocation AND [Product Description] LIKE @ProductDescription AND [Weld Seam Type] LIKE @WeldSeamType AND [Outer Dimension] LIKE @OuterDimension AND [Wall Thickness] LIKE @WallThickness AND [Coating] LIKE @Coating AND [Grade] LIKE @Grade AND [Heat] LIKE @Heat AND [ANSI/ASME] LIKE @ANSIASME AND [Purchase Order] LIKE @PurchaseOrder AND [Standard] LIKE @Standard AND [Notes] LIKE @Notes"; 

        cmd.Connection = con; 
        SqlParameter pManufactuter = new SqlParameter("@Manufacturer", SqlDbType.VarChar, 50); 
        SqlParameter pMillLocation = new SqlParameter("@MillLocation", SqlDbType.VarChar, 50); 
        SqlParameter pProductDescription = new SqlParameter("@ProductDescription", SqlDbType.VarChar, 50); 
        SqlParameter pWeldSeamType = new SqlParameter("@WeldSeamType", SqlDbType.VarChar, 50); 
        SqlParameter pOuterDimension = new SqlParameter("@OuterDimension", SqlDbType.VarChar, 50); 
        SqlParameter pWallThickness = new SqlParameter("@WallThickness", SqlDbType.VarChar, 50); 
        SqlParameter pCoating = new SqlParameter("@Coating", SqlDbType.VarChar, 50); 
        SqlParameter pGrade = new SqlParameter("@Grade", SqlDbType.VarChar, 50); 
        SqlParameter pHeat = new SqlParameter("@Heat", SqlDbType.VarChar, 50); 
        SqlParameter pAnsiAsme = new SqlParameter("@ANSIASME", SqlDbType.VarChar, 50); 
        SqlParameter pPurchaseOrder = new SqlParameter("@PurchaseOrder", SqlDbType.VarChar, 50); 
        SqlParameter pStandard = new SqlParameter("@Standard", SqlDbType.VarChar, 50); 
        SqlParameter pNotes = new SqlParameter("@Notes", SqlDbType.VarChar, 50); 

        pManufactuter.Value = cmbManufacturer.Text; 
        pMillLocation.Value = cmbMillLocation.Text; 
        pProductDescription.Value = cmbProductDescription.Text; 
        pWeldSeamType.Value = cmbWeldSeamType.Text; 
        pOuterDimension.Value = cmbOuterDimension.Text; 
        pWallThickness.Value = cmbWallThickness.Text; 
        pCoating.Value = cmbCoating.Text; 
        pGrade.Value = cmbGrade.Text; 
        pHeat.Value = txtHeat.Text; 
        pAnsiAsme.Value = cmbANSI.Text; 
        pPurchaseOrder.Value = txtPurchaseOrder.Text; 
        pStandard.Value = cmbStandard.Text; 
        pNotes.Value = txtNotes.Text; 

        cmd.Parameters.Add(pManufactuter); 
        cmd.Parameters.Add(pMillLocation); 
        cmd.Parameters.Add(pProductDescription); 
        cmd.Parameters.Add(pWeldSeamType); 
        cmd.Parameters.Add(pOuterDimension); 
        cmd.Parameters.Add(pWallThickness); 
        cmd.Parameters.Add(pCoating); 
        cmd.Parameters.Add(pGrade); 
        cmd.Parameters.Add(pHeat); 
        cmd.Parameters.Add(pAnsiAsme); 
        cmd.Parameters.Add(pPurchaseOrder); 
        cmd.Parameters.Add(pStandard); 
        cmd.Parameters.Add(pNotes); 

        int result = ((int)cmd.ExecuteScalar()); 

        txtReturnFromSelect.Text = result.ToString(); 

        cmd.ExecuteNonQuery(); 
       } 
      } 
      catch (SqlException ex) 
      { 
       //catch error 
       MessageBox.Show(ex.Message); 
      } 

ПРИМЕЧАНИЕ

База данных в настоящее время просто состоит из чисел и текстовых строк без пробелов для целей тестирования. Например, я создал одну строку с просто словом «foo» и еще одну строку с просто словом «bar», ни один символ «foo» и «bar» не находится в каких-либо других строках базы данных, но он вернул идентификатор -5 строк из входов. Эти строки ТОЛЬКО содержат номера. Это происходит как в моем SQL-запросе, так и в приложении.

UPDATE:

Я не знаю, что этот вопрос, но я бросил таблицы и переделал их с тем же запросом, и теперь нет никаких проблем ... возможно лапы при создании таблицы изначально ?

ответ

1

Если вы хотите выполнить инструкцию и вернуть несколько строк, используйте ExecuteReader.

var reader = command.ExecuteReader(); 

while (reader.Read()) 
{ 
    Console.WriteLine(reader["Column1Name"].ToString()); 
    Console.WriteLine(reader["Column2Name"].ToString()); 
} 

Если вы хотите, чтобы возвращать только первое значение из первого столбца, то вы правильно использовать ExecuteScalar. Однако ваш второй оператор выполнения (выполнить не запрос) не требуется.

Если ExecuteScalar прав, но возвращаемое вами значение неверно - ваш запрос или данные неверны. Сначала создайте запрос непосредственно в SQL Server Management Studio, чтобы убедиться, что он работает правильно, а затем его кодифицируйте.

+0

Я сделал, и он возвратил то же значение ... При просмотре запроса я не вижу проблемы с ним. – Mokey

+0

Можете ли вы повторить свою проблему на http://sqlfiddle.com/ с некоторыми поддельными данными? – PeteGO

+0

Вчера я получил его для работы с вышеупомянутым ответом, однако sqlfiddle.com разбивает мои браузеры каждый раз, когда я использую его на работе по какой-то причине. – Mokey

2

Ваш оператор sql может возвращать более одной записи, учитывая код, поэтому выполнение ExecuteScalar не имеет смысла, поскольку оно возвращает только одно значение назад (первая строка первой строки) из базы данных. Вам лучше открыть считыватель данных или заполнить набор данных и прочитать данные оттуда.

+2

Если вы хотите выполнить оператор и вернуть несколько строк, используйте 'ExecuteReader'. – PeteGO

+0

Я бы хотел, чтобы он возвращал более одного (используя оператор if, я могу добавить ошибку с указанием существующей записи). Но в этом случае нет записей, которые бы соответствовали друг другу. в этом случае сохранит возвращаемый столбец/строку переменной. – Mokey

+1

Я немного смущен вашим требованием. Вы просто проверяете наличие записи, соответствующей вашим критериям? – MikeS

1

Вы посмотрели данные? Возможно ли, что в данных, где он остановлен, существует неопределенный незаконный символ?

+0

Да, в этом случае это просто цифры и текстовые строки без пробелов для целей тестирования. Например, я создал одну строку с просто словом «foo» и еще одну строку с просто словом «bar», ни один символ «foo» и «bar» не находится в каких-либо других строках базы данных, но он вернул идентификатор -5 строк из входов. – Mokey

0

Я просто думал ... вам не нужно% в подобных командах !!! По одному с каждой стороны вы хотите, чтобы строка вам понравилась -% где что-то похоже на «% word%» ??????

+0

Конкретно: ... ГДЕ [Производитель] НРАВИТСЯ% @ Производитель% И –