使用多个列执行选择并分配给标签

时间:2013-10-31 22:01:39

标签: c# .net sql winforms

我正在研究一种能够运行SELECT语句的方法,该语句将多个值返回到我的应用程序上的两个不同标签中。

这个想法是通过在选择的数据库上运行选择来从数据库中获取一些版本信息,我得到了代码可以工作,但我知道它非常草率,我只是不确定如何清理它。我知道必须有比我在这里发生的更好的方式。

// Update Version & Version2         
        string sqlCom1 = String.Format(@"SELECT [Version] 
                                            FROM ConfigSystem");
        string sqlCom = String.Format(@"SELECT Version2 
                                            FROM ConfigSystem");

        SqlConnectionStringBuilder ConnectionString = new SqlConnectionStringBuilder();
        ConnectionString.DataSource = "SQL06";
        ConnectionString.InitialCatalog = "SuperSweetDB";
        ConnectionString.IntegratedSecurity = true;

        SqlConnection cnn;
        cnn = new SqlConnection(ConnectionString.ToString());


        using (var version = new SqlCommand(sqlCom1, cnn))
        {
             cnn.Open();
             label.Text = (string)version.ExecuteScalar();
             cnn.Close();
        };
        using (var version = new SqlCommand(sqlCom, cnn))
        {
            cnn.Open();
            label2.Text = (string)version.ExecuteScalar();
        };

,我不确定,我正在打开连接以获取我可以轻松获取SQL的数据。它返回到值列数据的问题,我无法在Google中找到它如何处理这个问题。 (我可能正在寻找错误的东西)

我只是这样做,因为我真的需要它才能工作,现在我正在努力清理一切。

只是一个抬头,相当新的C#或任何不是SQL的东西。

任何帮助表示赞赏,如果这是一个重复的问题,我道歉。

3 个答案:

答案 0 :(得分:1)

您可以使用1个字符串变量中的分号分隔2个SQL语句,然后使用SqlDataReader上的NextResult()方法获取多个结果集。

我更新了您的代码。见下文。请注意,使用using关键字会在代码执行后自动释放资源。我在2个sql语句中使用SQL Server内置变量测试了代码,这些语句被注释。

您应该能够在控制台应用中粘贴以下代码并成功运行。

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;

namespace SqlMultipleResultsets
{
    class Program
    {
        static void Main(string[] args)
        {
        SqlConnectionStringBuilder ConnectionString = new SqlConnectionStringBuilder();
        ConnectionString.DataSource = "SQL06";
        ConnectionString.InitialCatalog = "SuperSweetDB";

        //ConnectionString.DataSource = "(localdb)\\Projects";
        //ConnectionString.InitialCatalog = "tempdb";

        ConnectionString.IntegratedSecurity = true;

        string sqlSelect = @"SELECT [Version] FROM ConfigSystem;" +
                            @"SELECT Version2 FROM ConfigSystem";

        // string sqlSelect = @"SELECT [Version] = @@VERSION;"
        //                    + @"SELECT Version2 = @@LANGUAGE;" ;

            int recordCount;

            using (SqlConnection cnn = new SqlConnection(ConnectionString.ToString()))
            {
                using (SqlCommand command = new SqlCommand(sqlSelect, cnn))
                {
                    cnn.Open( );
                    SqlDataReader dr = command.ExecuteReader( );

                    recordCount = 0;
                    do
                    {
                        Console.WriteLine("Result set: {0}", ++recordCount);
                        while (dr.Read( ))
                        {
                            Console.WriteLine("Version: {0}", dr[0]);
                        }
                        Console.WriteLine(Environment.NewLine);
                    } 
                    while (dr.NextResult( ));                    
                }   // END command
            }   // END connection
            Console.Write("Press a key to exit...");
            Console.ReadKey();
        } // END Main
    }
}

答案 1 :(得分:0)

您只能创建一次SqlCommand并重复使用它 - 您可以动态设置命令:

using (var version = new SqlCommand())
{
    version.CommandType = CommandType.Text;
    version.Connection = cnn;

    cnn.Open();
    version.CommandText = sqlCom1;
    label.Text = (string)version.ExecuteScalar();

    version.CommandText = sqlCom2;
    label2.Text = (string)version.ExecuteScalar();
    cnn.Close();
};

官方SqlCommand class documentation at MSDN中有很多例子。

答案 2 :(得分:0)

以下是我提出的答案,以防将来有人需要帮助:

string sqlCom = String.Format(@"SELECT [Version],version2 FROM ConfigSystem");
        SqlConnectionStringBuilder ConnectionString = new SqlConnectionStringBuilder();
        ConnectionString.DataSource = SQL06;
        ConnectionString.InitialCatalog = "SuperSweetdb";
        ConnectionString.IntegratedSecurity = true;

        SqlConnection cnn = new SqlConnection(ConnectionString.ToString());

        using (var version = new SqlCommand(sqlCom, cnn))
        {           
            cnn.Open();

            using(IDataReader dataReader = version.ExecuteReader()) 
            {
                while (dataReader.Read())
                {
                    label7.Text = dataReader["Version"].ToString();
                    label9.Text = dataReader["VertexDataVersion"].ToString();
                }
            }

        };   

我最终做的是用datareader打破它。这有点难以弄清楚,需要大量的修修补补,但最终它是一个更清晰的连接,在我拥有之前。

基本上DataReader就是我想要的。

这是一个指向某些内容的链接:Invalid attempt to read when no data is present

以及:Multiple SQL queries asp.net c#

希望任何有类似问题的人都可以从中获得帮助。