【问题标题】:Getting a specified column's value based on the value in another column of the same row?根据同一行的另一列中的值获取指定列的值?
【发布时间】:2011-10-02 01:06:10
【问题描述】:

我有这个 SQL 表:

TABLE: Info

COLUMNS:|   Name   |  Value
--------|----------|------------------
ROW:    |   Server |  255.255.255.255
ROW:    |   Host   |  212.212.212.212
ROW:    |   User   |  Admin

我选择这样的表:SELECT * FROM Info

现在在我把所有东西都放在这张桌子上之后。

我想获取值Where Name = 'Server' 并将其放入Server 变量中。

在 C# 中最好的方法是什么?

数据集?数据阅读器?我怎样才能做到这一点?


如果您不明白我需要什么,请向 Tim 提供另一个很好的解释:

我正在尝试根据同一行的另一列中的值获取指定列的值

【问题讨论】:

  • 你的服务器变量是什么?一类?一个字符串?您是否试图根据同一记录的另一列中的值获取指定列的值?目前尚不清楚您要完成什么。
  • @Tim 他们都是 VarChar。 & 是的,我正在尝试根据同一记录(行)的另一列中的值获取指定列的值
  • 在您对@Kobe 的评论下方查看我的评论
  • 如果我理解正确,如果您查询表中的 Name = 'Server',您希望得到 Value = '255.255.255.255',对吗?如果是这样,请参阅我对@Kobe 回答的评论。
  • @Tim 不,你不对,我的查询是SELECT * FROM Info。我需要在string Server中保存'255.255.255.255'。

标签: c# .net sql select dataset


【解决方案1】:

根据您最新的 cmets,您似乎希望获取表中的所有行,然后能够根据 Name 列选择给定行。

如果您的程序需要在不同时间访问不同的行,则最好使用 DataTable - 只要 DataTable 在内存/缓存中,您就可以随时提取任何名称的值。

如果您只需要执行一次,SqlDataReader 可能会更快,但它只能向前。

数据表示例:

假设您已经填写了 DataTable(示例中的名称信息),您可以使用 Select 方法:

DataRow[] selectedRows = info.Select("Name = 'Server'");

string serverIP = selectedRows[0]["Value"].ToString();

日期读取器示例:

根据@Kobe 的代码,每次前进到下一条记录时只需检查名称,然后将值拉出:

bool valueFound = false;

while (reader.Read() && !valueFound)
{
    if (reader["Name"].ToString() == "Server")
    {
       serverIP = reader["Value"].ToString();
       valueFound = true;
    }
 }

有一些注意事项需要注意。首先,DataTable 的 Select 方法返回一个 DataRow 数组,因此如果多个记录的 Name 列中有“Server”,则会得到多个结果。如果这是设计使然,那很好 - 只需遍历 DataRows 数组即可。

其次,如果表中有很多行,或者未来有可能,阅读器可能会变慢,具体取决于感兴趣的记录在表中的位置。如果您正在处理表中可能有多个记录与名称条件匹配,那么坚持使用 DataTable 可能更容易。

【讨论】:

  • 谢谢 :) 我没有使用“WHERE”子句,因为我想从 SQL 获取 1 个命令(1 个请求)中的所有信息。
【解决方案2】:

这是你要找的吗,如果是,请告诉我,我将使用 USING 关键字优化代码并删除 sql 内联并尽快给你一个答案

另一个来自谷歌的例子,

// instantiate and open connection
            conn =  new 
                SqlConnection("Server=(local);DataBase=Northwind;Integrated Security=SSPI");
            conn.Open();

            // don't ever do this!
//          SqlCommand cmd = new SqlCommand(
//              "select * from Customers where city = '" + inputCity + "'";

            // 1. declare command object with parameter
            SqlCommand cmd = new SqlCommand(
                "select * from Customers where city = @City", conn);

            // 2. define parameters used in command object
            SqlParameter param  = new SqlParameter();
            param.ParameterName = "@City";
            param.Value         = inputCity;

            // 3. add new parameter to command object
            cmd.Parameters.Add(param);

            // get data stream
            reader = cmd.ExecuteReader();

            // write each record
            while(reader.Read())
            {
                Console.WriteLine("{0}, {1}", 
                    reader["CompanyName"], 
                    reader["ContactName"]);
            }
        }
        finally
        {
            // close reader
            if (reader != null)
            {
                reader.Close();
            }

            // close connection
            if (conn != null)
            {
                conn.Close();
            }
        }

其他例子...

SqlCommand sqlComm = new SqlCommand("SELECT * FROM Info where name='+server+'", sqlConn);
    SqlDataReader r = sqlComm.ExecuteReader();
    while ( r.Read() ) {
        string name = (string)r["Name"];
        Debug.WriteLine(username + "(" + userID + ")");
    }
    r.Close();

【讨论】:

  • 我知道该怎么做。但我想在 1 个查询中获取所有值。
  • 如果您想要该记录中的所有值,只需为每列添加额外的行 - 即 string server = (string)r["Server"];字符串主机=(字符串)r[“主机”]; r.Read() 前进到结果集中的下一条记录,您可以使用普通 C# 语法(r[]) 访问该记录中的每一列
  • 你还是不明白,看看我的新解释。我没有“服务器”列,“服务器”是 VALUE
  • 我明白了 - 我只是没有发现 Name 和 Value 是您原始帖子中的列标题。我上面的评论仍然有效 - 您可以从当前 SqlDataReader 行中获取任何列的任何值 - 只需通过名称或序号告诉读者您想要什么列。
  • @Tim 你能添加一个答案让我看看我该怎么做吗?我知道如何在一个空间行上获取一个 coulmn 值,但是我怎样才能在同一行上获得一个不同的 coulmn 值作为另一个空间 coulmn 值?
猜你喜欢
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
  • 2018-06-10
  • 2022-06-11
相关资源
最近更新 更多