正在从sql ExecuteScalar()中检索值

本文关键字:检索 ExecuteScalar sql | 更新日期: 2023-09-27 18:27:34

我有以下内容:

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();

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

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

正在从sql ExecuteScalar()中检索值

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

DataTable dt = new DataTable();
SqlDataAdapater sda = new SqlDataAdapter(sql, conn);
sda.Fill(dt);
Program.defaultCollection = dt.Rows[0]["defaultCollection"];

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

来自ExecuteScalar:的MSDN文档

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

现在,作为最后一点建议,请将所有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`
}

这将确保它们得到妥善处理。

我想在执行语句后得到第二列

使用execute标量是不可能的。

还有别的办法吗

这里有两个选项,可以使用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();
    }

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();
}

那将是最快的方式。

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

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

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

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

附带说明一下,请阅读SqlParameter。如果您不想这样连接值,那么当collection属性包含引号时就会出现问题。