无法从数据集中检索特定项目

Posted

技术标签:

【中文标题】无法从数据集中检索特定项目【英文标题】:Can't retrieve a specific item from a dataset 【发布时间】:2012-11-06 04:21:31 【问题描述】:

我已经查看了与此相关的其他问题,但我遇到了不同的问题。我无法返回特定项目,它只返回我的列名。如何让商品退回?

public static string GetOneFieldRecord(string field, string companyNum)

    DataSet ds = new DataSet();
    SqlCommand comm = new SqlCommand();

    string strSQL = "SELECT @FieldName FROM Companies WHERE CompanyNum = @CompanyNum";
    SqlConnection conn = new SqlConnection();
    conn.ConnectionString = @connstring;
    comm.Connection = conn;
    comm.CommandText = strSQL;
    comm.Parameters.AddWithValue("@FieldName", field);
    comm.Parameters.AddWithValue("@CompanyNum", companyNum);

    SqlDataAdapter da = new SqlDataAdapter();
    da.SelectCommand = comm;

    conn.Open();

    da.Fill(ds, "CompanyInfo");

    conn.Close();

    return ds.Tables[0].Rows[0].ItemArray[0].ToString();

我也试过

return ds.Tables[0].Rows[0][0].ToString();

我只是得到字段变量中的任何内容。 如果我传入 ("CompanyName", 33),它会返回 "CompanyName"。

【问题讨论】:

【参考方案1】:

您的查询(在 sql profiler 中)是

SELECT 'CompanyName' FROM Сompanies WHERE СompanyNum = 33

所以它准确地返回“CompanyName”字符串。您不能将列名作为 sql 参数传递。你应该做类似的事情

public static string GetOneFieldRecord(string field, string companyNum)

    DataSet ds = new DataSet();
    SqlCommand comm = new SqlCommand();

    string strSQL = string.Format("SELECT 0 FROM Companies WHERE CompanyNum = @CompanyNum", field);
    SqlConnection conn = new SqlConnection();
    conn.ConnectionString = @connstring;
    comm.Connection = conn;
    comm.CommandText = strSQL;
    comm.Parameters.AddWithValue("@FieldName", field);
    comm.Parameters.AddWithValue("@CompanyNum", companyNum);

    SqlDataAdapter da = new SqlDataAdapter();
    da.SelectCommand = comm;

    conn.Open();

    da.Fill(ds, "CompanyInfo");

   conn.Close();

   return ds.Tables[0].Rows[0].ItemArray[0].ToString();

但是这段代码可以用于 SQL 注入。

为避免 Sql 注入,您可以检查字段变量中的 fieldName 是否为表列之一。

或者您可以获取 SELECT * FROM Сompanies WHERE СompanyNum = @CompanyNum 并从数据表中获取命名列的值:

public static string GetOneFieldRecord(string field, string companyNum)

    DataSet ds = new DataSet();
    SqlCommand comm = new SqlCommand();

    string strSQL = "SELECT * FROM Companies WHERE CompanyNum = @CompanyNum";
    SqlConnection conn = new SqlConnection();
    conn.ConnectionString = @connstring;
    comm.Connection = conn;
    comm.CommandText = strSQL;
    comm.Parameters.AddWithValue("@FieldName", field);
    comm.Parameters.AddWithValue("@CompanyNum", companyNum);

    SqlDataAdapter da = new SqlDataAdapter();
    da.SelectCommand = comm;

    conn.Open();

    da.Fill(ds, "CompanyInfo");

   conn.Close();

   return ds.Tables[0].Rows[0][field].ToString();

【讨论】:

哇。我不敢相信我错过了。谢谢。 是的,我之前也遇到过这个问题,忘记怎么解决了。

以上是关于无法从数据集中检索特定项目的主要内容,如果未能解决你的问题,请参考以下文章

从COCO数据集和VOC数据集提取特定的类别

机器学习是否有可能从数据集中找到所有元素的概率分布?

游标的使用

从数据集中删除特定行

从具有特定日期范围的 SAS 数据集中删除行

数据集可以使用存储过程返回多少个表