【问题标题】: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"。

【问题讨论】:

    标签: c# .net ado.net dataset


    【解决方案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();
    }
    

    【讨论】:

    • 哇。我不敢相信我错过了。谢谢。
    • 是的,我之前也遇到过这个问题,忘记怎么解决了。
    猜你喜欢
    • 2011-09-14
    • 2014-05-11
    • 2017-05-20
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多