从sql ExecuteScalar()中检索值

时间:2013-08-13 14:33:47

标签: c# sql sql-server database

我有以下内容:

String sql = "SELECT * FROM Temp WHERE Temp.collection  = '" + Program.collection + "'";
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(sql, conn);
Program.defaultCollection = (String)cmd.ExecuteScalar();

我想在执行语句后得到第二列。我知道它只返回一行有两列

我在网上看过,我必须阅读结果的每一行,还有其他方法吗?

5 个答案:

答案 0 :(得分:8)

ExecuteScalar从结果集的第一行获取第一列。如果您需要访问更多,您需要采取不同的方法。像这样:

DataTable dt = new DataTable();
SqlDataAdapater sda = new SqlDataAdapter(sql, conn);
sda.Fill(dt);

Program.defaultCollection = dt.Rows[0]["defaultCollection"];

现在,我意识到字段名称可能不是defaultCollection,但您可以将其填入。

来自ExecuteScalar的{​​{3}}:

  

执行查询,并返回查询返回的结果集中第一行的第一列。其他列或行将被忽略。

现在,作为最后一点建议,请将所有ADO.NET对象包装在using语句中。像这样:

using (SqlConnection conn = new SqlConnection(connString))
using (SqlDataAdapter sda = new SqlDataAdapter(sql, conn))
{
   DataTable dt = new DataTable();
   sda.Fill(dt);

   // do something with `dt`
}

这将确保它们妥善处理。

答案 1 :(得分:2)

  

我想在执行语句

后得到第二列

执行标量是不可能的。

  

还有其他方式

这里有两个选项可以使用SqlDataAdapter或SqlDataReader。 For you using DataReader is a recommended方法,因为您不需要离线数据或做其他工作

使用SqlDataAdapter

using (SqlConnection c = new SqlConnection(
    youconnectionstring))
    {
    c.Open();
    /
    using (SqlDataAdapter a = new SqlDataAdapter(sql, c))
    {

        DataTable t = new DataTable();
        a.Fill(t);
        if(t.Rows.Count > 0)
         {
             string text  = t.Rows[0]["yourColumn"].ToString();
         }    
    }
    }

使用DataREader

 using (SqlConnection connection =
               new SqlConnection(connectionString))
    {
        SqlCommand command =
            new SqlCommand(sql, connection);
        connection.Open();

        SqlDataReader reader = command.ExecuteReader();


        while (reader.Read())
        {
            //read data here
            string text = reader.GetString(1) 
        }


        reader.Close();
    }

答案 2 :(得分:1)

当结果只有一个行和一个列时,

SqlCommand.ExecuteScalar()只能

如果您需要返回多个列,则应使用以下内容:

String sql = "SELECT * FROM Temp WHERE Temp.collection  = '" + Program.collection + "'";
SqlConnection conn = new SqlConnection(connString);
using(SqlCommand cmd = new SqlCommand(sql, conn))
{
    using(SqlDataReader rdr = cmd.ExecuteReader())
    {
        if(rdr.Read()) 
        {
            Program.defaultCollection = (String)rdr["Column1"];
            Program.someOtherVar = (String)rdr["Column2"];
        }
    }
    rdr.Close();
}

这将是最快的方式。

答案 3 :(得分:0)

您可以使用DataReader并只读取第一列,如:

IDataReader cReader = cmd.ExecuteReader();

if(cReader.Read())
{
    string cText = cReader.GetString(1); // Second Column
}

答案 4 :(得分:0)

ExecuteScalar只返回一个值。您必须确保您的查询仅返回该值。

String sql = "SELECT temp.defaultCollection FROM Temp WHERE Temp.collection  = '" + Program.collection + "'";

在旁注上,请阅读SqlParameter。您不希望连接这样的值,当集合属性包含引号时,您将遇到问题。