从创建的列表中检索元素

时间:2014-10-28 14:56:14

标签: c# sql list

我创建了一个名为'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();
            }

3 个答案:

答案 0 :(得分: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();
}

更新:也许你真的只想循环它们并获得它们的数量。那你就不需要这种复杂的方法。但是你仍然应该使用sql-parameters来防止sql注入和其他问题,比如缺少撇号等。

答案 1 :(得分: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);
          }
        }
    }

}

答案 2 :(得分:0)

您确定您的查询是否给出了结果并执行了sw.WriteLine?我会像这样重新设计你的代码,因为如果你的数据查询有错误,你可能会遇到麻烦。我总是喜欢使用这个(架构):

IDataReader reader = null;

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

并使用相同的连接,以便您可以确定,它是正确的。