【问题标题】:Save sql return in a string将sql返回保存在字符串中
【发布时间】:2014-03-27 15:39:37
【问题描述】:

我正在尝试将信息从数据库保存到字符串。

下面的代码怎么可能?

using (SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
    SqlCommand cmd = new SqlCommand("SELECT something FROM table");
    cmd.CommandType = CommandType.Text;
    cmd.Connection = connection;
    connection.Open();
    cmd.ExecuteNonQuery();
    connection.Close();
}

是否可以使用它从保存在string 中的数据库中获取一些值?

【问题讨论】:

  • 需要单行的值吗?你需要单列的值吗?你的问题有点含糊

标签: c# sql .net sql-server ado.net


【解决方案1】:

您需要拨打cmd.ExecuteScalar(),而不是cmd.ExecuteNonQuery()

有关文档,请参阅 MSDN

string result = (string)cmd.ExecuteScalar();

正如@ThorstenDittmar 正确指出的那样,只有当数据库中的值实际上是string(或可以映射到它的东西,如varchar)时,强制转换才有效。

你可以用这个来确定:

object result = cmd.ExecuteScalar();

string s = result != null? result.ToString() : null;

或者

string s = Convert.ToString(cmd.ExecuteScalar());

【讨论】:

  • 只有当cmd.ExecuteScalar() 返回的object 实际上 一个字符串时才有效。要将 any 对象值存储为字符串,您应该使用 string result = cmd.ExecuteScalar().ToString();
【解决方案2】:

ExecuteNonQuery 用于INSERTUPDATEDELETE 语句。也可以使用不返回结果集或可以丢弃结果的其他 SQL 命令,如 DDL 命令或 db 管理命令。

ExecuteScalar 可用于只需要第一行的第一个字段的SELECT 语句。

当需要返回更多字段和/或更多行时,请使用ExecuteReader

ExecuteReader使用示例:

using (var conn = new SqlConnection(connectionString)) {
    using (var cmd = new SqlCommand("SELECT name, loc FROM t WHERE id=@id", conn)) {
        cmd.Parameters.AddWithValue("@id", id);
        conn.Open();
        using (var reader = cmd.ExecuteReader())
        {
            int nameOrdinal = reader.GetOrdinal("name");
            int locationOrdinal = reader.GetOrdinal("loc");
            while (reader.Read()) {
                Console.WriteLine("Name = {0}, Location = {1}",
                    reader.GetString(nameOrdinal),
                    reader.GetString(locationOrdinal));
            }
        }
    }
}

【讨论】:

  • 好吧,你可以ExecuteNonQuery用于使用returnoutref的东西,但不可否认,这样做是很不寻常的; p
  • @MarcGravell:添加了说明。
【解决方案3】:

您需要使用SqlDataAdapter 填写SqlDatareader 或DataSet/DataTable 中的记录。目前您正在使用ExecuteNonQuery,它通常用于INSERT/UPDATE 语句。

DataTable dt = new DataTable();
using (SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
    using (SqlCommand cmd = new SqlCommand("SELECT something FROM table"))
    {
        cmd.CommandType = CommandType.Text;
        cmd.Connection = connection;
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(dt);
    }
}

这将返回您在DataTable 中的查询结果。

如果您想在List<string> 中返回结果(因为您从表中请求单个列,并且很可能会有多行) 您可以这样做:

List<string> returnedList = new List<string>();
using (SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
    using (SqlCommand cmd = new SqlCommand("SELECT something FROM table"))
    {
        cmd.CommandType = CommandType.Text;
        cmd.Connection = connection;
        connection.Open();
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                returnedList.Add(Convert.ToString(reader["something"]));
            }
        }
    }
}

然后要获得一个字符串,您可以这样做:

string singleString = string.Join(Environment.NewLine, returnedList);

【讨论】:

  • 我想不出任何充分的理由让SqlDataAdapterDataTable 仅仅为了阅读string...实际上,我几乎没有想到任何涉及SqlDataAdapterDataTable 的充分理由完全(警告:好的,很少有涉及元编程和未知数据的理由)
  • @MarcGravell,只是试图表明返回的记录可能是一个集合。添加了一个示例以返回 List&lt;string&gt;
  • 我也不确定 OP 是否真的需要从他/她的查询中返回一个字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 2013-07-26
相关资源
最近更新 更多