如何从c#中的datatable返回一个字符串值?

时间:2016-02-25 11:21:17

标签: c# asp.net

我无法将数据表值存储在字符串中。如何返回数据表的字符串值?返回标量值时会出错。

  

System.Data.dll中出现'System.IndexOutOfRangeException'类型的异常,但未在用户代码中处理 - 返回语句中出错

txtSalespersonName.Text = dl.GetStringValue("select top 1 [ContactPerson]  from tbl_Companies where Company='" +companyname + "' order by id desc");
public string GetStringValue(string query)
{
    DataTable dt = new DataTable();

    try
    {

        string constr = ConfigurationManager.ConnectionStrings["KernelCS"].ConnectionString;
        using (SqlConnection con = new SqlConnection(constr))
        {
            using (SqlCommand cmd = new SqlCommand(query))
            {
                using (SqlDataAdapter sda = new SqlDataAdapter())
                {
                    cmd.CommandType = CommandType.Text;
                    cmd.Connection = con;
                    sda.SelectCommand = cmd;
                    sda.Fill(dt);
                }
            }

        }

    }
    catch (Exception ex)
    {

      //  Response.Write(ex.Message);

    }
    return dt.Rows[1].ToString();
}

2 个答案:

答案 0 :(得分:1)

要回答您的问题,错误正在发生,因为DataTable基于零索引而您的查询只返回1个值,因此它超出范围。 dt.Rows[0][0].ToString()会为您提供正确的输出。

但是,由于您从查询中返回单个值,我建议您使用ExecuteScalar代替: -

string ContactPerson = String.Empty;
string constr = ConfigurationManager.ConnectionStrings["KernelCS"].ConnectionString;
using (SqlConnection con = new SqlConnection(constr))
{
    using (SqlCommand cmd = new SqlCommand(query,con))
    {
        ContactPerson = cmd.ExecuteScalar().ToString();
    }
}
return ContactPerson;

另外,使用参数化查询来避免SQL Injection attack

答案 1 :(得分:1)

dt.Rows[1]会返回表格中的第二个DataRow,因为您的查询只返回 一行,所以它不存在。你可以用它作为;

return dt.Rows[0][0].ToString();

但如果只获得一行,请不要使用SqlDataAdapter。使用{em>完全正好ExecuteScalar

using (var con = new SqlConnection(constr))
using (var cmd = con.CreateCommand())
{
     cmd.CommandText = query;
     con.Open();
     return cmd.ExecuteScalar().ToString();               
}

顺便说一句,你应该总是使用parameterized queries。这种字符串连接对SQL Injection攻击开放。