如何将 SQL 查询结果存储到字符串变量中?

8

我想在C#的字符串变量或字符串数组中获取SQL结果,这是可能的吗?需要以某种方式使用SqlDataReader吗? 我非常新于C#函数等方面的工作,之前一直在PHP上工作,因此如果可以,请给出一个工作示例(如果相关的话,我已经连接并访问数据库,并插入和选择..我只是不知道如何将结果存储在字符串变量中)。


1
这是一个SELECT语句吗?顺便说一下,“请给出一个可行的示例”不是一个好的提问方式。请阅读[FAQ]和[ask]。 - Soner Gönül
是的。它是“SELECT email FROM table1”。 - Vantalk
5个回答

10

这不是历史上最好的例子,如果你从数据库中没有返回任何行,你会遇到异常,但如果你想要使用数据库中的存储过程,而不是直接从代码中运行SELECT语句,那么这将允许您返回一个字符串:

public string StringFromDatabase()
    {
        SqlConnection connection = null;

        try
        {
            var dataSet = new DataSet();

            connection = new SqlConnection("Your Connection String Goes Here");
            connection.Open();

            var command = new SqlCommand("Your Stored Procedure Name Goes Here", connection)
            {
                CommandType = CommandType.StoredProcedure
            };

            var dataAdapter = new SqlDataAdapter { SelectCommand = command };

            dataAdapter.Fill(dataSet);

            return dataSet.Tables[0].Rows[0]["Item"].ToString();
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message, ex);
        }
        finally
        {
            if (connection != null)
            {
                connection.Close();
            }
        }
    }

它肯定可以被改进,但如果您想采用存储过程方法,它将为您提供一个起点。


这不是历史上最伟大的评论,但为了避免在返回零行时抛出异常,你可以在访问任何行之前添加条件dataSet.Tables[0].Rows.Count > 0 :) - Albus_Dalbador

4

试一下这个:

SqlConnection con=new SqlConnection("/*connection string*/");               
SqlCommand SelectCommand = new SqlCommand("SELECT email FROM table1", con);
SqlDataReader myreader;
con.Open();

myreader = SelectCommand.ExecuteReader();

List<String> lstEmails=new List<String>();
while (myreader.Read())
 {
    lstEmails.Add(myreader[0].ToString());
    //strValue=myreader["email"].ToString();
    //strValue=myreader.GetString(0);
 }
con.Close();

从列表中访问电子邮件
lstEmails[0]->第一个电子邮件
lstEmails[1]->第二个电子邮件

...等等。


似乎工作正常,但结果被连接在一起了。(strValue[0]返回的是第一个字母而不是第一个值)猜想我需要一个分隔符或者其他什么东西吗? - Vantalk
@Vantalk:请查看我编辑后的答案,其中包含列表lstEmails,可用于添加所有电子邮件。 - Sudhakar Tillapudi
我尝试了编辑后的版本并使用 Console.Write(lstEmails) 进行打印,但它不会返回任何值,只是重复显示:System.Collections.Generic.List`1[System.String]。 - Vantalk

2

您可以使用 SQL 数据读取器

string sql = "SELECT email FROM Table WHERE Field = @Parameter";
string variable;
using (var connection = new SqlConnection("Your Connection String"))
using (var command = new SqlCommand(sql, connection))
{
    command.Parameters.AddWithValue("@Parameter", someValue);
    connection.Open();
    using (var reader = command.ExecuteReader())
    {
        //Check the reader has data:
        if (reader.Read())
        {
            variable = reader.GetString(reader.GetOrdinal("Column"));
        }
        // If you need to use all rows returned use a loop:
        while (reader.Read())
        {
            // Do something
        }
    }
}

Or you could use SqlCommand.ExecuteScalar()

string sql = "SELECT email FROM Table WHERE Field = @Parameter";
string variable;
using (var connection = new SqlConnection("Your Connection String"))
using (var command = new SqlCommand(sql, connection))
{
    command.Parameters.AddWithValue("@Parameter", someValue);
    connection.Open();
    variable = (string)command.ExecuteScalar();
}

0

试试这个:

public string SaveStringSQL(string pQuery, string ConnectionString)
{
    var connection = new Conexao(ConnectionString);
    connection.Open();

    SqlCommand command = new SqlCommand(pQuery, connection.Connection);
    var SavedString = (string)command.ExecuteScalar();

    connection.Close();

    return SavedString;
}

ExecuteScalar 函数可以保存数据库中的任何类型数据 - 您只需要指定它。

请记住,它一次只能保存一行。


请注意,返回的字符串最大限制为2033个字符。 - nam

0

这可能对你的MySQL有所帮助

MySqlDataReader reader = mycommand.ExecuteReader();
while (reader.Read())
{
  TextBox2.Text = reader.ToString();
}

对于 SQL

using (SqlCommand command = new SqlCommand("*SELECT QUERY HERE*", connection))
{
//
// Invoke ExecuteReader method.
//
SqlDataReader reader = command.ExecuteReader();
    while (reader.Read())
    {
        TextBox2.Text = reader.GetString(0);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接