2014-10-28 2 views
1

Я создал список с именем «PTNList», и все, что мне было нужно, было добавлено к нему просто отлично. Теперь я пытаюсь написать код для извлечения каждого элемента из этого списка и запуска его с SQL-запросом. У меня такое чувство, что я точно не знаю, как это сделать. Файл CompareNumbers.txt генерируется, но на нем ничего не печатается. Любая помощь приветствуется.Извлечение элемента из созданного списка

Ниже приведен фрагмент кода, с которым, как я считаю, нужно работать.

  using (FileStream fs = new FileStream("c:/temp/CompareNumbers.txt", FileMode.Append, FileAccess.Write)) 
      using (StreamWriter sw = new StreamWriter(fs)) 


      foreach (var ptn in PTNList) 
      { 
       //create sql for getting the count using "ptn" as the variable thats changing 
       //call DB with sql 
       //Get count from query, write it out to a file; 

       Console.WriteLine("Running Query"); 
       string query2 = @"SELECT COUNT(PRODUCT_TYPE_NO) 
            AS NumberOfProducts 
            FROM dbo.PRODUCT 
            Where PRODUCT_TYPE_NO = " + ptn; 



       SqlCommand cmd2 = new SqlCommand(query2); 
       cmd2.Connection = con; 

       rdr = cmd2.ExecuteReader(); 

       while (rdr.Read()) 
       { 
        sw.WriteLine(rdr["NumberOfProducts"]); 
       } 
       rdr.Close(); 
      } 
+0

При выполнении запроса, это rdr.HasRows правда? –

ответ

2

Вы не использовали апострофы вокруг значений. Но вы все равно должны использовать параметры. Вы можете использовать один запрос вместо одного для каждого типа. Например, при таком подходе:

string sql = @"SELECT COUNT(PRODUCT_TYPE_NO) AS NumberOfProducts 
       FROM dbo.PRODUCT 
       Where PRODUCT_TYPE_NO IN ({0});"; 

string[] paramNames = PTNList.Select(
    (s, i) => "@type" + i.ToString() 
).ToArray(); 

string inClause = string.Join(",", paramNames); 
using (SqlCommand cmd = new SqlCommand(string.Format(sql, inClause))) 
{ 
    for (int i = 0; i < paramNames.Length; i++) 
    { 
     cmd.Parameters.AddWithValue(paramNames[i], PTNList[i]); 
    } 

    // con.Open(); // if not already open 
    int numberOfProducts = (int) cmd.ExecuteScalar(); 
} 

Update: может быть, вы на самом деле просто хочу цикл их и получить их количество. Тогда вам не нужен этот сложный подход. Но вы все равно должны использовать sql-параметры для предотвращения SQL-инъекций и других проблем, таких как пропущенные апострофы и т. Д.

+0

Да, я просто пытаюсь вывести текстовый файл с номерами счетчиков. Это должно быть простой вещью, но я, как правило, все усложняю для себя ... – enigmahfc

+0

@enigmahfc: используйте 'Where PRODUCT_TYPE_NO = @ type' вместо' Where PRODUCT_TYPE_NO = "+ ptn;'. Затем используйте (single) sql -параметр, как показано выше. –

+0

Это, похоже, сработало. Спасибо за то, что я воткнула головой. – enigmahfc

0

Вы уверены, что ваш запрос даст результат, и выполняется sw.WriteLine? Я бы пересмотрел ваш код следующим образом: becfause, если у вас есть ошибка в вашем запросе данных, вы можете столкнуться с проблемами. Я всегда хотел использовать эту схему():

IDataReader reader = null; 

try 
{ 
// create every thing... 
} 
catch(Exception ex) 
{ 
// catch all exceptions 
} 
finally() 
{ 
    if(reader != null) 
    { 
     reader.Close(); 
    } 
} 

И использовать то же самое для подключения, так что вы можете быть уверены, она закрыта правильно.

1

Вы хотите преобразовать столбец обратно в тип, например.

sw.WriteLine(rdr["NumberOfProducts"] as string); 

Кроме того, обратите внимание, что ваш запрос склонен к SqlInjection атак и должны быть параметризованы и что SqlCommand также одноразовые. Вы можете сжать немного более высокую производительность за счет повторного использования SqlCommand:

string query2 = @"SELECT COUNT(PRODUCT_TYPE_NO) 
        AS NumberOfProducts 
        FROM dbo.PRODUCT 
        Where PRODUCT_TYPE_NO = @ptn"; 

using (var cmd2 = new SqlCommand(query2)) 
{ 
    cmd2.Connection = con; 
    cmd2.Parameters.Add("@ptn", SqlDbType.Varchar); 
    foreach (var ptn in PTNList) 
    { 
     cmd2.Parameters["@ptn"].Value = ptn; 

     Console.WriteLine("Running Query"); 
     using var (rdr = cmd2.ExecuteReader()) 
     { 
      if (rdr.Read()) 
      { 
       sw.WriteLine(rdr["NumberOfProducts"] as string); 
      } 
     } 
    } 

}

Смежные вопросы