繁体   English   中英

执行多于一列的选择并分配给标签

[英]Execute Select with more than one column and assign to Labels

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

这个想法是通过在选择的数据库上运行一个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的任何东西都是相当新的。

如果有任何重复的问题,我深表歉意,我们将不胜感激。

您可以使用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
    }
}

您只能创建一次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();
};

MSDN上官方的SqlCommand类文档中有很多示例。

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

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是我想要的。

这是一些有用的链接: 在没有数据的情况下,无效的读取尝试

以及以下内容: 多个SQL查询asp.net c#

希望任何有类似问题的人都能从中得到一些帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM