在sql asp.net查询代码后面使用本地表变量

时间:2012-09-06 16:30:30

标签: c# asp.net sql code-behind

我可以在sql查询中使用带有一列的本地DataTable吗?怎么样?

List<int> k_p = null;
k_p = new List<int>();
k_p = (List<int>)Session["kosarica"];
DataTable spremljeno = new DataTable();
spremljeno.Columns.Add("id_k_p");
for(int i=0; i<k_p.Count; i++)
{
    spremljeno.Rows.Add(k_p[i]);
}
String ConnString = "Data Source=BRACO-PC\\SQL1;Initial Catalog=DiplomskiSQL1SQL;Integrated Security=True;";
SqlConnection Conn = new SqlConnection(ConnString);
Conn.Open();
DataTable ukosarici = new DataTable();
SqlDataAdapter da = new SqlDataAdapter("Select Proizvod.id_p, Proizvod.ime, TipProizvoda.tip, Proizvod.dimenzije, Proizvod.cijena FROM Proizvod LEFT JOIN TipProizvoda ON Proizvod.tip=TipProizvoda.id_t WHERE Proizvod.id_p IN @spremljeno", Conn);
SqlCommandBuilder cmd = new SqlCommandBuilder(da);
da.Fill(ukosarici);
GridView1.DataSource = ukosarici;
GridView1.DataBind();
Conn.Close();

我想只显示id_p等于spremljeno中的值的数据,并且不想在db中执行临时表,但不知道是否可能...连接到SQL Server 2008 ...

1 个答案:

答案 0 :(得分:0)

您可以将所有ID作为参数添加到SQL中的IN子句:

var parameters = new string[k_p.Count];
using(var cmd = new SqlCommand())
{
    for (int i = 0; i < k_p.Count; i++)
    {
        parameters[i] = string.Format("@id_p{0}", i);
        cmd.Parameters.AddWithValue(parameters[i], k_p[i]);
    }
    var sql = "Select Proizvod.id_p, Proizvod.ime, TipProizvoda.tip, Proizvod.dimenzije, Proizvod.cijena FROM Proizvod LEFT JOIN TipProizvoda ON Proizvod.tip=TipProizvoda.id_t WHERE Proizvod.id_p IN ({0})";
    cmd.CommandText = string.Format(sql, string.Join(", ", parameters));
    using(var con = new SqlConnection(connStr))
    {
        cmd.Connection = con;
        using(var da = new SqlDataAdapter(cmd))
        {
            da.Fill(ukosarici);
        }
    }
}

请注意,您应该使用using - 语句来实现IDisposable的所有内容(例如SqlConnectionDispose也会关闭连接)。另请注意,我仅使用了List<int>,第二个DataTable是多余的。