0

我正在研究一种能够运行 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 中轻松获取的数据。它返回到有价值数据的列的问题,我无法在谷歌中找到如何处理这个问题。(我可能正在寻找错误的东西)

我这样做只是因为我真的需要它来工作,现在我正在尝试清理所有东西。

只是提醒一下,对于 C# 或任何非 SQL 的东西来说都是新手。

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

4

3 回答 3

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
    }
}
于 2013-10-31T22:13:56.823 回答
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();
};

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

于 2013-10-31T22:09:15.693 回答
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 是我一直在寻找的。

这里有一个链接可以帮助很多东西:当没有数据存在时尝试读取无效

还有这个:Multiple SQL queries asp.net c#

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

于 2013-11-01T17:37:43.210 回答