我创建了一个名为'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 :(得分: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();
}
}
并使用相同的连接,以便您可以确定,它是正确的。